Issue #5268: False RedundantModifier violation for final method of enum inside final class
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheck.java
index cc8d1b6..5db77a3 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheck.java
@@ -289,11 +289,11 @@
modifiers.findFirstToken(TokenTypes.LITERAL_PRIVATE) != null;
// declared in a final class?
DetailAST parent = ast.getParent();
- while (parent != null) {
+ while (parent != null && !checkFinal) {
if (parent.getType() == TokenTypes.CLASS_DEF) {
final DetailAST classModifiers =
parent.findFirstToken(TokenTypes.MODIFIERS);
- checkFinal = checkFinal || classModifiers.findFirstToken(TokenTypes.FINAL) != null;
+ checkFinal = classModifiers.findFirstToken(TokenTypes.FINAL) != null;
parent = null;
}
else if (parent.getType() == TokenTypes.LITERAL_NEW
@@ -301,6 +301,10 @@
checkFinal = true;
parent = null;
}
+ else if (parent.getType() == TokenTypes.ENUM_DEF) {
+ checkFinal = modifiers.findFirstToken(TokenTypes.LITERAL_STATIC) != null;
+ parent = null;
+ }
else {
parent = parent.getParent();
}
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheckTest.java
index 4d90731..53405d5 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/modifier/RedundantModifierCheckTest.java
@@ -232,6 +232,16 @@
}
@Test
+ public void testEnumStaticMethodsInPublicClass() throws Exception {
+ final DefaultConfiguration checkConfig = createModuleConfig(RedundantModifierCheck.class);
+ final String[] expected = {
+ "12:23: " + getCheckMessage(MSG_KEY, "final"),
+ };
+ verify(checkConfig,
+ getPath("InputRedundantModifierFinalInEnumStaticMethods.java"), expected);
+ }
+
+ @Test
public void testAnnotationOnEnumConstructor() throws Exception {
final DefaultConfiguration checkConfig = createModuleConfig(RedundantModifierCheck.class);
final String[] expected = {
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/modifier/redundantmodifier/InputRedundantModifierFinalInEnumStaticMethods.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/modifier/redundantmodifier/InputRedundantModifierFinalInEnumStaticMethods.java
new file mode 100644
index 0000000..0668729
--- /dev/null
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/modifier/redundantmodifier/InputRedundantModifierFinalInEnumStaticMethods.java
@@ -0,0 +1,16 @@
+package com.puppycrawl.tools.checkstyle.checks.modifier.redundantmodifier;
+
+public class InputRedundantModifierFinalInEnumStaticMethods {
+ public enum TestEnum {
+ VALUE {
+ @Override public void someMethodToOverride() {
+ // do it differently
+ }
+ };
+
+ public void someMethodToOverride() { }
+ public static final void someStaticMethod() { } //violation
+ public static void someMethod() { }
+ }
+}
+