aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Bludov <pbludov@gmail.com>2018-07-12 13:12:56 +0800
committerRoman Ivanov <romani@users.noreply.github.com>2018-07-20 19:46:03 +0300
commit0861ac5a42006c1aabcaee7b3e666e1faf4d5ce3 (patch)
tree0a78fe76321ba2fa3cabdf9d70a070b7405c8ef0
parent43d92a1b06fc73e5296b3af4b646a1483ab77432 (diff)
downloadcheckstyle-0861ac5a42006c1aabcaee7b3e666e1faf4d5ce3.tar.gz
Issue #5207: LITERAL_CASE and LITERAL_DEFAULT in LeftCurlyCheck
-rw-r--r--src/main/java/com/puppycrawl/tools/checkstyle/checks/blocks/LeftCurlyCheck.java34
-rw-r--r--src/test/java/com/puppycrawl/tools/checkstyle/checks/blocks/LeftCurlyCheckTest.java37
-rw-r--r--src/test/resources/com/puppycrawl/tools/checkstyle/checks/blocks/leftcurly/InputLeftCurlyEolSwitch.java70
-rw-r--r--src/test/resources/com/puppycrawl/tools/checkstyle/checks/blocks/leftcurly/InputLeftCurlyNlSwitch.java56
-rw-r--r--src/test/resources/com/puppycrawl/tools/checkstyle/checks/blocks/leftcurly/InputLeftCurlyNlowSwitch.java53
-rw-r--r--src/xdocs/config_blocks.xml8
6 files changed, 252 insertions, 6 deletions
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;
* <p>
* 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}.
* </p>
+ *
* <p>
* 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,
@@ -229,6 +234,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}
* has annotations within its modifiers then first token on the line
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
@@ -308,6 +308,41 @@ public class LeftCurlyCheckTest extends AbstractModuleTestSupport {
}
@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();
final int[] actual = check.getAcceptableTokens();
@@ -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</a>,
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LAMBDA">
LAMBDA</a>,
+ <a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LITERAL_CASE">
+ LITERAL_CASE</a>,
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LITERAL_CATCH">
LITERAL_CATCH</a>,
+ <a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LITERAL_DEFAULT">
+ LITERAL_DEFAULT</a>,
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LITERAL_DO">
LITERAL_DO</a>,
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LITERAL_ELSE">
@@ -571,8 +575,12 @@ try {
INTERFACE_DEF</a>,
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LAMBDA">
LAMBDA</a>,
+ <a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LITERAL_CASE">
+ LITERAL_CASE</a>,
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LITERAL_CATCH">
LITERAL_CATCH</a>,
+ <a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LITERAL_DEFAULT">
+ LITERAL_DEFAULT</a>,
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LITERAL_DO">
LITERAL_DO</a>,
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LITERAL_ELSE">