From cb1b5c16bffd63c954702907ae2e6fbf2193cfa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Mart=C3=ADn=20Sotuyo=20Dodero?= Date: Tue, 16 Apr 2019 16:51:15 -0300 Subject: [PATCH] [java] Have symbol table recognize concise resources - Concise resources are valid usages. - Fixes #1190 --- .../java/symboltable/JavaNameOccurrence.java | 6 ++++- .../java/symboltable/OccurrenceFinder.java | 17 ++++++++++++++ .../bestpractices/xml/UnusedLocalVariable.xml | 19 +++++++++++++++ .../bestpractices/xml/UnusedPrivateField.xml | 23 +++++++++++++++++++ 4 files changed, 64 insertions(+), 1 deletion(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/JavaNameOccurrence.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/JavaNameOccurrence.java index 7dcc57fe91..4e7033de52 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/JavaNameOccurrence.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/JavaNameOccurrence.java @@ -14,6 +14,7 @@ import net.sourceforge.pmd.lang.java.ast.ASTPreDecrementExpression; import net.sourceforge.pmd.lang.java.ast.ASTPreIncrementExpression; import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression; import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix; +import net.sourceforge.pmd.lang.java.ast.ASTResource; import net.sourceforge.pmd.lang.java.ast.ASTStatementExpression; import net.sourceforge.pmd.lang.java.ast.JavaNode; import net.sourceforge.pmd.lang.symboltable.NameOccurrence; @@ -87,9 +88,12 @@ public class JavaNameOccurrence implements NameOccurrence { primaryExpression = location.jjtGetParent().jjtGetParent(); } else if (location.jjtGetParent().jjtGetParent() instanceof ASTPrimaryExpression) { primaryExpression = location.jjtGetParent().jjtGetParent().jjtGetParent(); + } else if (location.jjtGetParent() instanceof ASTResource) { + return false; } else { throw new RuntimeException( - "Found a NameOccurrence (" + location + ") that didn't have an ASTPrimary Expression as parent or grandparent. Parent = " + "Found a NameOccurrence (" + location + ") that didn't have an ASTPrimary Expression" + + " as parent or grandparent nor is a concise resource. Parent = " + location.jjtGetParent() + " and grandparent = " + location.jjtGetParent().jjtGetParent() + " (location line " + location.getBeginLine() + " col " + location.getBeginColumn() + ")"); } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/OccurrenceFinder.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/OccurrenceFinder.java index 37b6b819a5..13c770ab7e 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/OccurrenceFinder.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/symboltable/OccurrenceFinder.java @@ -7,8 +7,11 @@ package net.sourceforge.pmd.lang.java.symboltable; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.StringTokenizer; +import net.sourceforge.pmd.lang.java.ast.ASTName; import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression; +import net.sourceforge.pmd.lang.java.ast.ASTResource; import net.sourceforge.pmd.lang.java.ast.JavaParserVisitorAdapter; import net.sourceforge.pmd.lang.symboltable.NameDeclaration; import net.sourceforge.pmd.lang.symboltable.Scope; @@ -21,6 +24,20 @@ public class OccurrenceFinder extends JavaParserVisitorAdapter { private final Set additionalDeclarations = new HashSet<>(); + @Override + public Object visit(ASTResource node, Object data) { + // is this a concise resource reference? + if (node.jjtGetNumChildren() == 1) { + ASTName nameNode = (ASTName) node.jjtGetChild(0); + for (StringTokenizer st = new StringTokenizer(nameNode.getImage(), "."); st.hasMoreTokens();) { + JavaNameOccurrence occ = new JavaNameOccurrence(nameNode, st.nextToken()); + new Search(occ).execute(); + } + } + + return super.visit(node, data); + } + @Override public Object visit(ASTPrimaryExpression node, Object data) { NameFinder nameFinder = new NameFinder(node); diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/UnusedLocalVariable.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/UnusedLocalVariable.xml index 4883375d4e..32c62ecf2d 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/UnusedLocalVariable.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/UnusedLocalVariable.xml @@ -386,6 +386,25 @@ public class Test { double result = Math.sqrt((a) - b); System.out.println(result); } +} + ]]> + + + + #1190 [java] UnusedLocalVariable/UnusedPrivateField false-positive + 0 + diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/UnusedPrivateField.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/UnusedPrivateField.xml index 3124ab44b1..f5ff621713 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/UnusedPrivateField.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/bestpractices/xml/UnusedPrivateField.xml @@ -597,6 +597,29 @@ public class IssueUnusedPrivateField { String helper = "some new string"; // hidden here System.out.println("helper = " + helper); } +} + ]]> + + + + #1190 [java] UnusedLocalVariable/UnusedPrivateField false-positive + 0 +