From 767c9aae7981b49e8aa499001cda7aa40b3d80bb Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 5 Jan 2017 18:28:44 +0100 Subject: [PATCH 1/2] Bugfix singular field + lambda --- .../java/rule/design/SingularFieldRule.java | 7 ++++ .../java/rule/design/xml/SingularField.xml | 36 +++++++++++++++++++ 2 files changed, 43 insertions(+) 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 95022f6d09..3ec1760bc2 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 @@ -18,6 +18,7 @@ import net.sourceforge.pmd.lang.java.ast.ASTFieldDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTIfStatement; import net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTInitializer; +import net.sourceforge.pmd.lang.java.ast.ASTLambdaExpression; import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTName; import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression; @@ -148,6 +149,12 @@ public class SingularFieldRule extends AbstractJavaRule { break; //Optimization } + if (location.getFirstParentOfType(ASTLambdaExpression.class) != null) { + // This usage is inside a lambda expression + violation = false; + break; // Optimization + } + Node method = location.getFirstParentOfType(ASTMethodDeclaration.class); if (method == null) { method = location.getFirstParentOfType(ASTConstructorDeclaration.class); 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 626a48c15c..28c7f68d4c 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 @@ -569,4 +569,40 @@ public class MyClass { } ]]> + + + + lambda failure + 0 + { + // do nothing for now + }); + this.timer2 = new Timer(0, e -> { + // do nothing for now + }); + } + + /** Use a lambda expression to reference timer1 -- triggers SingularField error. */ + private final Runnable play1 = () -> { + this.timer1.start(); + }; + + /** Use an anonymous class to reference timer2 -- no error. */ + private final Runnable play2 = new Runnable() { + @Override + public void run() { + this.timer2.start(); + } + }; +} + ]]> + From af9d78c01a0c910fcb5e1a2e49c4bfd8275c46f2 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 6 Jan 2017 10:16:45 +0100 Subject: [PATCH 2/2] Update changelog --- .../sourceforge/pmd/lang/java/rule/design/xml/SingularField.xml | 2 +- src/site/markdown/overview/changelog.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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 28c7f68d4c..0b9495bc1d 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 @@ -572,7 +572,7 @@ public class MyClass { - lambda failure + #177 [java] SingularField with lambdas as final fields 0