diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/blocks/NeedBracesCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/blocks/NeedBracesCheck.java index 224a903e1..8ef7bc6bb 100644 --- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/blocks/NeedBracesCheck.java +++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/blocks/NeedBracesCheck.java @@ -282,12 +282,30 @@ public class NeedBracesCheck extends Check { } else if (literalFor.getParent().getType() == TokenTypes.SLIST && literalFor.getLastChild().getType() != TokenTypes.SLIST) { - final DetailAST block = literalFor.findFirstToken(TokenTypes.EXPR); + final DetailAST block = findExpressionBlockInForLoop(literalFor); result = literalFor.getLineNo() == block.getLineNo(); } return result; } + /** + * Detects and returns expression block in classical and enhanced for loops. + * + * @param literalFor parent for loop literal + * @return expression block + */ + private static DetailAST findExpressionBlockInForLoop(DetailAST literalFor) { + final DetailAST forEachClause = literalFor.findFirstToken(TokenTypes.FOR_EACH_CLAUSE); + final DetailAST firstToken; + if (forEachClause != null) { + firstToken = forEachClause.findFirstToken(TokenTypes.EXPR); + } + else { + firstToken = literalFor.findFirstToken(TokenTypes.EXPR); + } + return firstToken; + } + /** * Checks if current if statement is single-line statement, e.g.: *

diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/blocks/NeedBracesCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/blocks/NeedBracesCheckTest.java index 851a306d3..e1d35615e 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/blocks/NeedBracesCheckTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/blocks/NeedBracesCheckTest.java @@ -70,6 +70,7 @@ public class NeedBracesCheckTest extends BaseCheckTestSupport { "59: " + getCheckMessage(MSG_KEY_NEED_BRACES, "for"), "88: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"), "92: " + getCheckMessage(MSG_KEY_NEED_BRACES, "else"), + "104: " + getCheckMessage(MSG_KEY_NEED_BRACES, "if"), }; verify(checkConfig, getPath("InputBracesSingleLineStatements.java"), expected); } diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/InputBracesSingleLineStatements.java b/src/test/resources/com/puppycrawl/tools/checkstyle/InputBracesSingleLineStatements.java index 1711f5879..0a9c5c2c6 100644 --- a/src/test/resources/com/puppycrawl/tools/checkstyle/InputBracesSingleLineStatements.java +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/InputBracesSingleLineStatements.java @@ -92,4 +92,17 @@ public class InputBracesSingleLineStatements } else return 2; } + + void enhancedForLoop(int[] array) { + for (int value: array) return; + } + + int[] sourceLocators; + + private class StateInfo { + public boolean isInitial() { + for (int locator: sourceLocators) if (locator != 0) return false; + return true; + } + } }