Handle break

This commit is contained in:
Clément Fournier
2020-06-20 02:27:10 +02:00
parent 138698be0a
commit 2448cc73ce
2 changed files with 112 additions and 1 deletions

View File

@ -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);

View File

@ -293,7 +293,7 @@ class Test{
</test-code>
<test-code>
<description>#1905 [java] DataflowAnomalyAnalysis Rule in right order : Case 4. DU-Anomaly(a)</description>
<description>While loop 1</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
class Test{
@ -309,6 +309,105 @@ class Test{
]]></code>
</test-code>
<test-code>
<description>While loop 2</description>
<expected-problems>2</expected-problems>
<expected-linenumbers>4,7</expected-linenumbers>
<expected-messages>
<message>The value assigned to variable 'i' is never used</message>
<message>The value assigned to variable 'i' is never used</message>
</expected-messages>
<code><![CDATA[
class Test{
public static void main(String[] args){
int a = 0;
int i = 0; // unused
while(a < 30){
a = a + 3;
i = 5; // unused (kills itself)
}
}
}
]]></code>
</test-code>
<test-code>
<description>While loop with break</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>7</expected-linenumbers>
<expected-messages>
<message>The value assigned to variable 'i' is never used</message>
</expected-messages>
<code><![CDATA[
class Test{
public static void main(String[] args){
int a = 0;
int i = 0;
while (true) {
if (a >= 30) {
i = a + 1; // unused
break;
}
a = a + 3;
i = i + 1; // used by itself
}
}
}
]]></code>
</test-code>
<test-code>
<description>While loop without break (control case)</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
class Test{
public static void main(String[] args){
int a = 0;
int i = 0;
while (true) {
if (a >= 30) {
i = a + 1; // used by below
// break; // no break here
}
a = a + 3;
i = i + 1; // used by itself
}
}
}
]]></code>
</test-code>
<test-code>
<description>While loop with break 2</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>12</expected-linenumbers>
<expected-messages>
<message>The value assigned to variable 'i' is never used</message>
</expected-messages>
<code><![CDATA[
class Test{
public static void main(String[] args){
int a = 0;
int i = 0; // used now
outer:
while (true) {
a += 2;
while (true) {
if (a >= 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
}
}
]]></code>
</test-code>
<test-code>
<description>#1905 [java] DataflowAnomalyAnalysis Rule in right order : Case 5. DU-Anomaly(a)</description>
<expected-problems>1</expected-problems>