diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md
index 2e8906b73f..2e6b92527b 100644
--- a/docs/pages/release_notes.md
+++ b/docs/pages/release_notes.md
@@ -25,6 +25,8 @@ This is a {{ site.pmd.release_type }} release.
* [#3614](https://github.com/pmd/pmd/issues/3614): \[java] JUnitTestsShouldIncludeAssert doesn't consider nested classes
* [#3618](https://github.com/pmd/pmd/issues/3618): \[java] UnusedFormalParameter doesn't consider anonymous classes
* [#3630](https://github.com/pmd/pmd/issues/3630): \[java] MethodReturnsInternalArray doesn't consider anonymous classes
+* java-design
+ * [#3620](https://github.com/pmd/pmd/issues/3620): \[java] SingularField doesn't consider anonymous classes defined in non-private fields
* java-errorprone
* [#3624](https://github.com/pmd/pmd/issues/3624): \[java] TestClassWithoutTestCases reports wrong classes in a file
* java-performance
diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SingularFieldRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SingularFieldRule.java
index e82d04763f..9c57f01a80 100644
--- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SingularFieldRule.java
+++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SingularFieldRule.java
@@ -74,16 +74,16 @@ public class SingularFieldRule extends AbstractLombokAwareRule {
boolean disallowNotAssignment = getProperty(DISALLOW_NOT_ASSIGNMENT);
if (!node.isPrivate() || node.isStatic()) {
- return data;
+ return super.visit(node, data);
}
if (hasClassLombokAnnotation() || hasIgnoredAnnotation(node)) {
- return data;
+ return super.visit(node, data);
}
// lombok.EqualsAndHashCode is a class-level annotation
if (hasIgnoredAnnotation((Annotatable) node.getFirstParentOfType(ASTAnyTypeDeclaration.class))) {
- return data;
+ return super.visit(node, data);
}
for (ASTVariableDeclarator declarator : node.findChildrenOfType(ASTVariableDeclarator.class)) {
@@ -194,7 +194,7 @@ public class SingularFieldRule extends AbstractLombokAwareRule {
addViolation(data, node, new Object[] { declaration.getImage() });
}
}
- return data;
+ return super.visit(node, data);
}
private boolean isInAssignment(Node potentialStatement) {
diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SwitchDensityRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SwitchDensityRule.java
index 3299c585d1..8567fef925 100644
--- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SwitchDensityRule.java
+++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SwitchDensityRule.java
@@ -51,7 +51,6 @@ public class SwitchDensityRule extends AbstractStatisticalJavaRule {
}
public SwitchDensityRule() {
- super();
setProperty(MINIMUM_DESCRIPTOR, 10d);
}
@@ -65,7 +64,7 @@ public class SwitchDensityRule extends AbstractStatisticalJavaRule {
SwitchDensity density = new SwitchDensity();
- node.childrenAccept(this, density);
+ super.visit(node, density);
DataPoint point = new DataPoint();
point.setNode(node);
@@ -86,9 +85,7 @@ public class SwitchDensityRule extends AbstractStatisticalJavaRule {
((SwitchDensity) data).addStatement();
}
- statement.childrenAccept(this, data);
-
- return data;
+ return super.visit(statement, data);
}
@Override
@@ -97,7 +94,6 @@ public class SwitchDensityRule extends AbstractStatisticalJavaRule {
((SwitchDensity) data).addSwitchLabel();
}
- switchLabel.childrenAccept(this, data);
- return data;
+ return super.visit(switchLabel, data);
}
}
diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/AvoidMultipleUnaryOperatorsRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/AvoidMultipleUnaryOperatorsRule.java
index be73e9f279..5ca3e3f5fb 100644
--- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/AvoidMultipleUnaryOperatorsRule.java
+++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/AvoidMultipleUnaryOperatorsRule.java
@@ -15,8 +15,8 @@ import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
public class AvoidMultipleUnaryOperatorsRule extends AbstractJavaRule {
public AvoidMultipleUnaryOperatorsRule() {
- super.addRuleChainVisit(ASTUnaryExpression.class);
- super.addRuleChainVisit(ASTUnaryExpressionNotPlusMinus.class);
+ addRuleChainVisit(ASTUnaryExpression.class);
+ addRuleChainVisit(ASTUnaryExpressionNotPlusMinus.class);
}
@Override
diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/AvoidUsingOctalValuesRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/AvoidUsingOctalValuesRule.java
index c91705bfe2..bf21173584 100644
--- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/AvoidUsingOctalValuesRule.java
+++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/AvoidUsingOctalValuesRule.java
@@ -27,6 +27,7 @@ public class AvoidUsingOctalValuesRule extends AbstractJavaRule {
public AvoidUsingOctalValuesRule() {
definePropertyDescriptor(STRICT_METHODS_DESCRIPTOR);
+ addRuleChainVisit(ASTLiteral.class);
}
@Override
diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CheckSkipResultRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CheckSkipResultRule.java
index 3b5710f780..bf12f843ee 100644
--- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CheckSkipResultRule.java
+++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/CheckSkipResultRule.java
@@ -19,6 +19,10 @@ import net.sourceforge.pmd.lang.symboltable.NameOccurrence;
public class CheckSkipResultRule extends AbstractJavaRule {
+ public CheckSkipResultRule() {
+ addRuleChainVisit(ASTVariableDeclaratorId.class);
+ }
+
@Override
public Object visit(ASTVariableDeclaratorId node, Object data) {
if (!TypeTestUtil.isA(InputStream.class, node.getTypeNode())) {
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/SingularField.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/SingularField.xml
index 4702f1dd2e..09496df92f 100644
--- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/SingularField.xml
+++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/SingularField.xml
@@ -7,16 +7,17 @@
failure case
1
+ 3
@@ -190,6 +191,7 @@ public class Foo {
Reuse variable name as params in method calls
1
+ 2
failure, static
1
+ 2
failure, second method re-uses class level name
1
+ 2
1409944, fields not used to synchronize should trigger
1
+ 3
Not ok, since inner classes are checked
true
1
+ 3
Not ok, violation with first usage = non-assignment
true
1
+ 2
multiple fields on same line
1
+ 2
[java] SingularField: Lombok false positive with annotated inner class
1
+ 9
+
+
+ failure case with anonymous class
+ 4
+ 4,13,20,23
+
+
diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/SwitchDensity.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/SwitchDensity.xml
index 8d3c5fc1e2..c1f09d441f 100644
--- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/SwitchDensity.xml
+++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/design/xml/SwitchDensity.xml
@@ -8,6 +8,7 @@
Five stmts in one switch case, should be flagged
4
1
+ 4
failure case
1
+ 8
failure case but obfuscated
1
+ 8