diff options
author | Andrew Kuchev <0coming.soon@gmail.com> | 2017-03-02 18:23:18 +0500 |
---|---|---|
committer | Roman Ivanov <romani@users.noreply.github.com> | 2017-03-06 17:09:44 -0800 |
commit | e70836bb3dec30734f5fd51b63d4dc6cbe24679d (patch) | |
tree | f97424ab1dfd17d04510d8b9755545aa5c0bc011 /src | |
parent | b3cd54c7cdab80932c2ce97a9e705bdbc01b2861 (diff) | |
download | checkstyle-e70836bb3dec30734f5fd51b63d4dc6cbe24679d.tar.gz |
Issue #3329: Added lambda to ParenPad
Diffstat (limited to 'src')
9 files changed, 258 insertions, 6 deletions
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/whitespace/ParenPadCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/whitespace/ParenPadCheck.java index e152fd586..62a127da5 100644 --- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/whitespace/ParenPadCheck.java +++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/whitespace/ParenPadCheck.java @@ -61,6 +61,7 @@ import com.puppycrawl.tools.checkstyle.utils.CommonUtils; * {@link TokenTypes#RESOURCE_SPECIFICATION RESOURCE_SPECIFICATION}, * {@link TokenTypes#SUPER_CTOR_CALL SUPER_CTOR_CALL}, * {@link TokenTypes#QUESTION QUESTION}, + * {@link TokenTypes#LAMBDA LAMBDA}, * </p> * <p> * An example of how to configure the check is: @@ -131,7 +132,8 @@ public class ParenPadCheck extends AbstractParenPadCheck { case TokenTypes.ENUM_CONSTANT_DEF: case TokenTypes.LITERAL_NEW: case TokenTypes.LITERAL_SYNCHRONIZED: - visitNewEnumConstDefAnnotationSync(ast); + case TokenTypes.LAMBDA: + visitTokenWithOptionalParentheses(ast); break; default: processLeft(ast.findFirstToken(TokenTypes.LPAREN)); @@ -140,11 +142,13 @@ public class ParenPadCheck extends AbstractParenPadCheck { } /** - * Checks parens in {@link TokenTypes#ENUM_CONSTANT_DEF}, {@link TokenTypes#ANNOTATION} - * {@link TokenTypes#LITERAL_SYNCHRONIZED} and {@link TokenTypes#LITERAL_NEW}. + * Checks parens in token which may not contain parens, e.g. + * {@link TokenTypes#ENUM_CONSTANT_DEF}, {@link TokenTypes#ANNOTATION} + * {@link TokenTypes#LITERAL_SYNCHRONIZED}, {@link TokenTypes#LITERAL_NEW} and + * {@link TokenTypes#LAMBDA}. * @param ast the token to check. */ - private void visitNewEnumConstDefAnnotationSync(DetailAST ast) { + private void visitTokenWithOptionalParentheses(DetailAST ast) { final DetailAST parenAst = ast.findFirstToken(TokenTypes.LPAREN); if (parenAst != null) { processLeft(parenAst); @@ -229,6 +233,7 @@ public class ParenPadCheck extends AbstractParenPadCheck { TokenTypes.QUESTION, TokenTypes.RESOURCE_SPECIFICATION, TokenTypes.SUPER_CTOR_CALL, + TokenTypes.LAMBDA, }; } diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/whitespace/ParenPadCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/whitespace/ParenPadCheckTest.java index b80c6d78b..c0d402b45 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/whitespace/ParenPadCheckTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/whitespace/ParenPadCheckTest.java @@ -262,4 +262,103 @@ public class ParenPadCheckTest + "Cannot set property 'option' to 'invalid_option' in module")); } } + + @Test + public void testLambdaAssignment() throws Exception { + final DefaultConfiguration checkConfig = createCheckConfig(ParenPadCheck.class); + final String[] expected = { + "9:42: " + getCheckMessage(MSG_WS_FOLLOWED, "("), + "9:44: " + getCheckMessage(MSG_WS_PRECEDED, ")"), + "11:43: " + getCheckMessage(MSG_WS_PRECEDED, ")"), + "13:42: " + getCheckMessage(MSG_WS_FOLLOWED, "("), + "15:47: " + getCheckMessage(MSG_WS_FOLLOWED, "("), + "15:49: " + getCheckMessage(MSG_WS_PRECEDED, ")"), + "17:47: " + getCheckMessage(MSG_WS_FOLLOWED, "("), + "17:56: " + getCheckMessage(MSG_WS_PRECEDED, ")"), + "19:62: " + getCheckMessage(MSG_WS_FOLLOWED, "("), + "19:62: " + getCheckMessage(MSG_WS_PRECEDED, ")"), + "22:21: " + getCheckMessage(MSG_WS_FOLLOWED, "("), + "22:34: " + getCheckMessage(MSG_WS_PRECEDED, ")"), + }; + verify(checkConfig, getPath("InputParenPadLambda.java"), expected); + } + + @Test + public void testLambdaAssignmentWithSpace() throws Exception { + final DefaultConfiguration checkConfig = createCheckConfig(ParenPadCheck.class); + checkConfig.addAttribute("option", PadOption.SPACE.toString()); + final String[] expected = { + "9:42: " + getCheckMessage(MSG_WS_NOT_FOLLOWED, "("), + "9:43: " + getCheckMessage(MSG_WS_NOT_PRECEDED, ")"), + "11:42: " + getCheckMessage(MSG_WS_NOT_FOLLOWED, "("), + "13:44: " + getCheckMessage(MSG_WS_NOT_PRECEDED, ")"), + "15:48: " + getCheckMessage(MSG_WS_NOT_FOLLOWED, "("), + "15:49: " + getCheckMessage(MSG_WS_NOT_PRECEDED, ")"), + "17:48: " + getCheckMessage(MSG_WS_NOT_FOLLOWED, "("), + "17:56: " + getCheckMessage(MSG_WS_NOT_PRECEDED, ")"), + "22:21: " + getCheckMessage(MSG_WS_NOT_FOLLOWED, "("), + "22:33: " + getCheckMessage(MSG_WS_NOT_PRECEDED, ")"), + }; + verify(checkConfig, getPath("InputParenPadLambdaWithSpace.java"), expected); + } + + @Test + public void testLambdaCheckDisabled() throws Exception { + final DefaultConfiguration checkConfig = createCheckConfig(ParenPadCheck.class); + checkConfig.addAttribute("tokens", "EXPR, METHOD_CALL, METHOD_DEF"); + final String[] expected = { + "19:62: " + getCheckMessage(MSG_WS_FOLLOWED, "("), + "19:62: " + getCheckMessage(MSG_WS_PRECEDED, ")"), + "22:21: " + getCheckMessage(MSG_WS_FOLLOWED, "("), + "22:34: " + getCheckMessage(MSG_WS_PRECEDED, ")"), + }; + verify(checkConfig, getPath("InputParenPadWithDisabledLambda.java"), expected); + } + + @Test + public void testLambdaCheckDisabledWithSpace() throws Exception { + final DefaultConfiguration checkConfig = createCheckConfig(ParenPadCheck.class); + checkConfig.addAttribute("option", PadOption.SPACE.toString()); + checkConfig.addAttribute("tokens", "EXPR, METHOD_CALL, METHOD_DEF"); + final String[] expected = { + "22:21: " + getCheckMessage(MSG_WS_NOT_FOLLOWED, "("), + "22:33: " + getCheckMessage(MSG_WS_NOT_PRECEDED, ")"), + }; + verify(checkConfig, getPath("InputParenPadWithSpaceAndDisabledLambda.java"), expected); + } + + @Test + public void testLambdaCheckOnly() throws Exception { + final DefaultConfiguration checkConfig = createCheckConfig(ParenPadCheck.class); + checkConfig.addAttribute("tokens", "LAMBDA"); + final String[] expected = { + "9:42: " + getCheckMessage(MSG_WS_FOLLOWED, "("), + "9:44: " + getCheckMessage(MSG_WS_PRECEDED, ")"), + "11:43: " + getCheckMessage(MSG_WS_PRECEDED, ")"), + "13:42: " + getCheckMessage(MSG_WS_FOLLOWED, "("), + "15:47: " + getCheckMessage(MSG_WS_FOLLOWED, "("), + "15:49: " + getCheckMessage(MSG_WS_PRECEDED, ")"), + "17:47: " + getCheckMessage(MSG_WS_FOLLOWED, "("), + "17:56: " + getCheckMessage(MSG_WS_PRECEDED, ")"), + }; + verify(checkConfig, getPath("InputParenPadLambdaOnly.java"), expected); + } + + @Test + public void testLambdaCheckOnlyWithSpace() throws Exception { + final DefaultConfiguration checkConfig = createCheckConfig(ParenPadCheck.class); + checkConfig.addAttribute("option", PadOption.SPACE.toString()); + checkConfig.addAttribute("tokens", "LAMBDA"); + final String[] expected = { + "9:42: " + getCheckMessage(MSG_WS_NOT_FOLLOWED, "("), + "9:43: " + getCheckMessage(MSG_WS_NOT_PRECEDED, ")"), + "11:42: " + getCheckMessage(MSG_WS_NOT_FOLLOWED, "("), + "13:44: " + getCheckMessage(MSG_WS_NOT_PRECEDED, ")"), + "15:48: " + getCheckMessage(MSG_WS_NOT_FOLLOWED, "("), + "15:49: " + getCheckMessage(MSG_WS_NOT_PRECEDED, ")"), + "17:48: " + getCheckMessage(MSG_WS_NOT_FOLLOWED, "("), + "17:56: " + getCheckMessage(MSG_WS_NOT_PRECEDED, ")"), + }; + verify(checkConfig, getPath("InputParenPadLambdaOnlyWithSpace.java"), expected); + } } diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadLambda.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadLambda.java new file mode 100644 index 000000000..eeaa9c87b --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadLambda.java @@ -0,0 +1,24 @@ +package com.puppycrawl.tools.checkstyle.checks.whitespace; + +class InputParenPadLambda { + { + java.util.function.Consumer a = (o) -> { o.toString(); }; // ok + + java.util.function.Consumer b = o -> { o.toString(); }; // ok + + java.util.function.Consumer c = ( o ) -> { o.toString(); }; // 2 violations + + java.util.function.Consumer d = (o ) -> { o.toString(); }; // 1 violation + + java.util.function.Consumer e = ( o) -> { o.toString(); }; // 1 violation + + java.util.stream.Stream.of().forEach(( o ) -> o.toString()); // 2 violations + + java.util.stream.Stream.of().forEach(( Object o ) -> o.toString()); // 2 violations + + java.util.stream.Stream.of().forEach(o -> o.toString( )); // 2 violations + } + + void someMethod( String param ) { // 2 violations + } +} diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadLambdaOnly.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadLambdaOnly.java new file mode 100644 index 000000000..da6d2bb40 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadLambdaOnly.java @@ -0,0 +1,24 @@ +package com.puppycrawl.tools.checkstyle.checks.whitespace; + +public class InputParenPadLambdaOnly { + { + java.util.function.Consumer a = (o) -> { o.toString(); }; // ok + + java.util.function.Consumer b = o -> { o.toString(); }; // ok + + java.util.function.Consumer c = ( o ) -> { o.toString(); }; // 2 violations + + java.util.function.Consumer d = (o ) -> { o.toString(); }; // 1 violation + + java.util.function.Consumer e = ( o) -> { o.toString(); }; // 1 violation + + java.util.stream.Stream.of().forEach(( o ) -> o.toString()); // 2 violations + + java.util.stream.Stream.of().forEach(( Object o ) -> o.toString()); // 2 violations + + java.util.stream.Stream.of().forEach(o -> o.toString( )); // ok + } + + void someMethod( String param ) { // ok + } +} diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadLambdaOnlyWithSpace.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadLambdaOnlyWithSpace.java new file mode 100644 index 000000000..6a0c5e073 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadLambdaOnlyWithSpace.java @@ -0,0 +1,24 @@ +package com.puppycrawl.tools.checkstyle.checks.whitespace; + +class InputParenPadLambdaOnlyWithSpace { + { + java.util.function.Consumer a = ( o ) -> { o.toString( ); }; // ok + + java.util.function.Consumer b = o -> { o.toString(); }; // ok + + java.util.function.Consumer c = (o) -> { o.toString(); }; // 2 violations + + java.util.function.Consumer d = (o ) -> { o.toString(); }; // 1 violation + + java.util.function.Consumer e = ( o) -> { o.toString(); }; // 1 violation + + java.util.stream.Stream.of().forEach( (o) -> o.toString() ); // 2 violations + + java.util.stream.Stream.of().forEach( (Object o) -> o.toString() ); // 2 violations + + java.util.stream.Stream.of().forEach( o -> o.toString() ); // ok + } + + void someMethod(String param) { // ok + } +} diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadLambdaWithSpace.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadLambdaWithSpace.java new file mode 100644 index 000000000..5350b4185 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadLambdaWithSpace.java @@ -0,0 +1,24 @@ +package com.puppycrawl.tools.checkstyle.checks.whitespace; + +class InputParenPadLambdaWithSpace { + { + java.util.function.Consumer a = ( o ) -> { o.toString( ); }; // ok + + java.util.function.Consumer b = o -> { o.toString(); }; // ok + + java.util.function.Consumer c = (o) -> { o.toString(); }; // 2 violations + + java.util.function.Consumer d = (o ) -> { o.toString(); }; // 1 violation + + java.util.function.Consumer e = ( o) -> { o.toString(); }; // 1 violation + + java.util.stream.Stream.of().forEach( (o) -> o.toString() ); // 2 violations + + java.util.stream.Stream.of().forEach( (Object o) -> o.toString() ); // 2 violations + + java.util.stream.Stream.of().forEach( o -> o.toString() ); // ok + } + + void someMethod(String param) { // 2 violations + } +} diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadWithDisabledLambda.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadWithDisabledLambda.java new file mode 100644 index 000000000..1dccad6f4 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadWithDisabledLambda.java @@ -0,0 +1,24 @@ +package com.puppycrawl.tools.checkstyle.checks.whitespace; + +public class InputParenPadWithDisabledLambda { + { + java.util.function.Consumer a = (o) -> { o.toString(); }; // ok + + java.util.function.Consumer b = o -> { o.toString(); }; // ok + + java.util.function.Consumer c = ( o ) -> { o.toString(); }; // ok + + java.util.function.Consumer d = (o ) -> { o.toString(); }; // ok + + java.util.function.Consumer e = ( o) -> { o.toString(); }; // ok + + java.util.stream.Stream.of().forEach(( o ) -> o.toString()); // ok + + java.util.stream.Stream.of().forEach(( Object o ) -> o.toString()); // ok + + java.util.stream.Stream.of().forEach(o -> o.toString( )); // 2 violations + } + + void someMethod( String param ) { // 2 violations + } +} diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadWithSpaceAndDisabledLambda.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadWithSpaceAndDisabledLambda.java new file mode 100644 index 000000000..b8df6a97b --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/whitespace/InputParenPadWithSpaceAndDisabledLambda.java @@ -0,0 +1,24 @@ +package com.puppycrawl.tools.checkstyle.checks.whitespace; + +class InputParenPadWithSpaceAndDisabledLambda { + { + java.util.function.Consumer a = ( o ) -> { o.toString( ); }; // ok + + java.util.function.Consumer b = o -> { o.toString(); }; // ok + + java.util.function.Consumer c = (o) -> { o.toString(); }; // ok + + java.util.function.Consumer d = (o ) -> { o.toString(); }; // ok + + java.util.function.Consumer e = ( o) -> { o.toString(); }; // ok + + java.util.stream.Stream.of().forEach( (o) -> o.toString() ); // ok + + java.util.stream.Stream.of().forEach( (Object o) -> o.toString() ); // ok + + java.util.stream.Stream.of().forEach( o -> o.toString() ); // ok + } + + void someMethod(String param) { // 2 violations + } +} diff --git a/src/xdocs/config_whitespace.xml b/src/xdocs/config_whitespace.xml index 49513b772..f52e5ab69 100644 --- a/src/xdocs/config_whitespace.xml +++ b/src/xdocs/config_whitespace.xml @@ -1411,7 +1411,9 @@ import com.puppycrawl.tools.checkstyle.api.AbstractCheck; <a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#RESOURCE_SPECIFICATION">RESOURCE_SPECIFICATION</a>, <a - href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#SUPER_CTOR_CALL">SUPER_CTOR_CALL</a>. + href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#SUPER_CTOR_CALL">SUPER_CTOR_CALL</a>, + <a + href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LAMBDA">LAMBDA</a>. </td> <td> @@ -1452,7 +1454,9 @@ import com.puppycrawl.tools.checkstyle.api.AbstractCheck; <a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#RESOURCE_SPECIFICATION">RESOURCE_SPECIFICATION</a>, <a - href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#SUPER_CTOR_CALL">SUPER_CTOR_CALL</a>. + href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#SUPER_CTOR_CALL">SUPER_CTOR_CALL</a>, + <a + href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LAMBDA">LAMBDA</a>. </td> </tr> </table> |