diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/DeclarationFinderFunction.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/DeclarationFinderFunction.java new file mode 100644 index 0000000000..247b910e66 --- /dev/null +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/DeclarationFinderFunction.java @@ -0,0 +1,41 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ +package net.sourceforge.pmd.lang.java.symboltable; + +import net.sourceforge.pmd.lang.symboltable.NameDeclaration; +import net.sourceforge.pmd.lang.symboltable.NameOccurrence; +import net.sourceforge.pmd.util.UnaryFunction; + +public class DeclarationFinderFunction implements UnaryFunction { + + private NameOccurrence occurrence; + private NameDeclaration decl; + + public DeclarationFinderFunction(NameOccurrence occurrence) { + this.occurrence = occurrence; + } + + public void applyTo(NameDeclaration nameDeclaration) { + if (isDeclaredBefore(nameDeclaration) && isSameName(nameDeclaration)) { + decl = nameDeclaration; + } + } + + private boolean isDeclaredBefore(NameDeclaration nameDeclaration) { + if (nameDeclaration.getNode() != null && occurrence.getLocation() != null) { + return nameDeclaration.getNode().getBeginLine() <= + occurrence.getLocation().getBeginLine(); + } + + return true; + } + + private boolean isSameName(NameDeclaration nameDeclaration) { + return occurrence.getImage().equals(nameDeclaration.getName()); + } + + public NameDeclaration getDecl() { + return this.decl; + } +} diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/LocalScope.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/LocalScope.java index e2cfb80c5c..c546d9d8d2 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/LocalScope.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/LocalScope.java @@ -53,7 +53,7 @@ public class LocalScope extends AbstractJavaScope { if (occurrence.isThisOrSuper() || occurrence.isMethodOrConstructorInvocation()) { return result; } - ImageFinderFunction finder = new ImageFinderFunction(occurrence.getImage()); + DeclarationFinderFunction finder = new DeclarationFinderFunction(occurrence); Applier.apply(finder, getVariableDeclarations().keySet().iterator()); if (finder.getDecl() != null) { result.add(finder.getDecl()); diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/unusedcode/xml/UnusedPrivateField.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/unusedcode/xml/UnusedPrivateField.xml index 6db6f5e73e..0c9184a096 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/unusedcode/xml/UnusedPrivateField.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/unusedcode/xml/UnusedPrivateField.xml @@ -533,6 +533,31 @@ public class Foo { @Data public class Foo { private String bar; +} + ]]> + + + + #1428 False positive in UnusedPrivateField when local variable hides member variable + 0 + diff --git a/src/site/markdown/overview/changelog.md b/src/site/markdown/overview/changelog.md index a0f8ecc831..21aef09ffe 100644 --- a/src/site/markdown/overview/changelog.md +++ b/src/site/markdown/overview/changelog.md @@ -14,6 +14,9 @@ **Bugfixes:** -* [#1429](https://sourceforge.net/p/pmd/bugs/1429/): Java - Parse Error: Cast in return expression +* java-unusedcode/UnusedPrivateField + * [#1428](https://sourceforge.net/p/pmd/bugs/1428/): False positive in UnusedPrivateField when local variable hides member variable +* General + * [#1429](https://sourceforge.net/p/pmd/bugs/1429/): Java - Parse Error: Cast in return expression **API Changes:**