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 189ed68fb9b2..11d8758ac2e9 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/ConstantValueVariableUseInspection.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/ConstantValueVariableUseInspection.java
@@ -179,8 +179,7 @@ public class ConstantValueVariableUseInspection extends BaseInspection {
return false;
}
final PsiVariable variable = (PsiVariable)target;
- final VariableReadVisitor visitor =
- new VariableReadVisitor(variable);
+ final VariableReadVisitor visitor = new VariableReadVisitor(variable);
body.accept(visitor);
if (!visitor.isRead()) {
return false;
@@ -190,8 +189,7 @@ public class ConstantValueVariableUseInspection extends BaseInspection {
}
}
- private static class VariableReadVisitor
- extends JavaRecursiveElementVisitor {
+ private static class VariableReadVisitor extends JavaRecursiveElementWalkingVisitor {
@NotNull
private final PsiVariable variable;
@@ -212,197 +210,23 @@ public class ConstantValueVariableUseInspection extends BaseInspection {
}
@Override
- public void visitAssignmentExpression(
- @NotNull PsiAssignmentExpression assignment) {
+ public void visitReferenceExpression(PsiReferenceExpression expression) {
if (read || written) {
return;
}
- super.visitAssignmentExpression(assignment);
- final PsiExpression lhs = assignment.getLExpression();
- if (lhs instanceof PsiReferenceExpression) {
- final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)lhs;
- final PsiElement target = referenceExpression.resolve();
- if (variable.equals(target)) {
- written = true;
+ final PsiElement target = expression.resolve();
+ if (variable.equals(target)) {
+ if (PsiUtil.isAccessedForWriting(expression)) {
+ written = true;
return;
}
- }
- final PsiExpression rhs = assignment.getRExpression();
- if (rhs == null) {
- return;
- }
- final VariableUsedVisitor visitor =
- new VariableUsedVisitor(variable);
- rhs.accept(visitor);
- read = visitor.isUsed();
- reference = visitor.getReference();
- }
-
- @Override
- public void visitPrefixExpression(
- @NotNull PsiPrefixExpression prefixExpression) {
- if (read || written) {
- return;
- }
- super.visitPrefixExpression(prefixExpression);
- final IElementType tokenType = prefixExpression.getOperationTokenType();
- if (!tokenType.equals(JavaTokenType.PLUSPLUS) &&
- !tokenType.equals(JavaTokenType.MINUSMINUS)) {
- return;
- }
- final PsiExpression operand = prefixExpression.getOperand();
- if (!(operand instanceof PsiReferenceExpression)) {
- return;
- }
- final PsiReferenceExpression referenceExpression =
- (PsiReferenceExpression)operand;
- final PsiElement target = referenceExpression.resolve();
- if (!variable.equals(target)) {
- return;
- }
- written = true;
- }
-
- @Override
- public void visitPostfixExpression(
- @NotNull PsiPostfixExpression postfixExpression) {
- if (read || written) {
- return;
- }
- super.visitPostfixExpression(postfixExpression);
- final IElementType tokenType = postfixExpression.getOperationTokenType();
- if (!tokenType.equals(JavaTokenType.PLUSPLUS) &&
- !tokenType.equals(JavaTokenType.MINUSMINUS)) {
- return;
- }
- final PsiExpression operand = postfixExpression.getOperand();
- if (!(operand instanceof PsiReferenceExpression)) {
- return;
- }
- final PsiReferenceExpression referenceExpression =
- (PsiReferenceExpression)operand;
- final PsiElement target = referenceExpression.resolve();
- if (!variable.equals(target)) {
- return;
- }
- written = true;
- }
-
- @Override
- public void visitVariable(@NotNull PsiVariable variable) {
- if (read || written) {
- return;
- }
- super.visitVariable(variable);
- final PsiExpression initalizer = variable.getInitializer();
- if (initalizer == null) {
- return;
- }
- final VariableUsedVisitor visitor =
- new VariableUsedVisitor(variable);
- initalizer.accept(visitor);
- read = visitor.isUsed();
- reference = visitor.getReference();
- }
-
- @Override
- public void visitMethodCallExpression(
- @NotNull PsiMethodCallExpression call) {
- if (read || written) {
- return;
- }
- super.visitMethodCallExpression(call);
- final PsiExpressionList argumentList = call.getArgumentList();
- final PsiExpression[] arguments = argumentList.getExpressions();
- for (final PsiExpression argument : arguments) {
- final VariableUsedVisitor visitor =
- new VariableUsedVisitor(variable);
- argument.accept(visitor);
- if (visitor.isUsed()) {
+ if (PsiUtil.isAccessedForReading(expression)) {
+ reference = expression;
read = true;
- reference = visitor.getReference();
return;
}
}
- }
-
- @Override
- public void visitNewExpression(
- @NotNull PsiNewExpression newExpression) {
- if (read || written) {
- return;
- }
- super.visitNewExpression(newExpression);
- final PsiExpressionList argumentList =
- newExpression.getArgumentList();
- if (argumentList == null) {
- return;
- }
- final PsiExpression[] arguments = argumentList.getExpressions();
- for (final PsiExpression argument : arguments) {
- final VariableUsedVisitor visitor =
- new VariableUsedVisitor(variable);
- argument.accept(visitor);
- if (visitor.isUsed()) {
- read = true;
- reference = visitor.getReference();
- return;
- }
- }
- }
-
- @Override
- public void visitArrayInitializerExpression(
- PsiArrayInitializerExpression expression) {
- if (read || written) {
- return;
- }
- super.visitArrayInitializerExpression(expression);
- final PsiExpression[] arguments = expression.getInitializers();
- for (final PsiExpression argument : arguments) {
- final VariableUsedVisitor visitor =
- new VariableUsedVisitor(variable);
- argument.accept(visitor);
- if (visitor.isUsed()) {
- read = true;
- reference = visitor.getReference();
- return;
- }
- }
- }
-
- @Override
- public void visitReturnStatement(
- @NotNull PsiReturnStatement returnStatement) {
- if (read || written) {
- return;
- }
- super.visitReturnStatement(returnStatement);
- final PsiExpression returnValue = returnStatement.getReturnValue();
- if (returnValue == null) {
- return;
- }
- final VariableUsedVisitor visitor =
- new VariableUsedVisitor(variable);
- returnValue.accept(visitor);
- read = visitor.isUsed();
- reference = visitor.getReference();
- }
-
- /**
- * check if variable is used in nested/inner class.
- */
- @Override
- public void visitClass(PsiClass aClass) {
- if (read || written) {
- return;
- }
- super.visitClass(aClass);
- final VariableUsedVisitor visitor =
- new VariableUsedVisitor(variable);
- aClass.accept(visitor);
- read = visitor.isUsed();
- reference = visitor.getReference();
+ super.visitReferenceExpression(expression);
}
public boolean isRead() {
@@ -413,49 +237,4 @@ public class ConstantValueVariableUseInspection extends BaseInspection {
return reference;
}
}
-
- private static class VariableUsedVisitor
- extends JavaRecursiveElementVisitor {
-
- private final PsiVariable variable;
- private boolean used = false;
- private PsiReferenceExpression reference = null;
-
- VariableUsedVisitor(PsiVariable variable) {
- this.variable = variable;
- }
-
- @Override
- public void visitElement(PsiElement element) {
- if (used) {
- return;
- }
- super.visitElement(element);
- }
-
- @Override
- public void visitReferenceExpression(
- @NotNull PsiReferenceExpression expression) {
- if (used) {
- return;
- }
- super.visitReferenceExpression(expression);
- final PsiElement referent = expression.resolve();
- if (referent == null) {
- return;
- }
- if (referent.equals(variable)) {
- reference = expression;
- used = true;
- }
- }
-
- public boolean isUsed() {
- return used;
- }
-
- public PsiReferenceExpression getReference() {
- return reference;
- }
- }
}
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 8c24aab1d08b..334af24a2233 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
@@ -20,6 +20,30 @@ public class ConstantValueVariableUse {
if ((i) == 2 && true && true) { // polyadic
f(i);
}
+
+ int j = 10;
+ while (i < 10 && j == 10) {
+ f(j);
+ }
+ for (; i < 10 && j == 10; ) {
+ f(j);
+ }
+
+ if (i == 3) {
+ i = 4;
+ System.out.println(i);
+ }
}
+}
+class C {
+ private int hash;
+ @Override
+ public int hashCode() {
+ int h = hash;
+ if (h == 0) {
+ hash = h = "StringUtil.stringHashCode(this, 0, length())".hashCode();
+ }
+ return h;
+ }
}
\ No newline at end of file