From c9b625bcf0e456e4f9cc99a249860129cdae3df4 Mon Sep 17 00:00:00 2001 From: Andrei Selkin Date: Wed, 4 Nov 2015 23:11:52 +0300 Subject: [PATCH] Issue #2290: Add 'ignoreOverridden' option to skip methods with @Override annotation --- .../checks/naming/ParameterNameCheck.java | 53 ++++++++++++++++++- .../checks/naming/ParameterNameCheckTest.java | 35 ++++++++++++ .../naming/InputOverrideAnnotation.java | 16 ++++++ src/xdocs/config_naming.xml | 25 +++++++++ 4 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/InputOverrideAnnotation.java diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/naming/ParameterNameCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/naming/ParameterNameCheck.java index 862bd5489..9152f7063 100644 --- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/naming/ParameterNameCheck.java +++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/naming/ParameterNameCheck.java @@ -30,6 +30,9 @@ import com.puppycrawl.tools.checkstyle.api.TokenTypes; * and defaults to * ^[a-z][a-zA-Z0-9]*$. *

+ *

The check has the following option:

+ *

ignoreOverridden - allows to skip methods with Override annotation from + * validation. Default values is false .

*

* An example of how to configure the check is: *

@@ -45,11 +48,27 @@ import com.puppycrawl.tools.checkstyle.api.TokenTypes; * <property name="format" value="^^[a-z](_?[a-zA-Z0-9]+)*$"/> * </module> * + *

+ * An example of how to configure the check to skip methods with Override annotation from + * validation: + *

+ *
+ * <module name="ParameterName">
+ *    <property name="ignoreOverridden" value="true"/>
+ * </module>
+ * 
* * @author Oliver Burn + * @author Andrei Selkin */ public class ParameterNameCheck extends AbstractNameCheck { + + /** + * Allows to skip methods with Override annotation from validation. + */ + private boolean ignoreOverridden; + /** * Creates a new {@code ParameterNameCheck} instance. */ @@ -57,6 +76,15 @@ public class ParameterNameCheck super("^[a-z][a-zA-Z0-9]*$"); } + /** + * Sets whether to skip methods with Override annotation from validation. + * + * @param ignoreOverridden Flag for skipping methods with Override annotation. + */ + public void setIgnoreOverridden(boolean ignoreOverridden) { + this.ignoreOverridden = ignoreOverridden; + } + @Override public int[] getDefaultTokens() { return getAcceptableTokens(); @@ -74,6 +102,29 @@ public class ParameterNameCheck @Override protected boolean mustCheckName(DetailAST ast) { - return ast.getParent().getType() != TokenTypes.LITERAL_CATCH; + boolean checkName = true; + if (ignoreOverridden && isOverriddenMethod(ast) + || ast.getParent().getType() == TokenTypes.LITERAL_CATCH) { + checkName = false; + } + return checkName; + } + + /** + * Checks whether a method is annotated with Override annotation. + * @param ast method parameter definition token. + * @return true if a method is annotated with Override annotation. + */ + private static boolean isOverriddenMethod(DetailAST ast) { + boolean overridden = false; + final DetailAST parent = ast.getParent().getParent(); + final DetailAST annotation = parent.getFirstChild().getFirstChild(); + if (annotation.getType() == TokenTypes.ANNOTATION) { + final DetailAST overrideToken = annotation.findFirstToken(TokenTypes.IDENT); + if ("Override".equals(overrideToken.getText())) { + overridden = true; + } + } + return overridden; } } diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/ParameterNameCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/ParameterNameCheckTest.java index c0bbc3860..e595e4999 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/ParameterNameCheckTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/ParameterNameCheckTest.java @@ -92,4 +92,39 @@ public class ParameterNameCheckTest }; assertArrayEquals(expected, actual); } + + @Test + public void testSkipMethodsWithOverrideAnnotationTrue() + throws Exception { + final DefaultConfiguration checkConfig = + createCheckConfig(ParameterNameCheck.class); + checkConfig.addAttribute("format", "^h$"); + checkConfig.addAttribute("ignoreOverridden", "true"); + + final String pattern = "^h$"; + + final String[] expected = { + "11:28: " + getCheckMessage(MSG_INVALID_PATTERN, "object", pattern), + "15:30: " + getCheckMessage(MSG_INVALID_PATTERN, "aaaa", pattern), + }; + verify(checkConfig, getPath("InputOverrideAnnotation.java"), expected); + } + + @Test + public void testSkipMethodsWithOverrideAnnotationFalse() + throws Exception { + final DefaultConfiguration checkConfig = + createCheckConfig(ParameterNameCheck.class); + checkConfig.addAttribute("format", "^h$"); + checkConfig.addAttribute("ignoreOverridden", "false"); + + final String pattern = "^h$"; + + final String[] expected = { + "6:34: " + getCheckMessage(MSG_INVALID_PATTERN, "o", pattern), + "11:28: " + getCheckMessage(MSG_INVALID_PATTERN, "object", pattern), + "15:30: " + getCheckMessage(MSG_INVALID_PATTERN, "aaaa", pattern), + }; + verify(checkConfig, getPath("InputOverrideAnnotation.java"), expected); + } } diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/InputOverrideAnnotation.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/InputOverrideAnnotation.java new file mode 100644 index 000000000..82d99508a --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/InputOverrideAnnotation.java @@ -0,0 +1,16 @@ +package com.puppycrawl.tools.checkstyle.checks.naming; + +public class InputOverrideAnnotation { + + @Override + public boolean equals(Object o) { + return super.equals(o); + } + + @SuppressWarnings("") + public void foo(Object object) { + + } + + public void foo2(Integer aaaa) {} +} diff --git a/src/xdocs/config_naming.xml b/src/xdocs/config_naming.xml index 9538fa385..25673e552 100644 --- a/src/xdocs/config_naming.xml +++ b/src/xdocs/config_naming.xml @@ -907,6 +907,22 @@ class MyClass { regular expression ^[a-z][a-zA-Z0-9]*$ + + ignoreOverridden + + Allows to skip methods with Override annotation from validation. For example, the + following method's parameter will be skipped from validation, if + ignoreOverridden is true: +
+@Override
+public boolean equals(Object o) {
+  return super.equals(o);
+}
+              
+ + Boolean + false + @@ -917,6 +933,15 @@ class MyClass { <module name="ParameterName"/> +

+ An example of how to configure the check to skip methods with Override annotation from + validation: +

+ +<module name="ParameterName"> + <property name="ignoreOverridden" value="true"/> +</module> +