diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/ConstantValueVariableUseInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/ConstantValueVariableUseInspection.java index 83fa6af70fbd..744b9ea237b3 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/ConstantValueVariableUseInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/ConstantValueVariableUseInspection.java @@ -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; } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/constant_value_variable_use/ConstantValueVariableUse.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/constant_value_variable_use/ConstantValueVariableUse.java index 334af24a2233..756c0765a35d 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/constant_value_variable_use/ConstantValueVariableUse.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/dataflow/constant_value_variable_use/ConstantValueVariableUse.java @@ -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--; + } + } + } } \ No newline at end of file