summaryrefslogtreecommitdiff
path: root/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils')
-rw-r--r--plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java23
-rw-r--r--plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpectedTypeUtils.java89
-rw-r--r--plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ImportUtils.java24
-rw-r--r--plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SideEffectChecker.java4
-rw-r--r--plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableAccessUtils.java44
-rw-r--r--plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableAssignedVisitor.java36
6 files changed, 124 insertions, 96 deletions
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java
index 278c07e980c0..3741d260dae6 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2013 Dave Griffith, Bas Leijdekkers
+ * Copyright 2003-2014 Dave Griffith, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ public class ControlFlowUtils {
}
else if (statement instanceof PsiExpressionListStatement || statement instanceof PsiEmptyStatement ||
statement instanceof PsiAssertStatement || statement instanceof PsiDeclarationStatement ||
- statement instanceof PsiSwitchLabelStatement) {
+ statement instanceof PsiSwitchLabelStatement || statement instanceof PsiForeachStatement) {
return true;
}
else if (statement instanceof PsiExpressionStatement) {
@@ -63,9 +63,6 @@ public class ControlFlowUtils {
else if (statement instanceof PsiForStatement) {
return forStatementMayCompleteNormally((PsiForStatement)statement);
}
- else if (statement instanceof PsiForeachStatement) {
- return foreachStatementMayCompleteNormally((PsiForeachStatement)statement);
- }
else if (statement instanceof PsiWhileStatement) {
return whileStatementMayCompleteNormally((PsiWhileStatement)statement);
}
@@ -130,10 +127,6 @@ public class ControlFlowUtils {
return Boolean.TRUE != value;
}
- private static boolean foreachStatementMayCompleteNormally(@NotNull PsiForeachStatement loopStatement) {
- return true;
- }
-
private static boolean switchStatementMayCompleteNormally(@NotNull PsiSwitchStatement switchStatement) {
if (statementIsBreakTarget(switchStatement)) {
return true;
@@ -524,7 +517,7 @@ public class ControlFlowUtils {
}
}
- private static class SystemExitFinder extends JavaRecursiveElementVisitor {
+ private static class SystemExitFinder extends JavaRecursiveElementWalkingVisitor {
private boolean m_found = false;
@@ -564,7 +557,7 @@ public class ControlFlowUtils {
}
}
- private static class ReturnFinder extends JavaRecursiveElementVisitor {
+ private static class ReturnFinder extends JavaRecursiveElementWalkingVisitor {
private boolean m_found = false;
@@ -587,7 +580,7 @@ public class ControlFlowUtils {
}
}
- private static class BreakFinder extends JavaRecursiveElementVisitor {
+ private static class BreakFinder extends JavaRecursiveElementWalkingVisitor {
private boolean m_found = false;
private final PsiStatement m_target;
@@ -637,7 +630,7 @@ public class ControlFlowUtils {
}
}
- private static class ContinueFinder extends JavaRecursiveElementVisitor {
+ private static class ContinueFinder extends JavaRecursiveElementWalkingVisitor {
private boolean m_found = false;
private final PsiStatement m_target;
@@ -687,7 +680,7 @@ public class ControlFlowUtils {
}
}
- private static class MethodCallFinder extends JavaRecursiveElementVisitor {
+ private static class MethodCallFinder extends JavaRecursiveElementWalkingVisitor {
private final String containingClassName;
private final PsiType returnType;
@@ -728,7 +721,7 @@ public class ControlFlowUtils {
}
}
- private static class ContinueToAncestorFinder extends JavaRecursiveElementVisitor {
+ private static class ContinueToAncestorFinder extends JavaRecursiveElementWalkingVisitor {
private final PsiStatement statement;
private boolean found = false;
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpectedTypeUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpectedTypeUtils.java
index c14da9f55373..ad5ecc2351f3 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpectedTypeUtils.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpectedTypeUtils.java
@@ -153,86 +153,59 @@ public class ExpectedTypeUtils {
}
@Override
- public void visitBinaryExpression(@NotNull PsiBinaryExpression binaryExpression) {
- final PsiExpression rhs = binaryExpression.getROperand();
- if (rhs == null) {
- expectedType = null;
- return;
- }
- final PsiExpression lhs = binaryExpression.getLOperand();
- PsiType lhsType = lhs.getType();
- if (lhsType == null) {
- expectedType = null;
- return;
- }
- PsiType rhsType = rhs.getType();
- if (rhsType == null) {
- expectedType = null;
- return;
+ public void visitPolyadicExpression(@NotNull PsiPolyadicExpression polyadicExpression) {
+ final PsiExpression[] operands = polyadicExpression.getOperands();
+ for (PsiExpression operand : operands) {
+ if (operand == null || operand.getType() == null) {
+ expectedType = null;
+ return;
+ }
}
- final IElementType tokenType = binaryExpression.getOperationTokenType();
- final PsiType type = binaryExpression.getType();
+ final IElementType tokenType = polyadicExpression.getOperationTokenType();
+ final PsiType type = polyadicExpression.getType();
+ final PsiType wrappedExpressionType = wrappedExpression.getType();
if (TypeUtils.isJavaLangString(type) || isArithmeticOperation(tokenType) || isBooleanOperation(tokenType)) {
expectedType = type;
}
else if (isShiftOperation(tokenType)) {
- if (lhs == wrappedExpression) {
- expectedType = unaryNumericPromotion(lhsType);
- }
- else {
- expectedType = unaryNumericPromotion(rhsType);
- }
+ expectedType = unaryNumericPromotion(wrappedExpressionType);
}
- else if (ComparisonUtils.isEqualityComparison(binaryExpression)) {
+ else if (ComparisonUtils.isEqualityComparison(polyadicExpression)) {
// JLS 15.21.1 Numerical Equality Operators == and !=
- final PsiType wrappedExpressionType = wrappedExpression.getType();
if (TypeConversionUtil.isPrimitiveAndNotNull(wrappedExpressionType)) {
expectedType = wrappedExpressionType;
- return;
}
- if (lhs == wrappedExpression) {
- if (TypeConversionUtil.isPrimitiveAndNotNull(rhsType)) {
+ else if (operands.length > 2) {
+ expectedType = PsiPrimitiveType.getUnboxedType(wrappedExpressionType);
+ }
+ else if (operands[0] == wrappedExpression) {
+ if (TypeConversionUtil.isPrimitiveAndNotNull(operands[1].getType())) {
expectedType = PsiPrimitiveType.getUnboxedType(wrappedExpressionType);
- return;
}
- expectedType = TypeUtils.getObjectType(wrappedExpression);
+ else {
+ expectedType = TypeUtils.getObjectType(wrappedExpression);
+ }
}
else {
- if (TypeConversionUtil.isPrimitiveAndNotNull(lhsType)) {
+ if (TypeConversionUtil.isPrimitiveAndNotNull(operands[0].getType())) {
expectedType = PsiPrimitiveType.getUnboxedType(wrappedExpressionType);
- return;
- }
- expectedType = TypeUtils.getObjectType(wrappedExpression);
+ }
+ else {
+ expectedType = TypeUtils.getObjectType(wrappedExpression);
+ }
}
}
else if (ComparisonUtils.isComparisonOperation(tokenType)) {
- if (lhs == wrappedExpression && !TypeConversionUtil.isPrimitiveAndNotNull(lhsType)) {
- lhsType = PsiPrimitiveType.getUnboxedType(lhsType);
- if (lhsType == null) {
- expectedType = null;
- return;
- }
+ if (operands.length != 2) {
+ expectedType = null;
+ return;
}
- if (rhs == wrappedExpression && !TypeConversionUtil.isPrimitiveAndNotNull(rhsType)) {
- rhsType = PsiPrimitiveType.getUnboxedType(rhsType);
- if (rhsType == null) {
- expectedType = null;
+ else if (!TypeConversionUtil.isPrimitiveAndNotNull(wrappedExpressionType)) {
+ if (PsiPrimitiveType.getUnboxedType(wrappedExpressionType) == null) {
return;
}
}
- // JLS 5.6.2 Binary Numeric Promotion
- if (PsiType.DOUBLE.equals(lhsType) || PsiType.DOUBLE.equals(rhsType)) {
- expectedType = PsiType.DOUBLE;
- }
- else if (PsiType.FLOAT.equals(lhsType) || PsiType.FLOAT.equals(rhsType)) {
- expectedType = PsiType.FLOAT;
- }
- else if (PsiType.LONG.equals(lhsType) || PsiType.LONG.equals(rhsType)) {
- expectedType = PsiType.LONG;
- }
- else {
- expectedType = PsiType.INT;
- }
+ expectedType = TypeConversionUtil.binaryNumericPromotion(operands[0].getType(), operands[1].getType());
}
else {
expectedType = null;
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ImportUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ImportUtils.java
index 6301e83eb0fd..8d52a8619dc5 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ImportUtils.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ImportUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2013 Dave Griffith, Bas Leijdekkers
+ * Copyright 2003-2014 Dave Griffith, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,8 +19,8 @@ import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleSettingsFacade;
import com.intellij.psi.search.GlobalSearchScope;
-import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.*;
+import com.intellij.psi.util.InheritanceUtil;
import com.siyeh.HardcodedMethodConstants;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -247,20 +247,22 @@ public class ImportUtils {
continue;
}
final PsiElement element = importReference.resolve();
- if (element == null || !(element instanceof PsiPackage)) {
+ if (!(element instanceof PsiPackage)) {
continue;
}
final PsiPackage aPackage = (PsiPackage)element;
- if (!strict) {
- return aPackage.containsClassNamed(shortName);
+ if (!strict && aPackage.containsClassNamed(shortName)) {
+ return true;
}
- final PsiClass[] classes = aPackage.findClassByShortName(shortName, file.getResolveScope());
- for (final PsiClass aClass : classes) {
- final String qualifiedClassName = aClass.getQualifiedName();
- if (qualifiedClassName == null || fqName.equals(qualifiedClassName)) {
- continue;
+ else {
+ final PsiClass[] classes = aPackage.findClassByShortName(shortName, file.getResolveScope());
+ for (final PsiClass aClass : classes) {
+ final String qualifiedClassName = aClass.getQualifiedName();
+ if (qualifiedClassName == null || fqName.equals(qualifiedClassName)) {
+ continue;
+ }
+ return containsConflictingReference(file, qualifiedClassName);
}
- return containsConflictingReference(file, qualifiedClassName);
}
}
return hasJavaLangImportConflict(fqName, file);
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SideEffectChecker.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SideEffectChecker.java
index af04c02d6e79..5063ef7c2ea7 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SideEffectChecker.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SideEffectChecker.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2006 Dave Griffith, Bas Leijdekkers
+ * Copyright 2003-2014 Dave Griffith, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -31,7 +31,7 @@ public class SideEffectChecker {
return visitor.mayHaveSideEffects();
}
- private static class SideEffectsVisitor extends JavaRecursiveElementVisitor {
+ private static class SideEffectsVisitor extends JavaRecursiveElementWalkingVisitor {
private boolean mayHaveSideEffects = false;
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableAccessUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableAccessUtils.java
index e097d58f8301..b8e7b7c183d8 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableAccessUtils.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableAccessUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2012 Dave Griffith, Bas Leijdekkers
+ * Copyright 2003-2014 Dave Griffith, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,6 +20,9 @@ import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
import java.util.Set;
public class VariableAccessUtils {
@@ -446,4 +449,43 @@ public class VariableAccessUtils {
}
return child;
}
+
+ public static Set<PsiVariable> collectUsedVariables(PsiElement context) {
+ if (context == null) {
+ return Collections.emptySet();
+ }
+ final VariableCollectingVisitor visitor = new VariableCollectingVisitor();
+ context.accept(visitor);
+ return visitor.getUsedVariables();
+ }
+
+ public static boolean isAnyVariableAssigned(@NotNull Collection<PsiVariable> variables, @Nullable PsiElement context) {
+ if (context == null) {
+ return false;
+ }
+ final VariableAssignedVisitor visitor = new VariableAssignedVisitor(variables, true);
+ context.accept(visitor);
+ return visitor.isAssigned();
+ }
+
+ private static class VariableCollectingVisitor extends JavaRecursiveElementVisitor {
+
+ private final Set<PsiVariable> usedVariables = new HashSet();
+
+ @Override
+ public void visitReferenceExpression(
+ PsiReferenceExpression expression) {
+ super.visitReferenceExpression(expression);
+ final PsiElement target = expression.resolve();
+ if (!(target instanceof PsiVariable)) {
+ return;
+ }
+ final PsiVariable variable = (PsiVariable)target;
+ usedVariables.add(variable);
+ }
+
+ public Set<PsiVariable> getUsedVariables() {
+ return usedVariables;
+ }
+ }
} \ No newline at end of file
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableAssignedVisitor.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableAssignedVisitor.java
index 0a22ef3fde97..279400f3a653 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableAssignedVisitor.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/VariableAssignedVisitor.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2013 Dave Griffith, Bas Leijdekkers
+ * Copyright 2003-2014 Dave Griffith, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,16 +20,25 @@ import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.TypeConversionUtil;
import org.jetbrains.annotations.NotNull;
+import java.util.Collection;
+import java.util.Collections;
+
public class VariableAssignedVisitor extends JavaRecursiveElementWalkingVisitor {
- @NotNull private final PsiVariable variable;
+ @NotNull private final Collection<PsiVariable> variables;
private final boolean recurseIntoClasses;
private final boolean checkUnaryExpressions;
private boolean assigned = false;
private PsiElement excludedElement = null;
+ public VariableAssignedVisitor(@NotNull Collection<PsiVariable> variables, boolean recurseIntoClasses) {
+ this.variables = variables;
+ checkUnaryExpressions = true;
+ this.recurseIntoClasses = recurseIntoClasses;
+ }
+
public VariableAssignedVisitor(@NotNull PsiVariable variable, boolean recurseIntoClasses) {
- this.variable = variable;
+ variables = Collections.singleton(variable);
final PsiType type = variable.getType();
checkUnaryExpressions = TypeConversionUtil.isNumericType(type);
this.recurseIntoClasses = recurseIntoClasses;
@@ -58,8 +67,11 @@ public class VariableAssignedVisitor extends JavaRecursiveElementWalkingVisitor
}
super.visitAssignmentExpression(assignment);
final PsiExpression lhs = assignment.getLExpression();
- if (VariableAccessUtils.evaluatesToVariable(lhs, variable)) {
- assigned = true;
+ for (PsiVariable variable : variables) {
+ if (VariableAccessUtils.evaluatesToVariable(lhs, variable)) {
+ assigned = true;
+ break;
+ }
}
}
@@ -85,8 +97,11 @@ public class VariableAssignedVisitor extends JavaRecursiveElementWalkingVisitor
return;
}
final PsiExpression operand = prefixExpression.getOperand();
- if (VariableAccessUtils.evaluatesToVariable(operand, variable)) {
- assigned = true;
+ for (PsiVariable variable : variables) {
+ if (VariableAccessUtils.evaluatesToVariable(operand, variable)) {
+ assigned = true;
+ break;
+ }
}
}
@@ -104,8 +119,11 @@ public class VariableAssignedVisitor extends JavaRecursiveElementWalkingVisitor
return;
}
final PsiExpression operand = postfixExpression.getOperand();
- if (VariableAccessUtils.evaluatesToVariable(operand, variable)) {
- assigned = true;
+ for (PsiVariable variable : variables) {
+ if (VariableAccessUtils.evaluatesToVariable(operand, variable)) {
+ assigned = true;
+ break;
+ }
}
}