JavaTargetElementEvaluator#findOverridingMethod: run DFA only if method class has subclasses

This commit is contained in:
Tagir Valeev
2017-12-18 12:09:08 +07:00
parent 714f445886
commit 3fdbcdd753
@@ -15,6 +15,7 @@ import com.intellij.psi.javadoc.PsiDocToken;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.search.searches.ClassInheritorsSearch;
import com.intellij.psi.search.searches.DirectClassInheritorsSearch;
import com.intellij.psi.search.searches.FunctionalExpressionSearch;
import com.intellij.psi.util.*;
import com.intellij.util.BitUtil;
@@ -87,6 +88,9 @@ public class JavaTargetElementEvaluator extends TargetElementEvaluatorEx2 implem
if (!(reference instanceof PsiReferenceExpression) || !reference.isReferenceTo(method)) return null;
PsiExpression qualifier = ((PsiReferenceExpression)reference).getQualifierExpression();
if (qualifier == null) return null;
if (DirectClassInheritorsSearch.search(qualifierClass, qualifier.getResolveScope(), false).findFirst() == null) {
return null;
}
TypeConstraint constraint = CommonDataflow.getExpressionFact(qualifier, DfaFactType.TYPE_CONSTRAINT);
if (constraint == null) return null;
return MethodUtils.findSpecificMethod(method, constraint.getPsiType());