IDEA-148126 (The inspection ConstantValueVariableUse creates a false positive)

This commit is contained in:
Bas Leijdekkers
2015-11-24 12:08:34 +01:00
parent b2b3e0b9e0
commit a795d3d43a
2 changed files with 30 additions and 6 deletions
@@ -20,6 +20,7 @@ import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
@@ -195,7 +196,7 @@ public class ConstantValueVariableUseInspection extends BaseInspection implement
@NotNull
private final PsiVariable variable;
private boolean read = false;
private boolean written = false;
private boolean stop = false;
private PsiReferenceExpression reference = null;
VariableReadVisitor(@NotNull PsiVariable variable) {
@@ -204,7 +205,7 @@ public class ConstantValueVariableUseInspection extends BaseInspection implement
@Override
public void visitElement(@NotNull PsiElement element) {
if (read || written) {
if (read || stop) {
return;
}
super.visitElement(element);
@@ -212,24 +213,35 @@ public class ConstantValueVariableUseInspection extends BaseInspection implement
@Override
public void visitReferenceExpression(PsiReferenceExpression expression) {
if (read || written) {
if (read || stop) {
return;
}
final PsiElement target = expression.resolve();
if (variable.equals(target)) {
if (PsiUtil.isAccessedForWriting(expression)) {
written = true;
stop = true;
return;
}
if (PsiUtil.isAccessedForReading(expression)) {
reference = expression;
read = true;
if (isInLoopCondition(expression)) {
stop = true;
}
else {
reference = expression;
read = true;
}
return;
}
}
super.visitReferenceExpression(expression);
}
private static boolean isInLoopCondition(PsiExpression expression) {
final PsiStatement statement =
PsiTreeUtil.getParentOfType(expression, PsiStatement.class, true, PsiMember.class, PsiLambdaExpression.class);
return statement instanceof PsiLoopStatement;
}
public boolean isRead() {
return read;
}
@@ -46,4 +46,16 @@ class C {
}
return h;
}
}
class D {
void f() {
int positiveValue = 10;
int counter = 12;
if (positiveValue == 10) {
while (counter > 0 && positiveValue > 0) {
counter--;
positiveValue--;
}
}
}
}