Handle break
This commit is contained in:
@ -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);
|
||||
|
@ -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>
|
||||
|
Reference in New Issue
Block a user