diff options
Diffstat (limited to 'plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/WeakestTypeFinder.java')
-rw-r--r-- | plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/WeakestTypeFinder.java | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/WeakestTypeFinder.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/WeakestTypeFinder.java index 1440c58e5113..aade5a56361f 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/WeakestTypeFinder.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/WeakestTypeFinder.java @@ -132,7 +132,7 @@ public class WeakestTypeFinder { else if (referenceParent instanceof PsiVariable) { final PsiVariable variable = (PsiVariable)referenceParent; final PsiType type = variable.getType(); - if (!checkType(type, weakestTypeClasses)) { + if (!type.isAssignableFrom(variableOrMethodType) || !checkType(type, weakestTypeClasses)) { return Collections.emptyList(); } } @@ -251,7 +251,7 @@ public class WeakestTypeFinder { if (!hasUsages) { return Collections.emptyList(); } - weakestTypeClasses = filterAccessibleClasses(weakestTypeClasses, variableOrMethod); + weakestTypeClasses = filterAccessibleClasses(weakestTypeClasses, variableOrMethodClass, variableOrMethod); return weakestTypeClasses; } @@ -442,22 +442,23 @@ public class WeakestTypeFinder { } final PsiExpression lhs = assignmentExpression.getLExpression(); final PsiExpression rhs = assignmentExpression.getRExpression(); + if (rhs == null) { + return false; + } final PsiType lhsType = lhs.getType(); + final PsiType rhsType = rhs.getType(); + if (lhsType == null || rhsType == null || !lhsType.isAssignableFrom(rhsType)) { + return false; + } if (referenceElement.equals(rhs)) { if (!checkType(lhsType, weakestTypeClasses)) { return false; } } - else if (useRighthandTypeAsWeakestTypeInAssignments) { - if (rhs == null) { - return false; - } - if (!(rhs instanceof PsiNewExpression) || !(rhs instanceof PsiTypeCastExpression)) { - final PsiType rhsType = rhs.getType(); - if (lhsType == null || lhsType.equals(rhsType)) { - return false; - } - } + else if (useRighthandTypeAsWeakestTypeInAssignments && + (!(rhs instanceof PsiNewExpression) || !(rhs instanceof PsiTypeCastExpression)) && + lhsType.equals(rhsType)) { + return false; } return true; } @@ -546,14 +547,14 @@ public class WeakestTypeFinder { return true; } - public static Set<PsiClass> filterAccessibleClasses(Set<PsiClass> weakestTypeClasses, PsiElement context) { + public static Set<PsiClass> filterAccessibleClasses(Set<PsiClass> weakestTypeClasses, PsiClass upperBound, PsiElement context) { final Set<PsiClass> result = new HashSet<PsiClass>(); for (PsiClass weakestTypeClass : weakestTypeClasses) { - if (PsiUtil.isAccessible(weakestTypeClass, context, null)) { + if (PsiUtil.isAccessible(weakestTypeClass, context, null) && !weakestTypeClass.isDeprecated()) { result.add(weakestTypeClass); continue; } - final PsiClass visibleInheritor = getVisibleInheritor(weakestTypeClass, context); + final PsiClass visibleInheritor = getVisibleInheritor(weakestTypeClass, upperBound, context); if (visibleInheritor != null) { result.add(visibleInheritor); } @@ -562,16 +563,16 @@ public class WeakestTypeFinder { } @Nullable - private static PsiClass getVisibleInheritor(@NotNull PsiClass superClass, PsiElement context) { + private static PsiClass getVisibleInheritor(@NotNull PsiClass superClass, PsiClass upperBound, PsiElement context) { final Query<PsiClass> search = DirectClassInheritorsSearch.search(superClass, context.getResolveScope()); final Project project = superClass.getProject(); for (PsiClass aClass : search) { - if (superClass.isInheritor(aClass, true)) { + if (aClass.isInheritor(superClass, true) && upperBound.isInheritor(aClass, true)) { if (PsiUtil.isAccessible(project, aClass, context, null)) { return aClass; } else { - return getVisibleInheritor(aClass, context); + return getVisibleInheritor(aClass, upperBound, context); } } } |