From 2448cc73ceaac84d4ee5d445a0e9c953750e9b12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Sat, 20 Jun 2020 02:27:10 +0200 Subject: [PATCH] Handle break --- .../rule/errorprone/UnusedAssignmentRule.java | 12 +++ .../rule/errorprone/xml/UnusedAssignment.xml | 101 +++++++++++++++++- 2 files changed, 112 insertions(+), 1 deletion(-) diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/UnusedAssignmentRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/UnusedAssignmentRule.java index 9b09d66f56..7f1f021d60 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/UnusedAssignmentRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/errorprone/UnusedAssignmentRule.java @@ -15,6 +15,7 @@ import java.util.Objects; import java.util.Set; import net.sourceforge.pmd.lang.java.ast.ASTAssignmentOperator; +import net.sourceforge.pmd.lang.java.ast.ASTBreakStatement; import net.sourceforge.pmd.lang.java.ast.ASTExpression; import net.sourceforge.pmd.lang.java.ast.ASTIfStatement; import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; @@ -127,6 +128,12 @@ public class UnusedAssignmentRule extends AbstractJavaRule { return ((ScopeData) data).abruptCompletion(); } + @Override + public Object visit(ASTBreakStatement node, Object data) { + data = super.visit(node, data); + return ((ScopeData) data).abruptCompletion(); + } + @Override public Object visit(ASTReturnStatement node, Object data) { data = super.visit(node, data); @@ -169,6 +176,11 @@ public class UnusedAssignmentRule extends AbstractJavaRule { VariableNameDeclaration lhsVar = getLhsVar(node.getChild(0), true); if (lhsVar != null) { + if (node.getChild(1).getImage().length() >= 2) { + // compound assignment, to use BEFORE assigning + ((ScopeData) data).use(lhsVar); + } + ((ScopeData) data).assign(lhsVar, rhs); } else { node.getChild(0).jjtAccept(this, data); diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/UnusedAssignment.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/UnusedAssignment.xml index b47fb98624..1bc4f5eec3 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/UnusedAssignment.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/errorprone/xml/UnusedAssignment.xml @@ -293,7 +293,7 @@ class Test{ - #1905 [java] DataflowAnomalyAnalysis Rule in right order : Case 4. DU-Anomaly(a) + While loop 1 0 + + While loop 2 + 2 + 4,7 + + The value assigned to variable 'i' is never used + The value assigned to variable 'i' is never used + + + + + While loop with break + 1 + 7 + + The value assigned to variable 'i' is never used + + = 30) { + i = a + 1; // unused + break; + } + a = a + 3; + i = i + 1; // used by itself + } + } +} + ]]> + + + While loop without break (control case) + 0 + = 30) { + i = a + 1; // used by below + // break; // no break here + } + a = a + 3; + i = i + 1; // used by itself + } + } +} + ]]> + + + + While loop with break 2 + 1 + 12 + + The value assigned to variable 'i' is never used + + = 30) { + i = i + 1; // used now + break outer; + } + a = a + 3; + i = i + 2; // unused (kills itself) + } + } + + System.out.println(i); // uses i = i + 1 + } +} + ]]> + + #1905 [java] DataflowAnomalyAnalysis Rule in right order : Case 5. DU-Anomaly(a) 1