From 0861ac5a42006c1aabcaee7b3e666e1faf4d5ce3 Mon Sep 17 00:00:00 2001 From: Pavel Bludov Date: Thu, 12 Jul 2018 13:12:56 +0800 Subject: Issue #5207: LITERAL_CASE and LITERAL_DEFAULT in LeftCurlyCheck --- .../checkstyle/checks/blocks/LeftCurlyCheck.java | 34 +++++++++-- .../checks/blocks/LeftCurlyCheckTest.java | 37 ++++++++++++ .../blocks/leftcurly/InputLeftCurlyEolSwitch.java | 70 ++++++++++++++++++++++ .../blocks/leftcurly/InputLeftCurlyNlSwitch.java | 56 +++++++++++++++++ .../blocks/leftcurly/InputLeftCurlyNlowSwitch.java | 53 ++++++++++++++++ src/xdocs/config_blocks.xml | 8 +++ 6 files changed, 252 insertions(+), 6 deletions(-) create mode 100644 src/test/resources/com/puppycrawl/tools/checkstyle/checks/blocks/leftcurly/InputLeftCurlyEolSwitch.java create mode 100644 src/test/resources/com/puppycrawl/tools/checkstyle/checks/blocks/leftcurly/InputLeftCurlyNlSwitch.java create mode 100644 src/test/resources/com/puppycrawl/tools/checkstyle/checks/blocks/leftcurly/InputLeftCurlyNlowSwitch.java diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/blocks/LeftCurlyCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/blocks/LeftCurlyCheck.java index 62df1d49f..fc599888c 100644 --- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/blocks/LeftCurlyCheck.java +++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/blocks/LeftCurlyCheck.java @@ -36,7 +36,9 @@ import com.puppycrawl.tools.checkstyle.utils.CommonUtil; *

* By default the following tokens are checked: * {@link TokenTypes#LAMBDA LAMBDA}, + * {@link TokenTypes#LITERAL_CASE LITERAL_CASE}, * {@link TokenTypes#LITERAL_CATCH LITERAL_CATCH}, + * {@link TokenTypes#LITERAL_DEFAULT LITERAL_DEFAULT}, * {@link TokenTypes#LITERAL_DO LITERAL_DO}, * {@link TokenTypes#LITERAL_ELSE LITERAL_ELSE}, * {@link TokenTypes#LITERAL_FINALLY LITERAL_FINALLY}, @@ -48,6 +50,7 @@ import com.puppycrawl.tools.checkstyle.utils.CommonUtil; * {@link TokenTypes#LITERAL_WHILE LITERAL_WHILE}, * {@link TokenTypes#STATIC_INIT STATIC_INIT}. *

+ * *

* The policy to verify is specified using the {@link LeftCurlyOption} class and * defaults to {@link LeftCurlyOption#EOL}. @@ -145,7 +148,9 @@ public class LeftCurlyCheck TokenTypes.ENUM_DEF, TokenTypes.INTERFACE_DEF, TokenTypes.LAMBDA, + TokenTypes.LITERAL_CASE, TokenTypes.LITERAL_CATCH, + TokenTypes.LITERAL_DEFAULT, TokenTypes.LITERAL_DO, TokenTypes.LITERAL_ELSE, TokenTypes.LITERAL_FINALLY, @@ -205,12 +210,12 @@ public class LeftCurlyCheck break; case TokenTypes.LITERAL_ELSE: startToken = ast; - final DetailAST candidate = ast.getFirstChild(); - brace = null; - - if (candidate.getType() == TokenTypes.SLIST) { - brace = candidate; - } + brace = getBraceAsFirstChild(ast); + break; + case TokenTypes.LITERAL_CASE: + case TokenTypes.LITERAL_DEFAULT: + startToken = ast; + brace = getBraceAsFirstChild(ast.getNextSibling()); break; default: // ATTENTION! We have default here, but we expect case TokenTypes.METHOD_DEF, @@ -228,6 +233,23 @@ public class LeftCurlyCheck } } + /** + * Gets a SLIST if it is the first child of the AST. + * @param ast {@code DetailAST}. + * @return {@code DetailAST} if the first child is {@code TokenTypes.SLIST}, + * {@code null} otherwise. + */ + private static DetailAST getBraceAsFirstChild(DetailAST ast) { + DetailAST brace = null; + if (ast != null) { + final DetailAST candidate = ast.getFirstChild(); + if (candidate != null && candidate.getType() == TokenTypes.SLIST) { + brace = candidate; + } + } + return brace; + } + /** * Skip lines that only contain {@code TokenTypes.ANNOTATION}s. * If the received {@code DetailAST} diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/blocks/LeftCurlyCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/blocks/LeftCurlyCheckTest.java index a1b8b6ac7..a42dd2162 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/blocks/LeftCurlyCheckTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/blocks/LeftCurlyCheckTest.java @@ -307,6 +307,41 @@ public class LeftCurlyCheckTest extends AbstractModuleTestSupport { expected); } + @Test + public void testEolSwitch() throws Exception { + final DefaultConfiguration checkConfig = createModuleConfig(LeftCurlyCheck.class); + checkConfig.addAttribute("option", LeftCurlyOption.EOL.toString()); + final String[] expected = { + "14:13: " + getCheckMessage(MSG_KEY_LINE_PREVIOUS, "{", 13), + "18:13: " + getCheckMessage(MSG_KEY_LINE_PREVIOUS, "{", 13), + "25:13: " + getCheckMessage(MSG_KEY_LINE_PREVIOUS, "{", 13), + "39:13: " + getCheckMessage(MSG_KEY_LINE_PREVIOUS, "{", 13), + "44:13: " + getCheckMessage(MSG_KEY_LINE_PREVIOUS, "{", 13), + }; + verify(checkConfig, getPath("InputLeftCurlyEolSwitch.java"), expected); + } + + @Test + public void testNlSwitch() throws Exception { + final DefaultConfiguration checkConfig = createModuleConfig(LeftCurlyCheck.class); + checkConfig.addAttribute("option", LeftCurlyOption.NL.toString()); + final String[] expected = { + "16:21: " + getCheckMessage(MSG_KEY_LINE_NEW, "{", 21), + "48:14: " + getCheckMessage(MSG_KEY_LINE_NEW, "{", 14), + }; + verify(checkConfig, getPath("InputLeftCurlyNlSwitch.java"), expected); + } + + @Test + public void testNlowSwitch() throws Exception { + final DefaultConfiguration checkConfig = createModuleConfig(LeftCurlyCheck.class); + checkConfig.addAttribute("option", LeftCurlyOption.NLOW.toString()); + final String[] expected = { + "14:13: " + getCheckMessage(MSG_KEY_LINE_PREVIOUS, "{", 13), + }; + verify(checkConfig, getPath("InputLeftCurlyNlowSwitch.java"), expected); + } + @Test public void testGetAcceptableTokens() { final LeftCurlyCheck check = new LeftCurlyCheck(); @@ -319,7 +354,9 @@ public class LeftCurlyCheckTest extends AbstractModuleTestSupport { TokenTypes.ENUM_DEF, TokenTypes.INTERFACE_DEF, TokenTypes.LAMBDA, + TokenTypes.LITERAL_CASE, TokenTypes.LITERAL_CATCH, + TokenTypes.LITERAL_DEFAULT, TokenTypes.LITERAL_DO, TokenTypes.LITERAL_ELSE, TokenTypes.LITERAL_FINALLY, diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/blocks/leftcurly/InputLeftCurlyEolSwitch.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/blocks/leftcurly/InputLeftCurlyEolSwitch.java new file mode 100644 index 000000000..1306df69c --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/blocks/leftcurly/InputLeftCurlyEolSwitch.java @@ -0,0 +1,70 @@ +package com.puppycrawl.tools.checkstyle.checks.blocks.leftcurly; +/** + * This test-input is intended to be checked using following configuration: + * + * option = EOL + * + */ +public class InputLeftCurlyEolSwitch { + + public void doStuff() { + int x = 1; + switch (x) { + case 0: + { // warn + break; + } + case (1+0): + { // warn + break; + } + case 2: { + break; + } + default: + { // warn + break; + } + case 3: + case 4: + x++; + { // OK, standalone block + } + break; + case 5: { + } + break; + case (5 + +1): + { // warn + break; + } + case 7 + : + { // warn + break; + } + } + switch (x) { + case 0: { + break; + } + default: + // do nothing + } + } + + public @interface SomeAnnotation { + + String value() default ""; + + } + + public interface SomeInterface { + + default String method() { + return null; + } + } + +} diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/blocks/leftcurly/InputLeftCurlyNlSwitch.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/blocks/leftcurly/InputLeftCurlyNlSwitch.java new file mode 100644 index 000000000..48f853292 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/blocks/leftcurly/InputLeftCurlyNlSwitch.java @@ -0,0 +1,56 @@ +package com.puppycrawl.tools.checkstyle.checks.blocks.leftcurly; +/** + * This test-input is intended to be checked using following configuration: + * + * option = NL + * + */ +public class InputLeftCurlyNlSwitch +{ + + public void doStuff() + { + int x = 1; + switch (x) + { + case 0: { // warn + break; + } + case (1 + + 0): + { + break; + } + case 2: + { + break; + } + default + : + { + break; + } + case 3: + case 4: + x++; { // OK, standalone block + } + break; + case 5: + { + x++; + } + x++; + break; + } + switch (x) + { + case 0 + :{ // warn + break; + } + default: + // do nothing + } + } + +} diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/blocks/leftcurly/InputLeftCurlyNlowSwitch.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/blocks/leftcurly/InputLeftCurlyNlowSwitch.java new file mode 100644 index 000000000..92742fb9a --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/blocks/leftcurly/InputLeftCurlyNlowSwitch.java @@ -0,0 +1,53 @@ +package com.puppycrawl.tools.checkstyle.checks.blocks.leftcurly; +/** + * This test-input is intended to be checked using following configuration: + * + * option = NLOW + * + */ +public class InputLeftCurlyNlowSwitch { + + public void doStuff() { + int x = 1; + switch (x) { + case 0: + { // warn + break; + } + case (1 + + 0): + { // OK, wrapped line + break; + } + case 2: { + break; + } + default + : + { // OK, wrapped line + break; + } + case 3: + case 4: + x++; + { // OK, standalone block + } + break; + case 5: { + x++; + } + x++; + break; + } + switch (x) { + case + 0: + { // OK, wrapped line + break; + } + default: + // do nothing + } + } + +} diff --git a/src/xdocs/config_blocks.xml b/src/xdocs/config_blocks.xml index 5f79c3e71..8a34f0a97 100644 --- a/src/xdocs/config_blocks.xml +++ b/src/xdocs/config_blocks.xml @@ -528,8 +528,12 @@ try { INTERFACE_DEF, LAMBDA, + + LITERAL_CASE, LITERAL_CATCH, + + LITERAL_DEFAULT, LITERAL_DO, @@ -571,8 +575,12 @@ try { INTERFACE_DEF, LAMBDA, + + LITERAL_CASE, LITERAL_CATCH, + + LITERAL_DEFAULT, LITERAL_DO, -- cgit v1.2.3