Extracted PyUtil.multiResolveTopPriority()

This commit is contained in:
Andrey Vlasovskikh
2014-10-15 17:08:08 +04:00
parent efa6744299
commit 75e41f09a4
2 changed files with 39 additions and 23 deletions
@@ -68,6 +68,7 @@ import com.jetbrains.python.magicLiteral.PyMagicLiteralTools;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import com.jetbrains.python.psi.impl.PyPsiUtils;
import com.jetbrains.python.psi.impl.PythonLanguageLevelPusher;
import com.jetbrains.python.psi.resolve.RatedResolveResult;
import com.jetbrains.python.psi.types.*;
import com.jetbrains.python.refactoring.classes.PyDependenciesComparator;
import com.jetbrains.python.refactoring.classes.extractSuperclass.PyExtractSuperclassHelper;
@@ -750,6 +751,40 @@ public class PyUtil {
return currentElement;
}
@NotNull
public static List<PsiElement> multiResolveTopPriority(@NotNull PsiPolyVariantReference reference) {
return filterTopPriorityResults(reference.multiResolve(false));
}
@NotNull
private static List<PsiElement> filterTopPriorityResults(@NotNull ResolveResult[] resolveResults) {
if (resolveResults.length == 0) {
return Collections.emptyList();
}
final List<PsiElement> filtered = new ArrayList<PsiElement>();
final int maxRate = getMaxRate(resolveResults);
for (ResolveResult resolveResult : resolveResults) {
final int rate = resolveResult instanceof RatedResolveResult ? ((RatedResolveResult)resolveResult).getRate() : 0;
if (rate >= maxRate) {
filtered.add(resolveResult.getElement());
}
}
return filtered;
}
private static int getMaxRate(@NotNull ResolveResult[] resolveResults) {
int maxRate = Integer.MIN_VALUE;
for (ResolveResult resolveResult : resolveResults) {
if (resolveResult instanceof RatedResolveResult) {
final int rate = ((RatedResolveResult)resolveResult).getRate();
if (rate > maxRate) {
maxRate = rate;
}
}
}
return maxRate;
}
/**
* Gets class init method
*
@@ -216,20 +216,14 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere
return typeOfProperty.get();
}
}
ResolveResult[] targets = getReference(PyResolveContext.noImplicits().withTypeEvalContext(context)).multiResolve(false);
if (targets.length == 0) {
final PsiPolyVariantReference reference = getReference(PyResolveContext.noImplicits().withTypeEvalContext(context));
final List<PsiElement> targets = PyUtil.multiResolveTopPriority(reference);
if (targets.isEmpty()) {
return getQualifiedReferenceTypeByControlFlow(context);
}
final List<PyType> members = new ArrayList<PyType>();
final int maxRate = getMaxRate(targets);
for (ResolveResult resolveResult : targets) {
final int rate = resolveResult instanceof RatedResolveResult ? ((RatedResolveResult)resolveResult).getRate() : 0;
if (rate < maxRate) {
continue;
}
PsiElement target = resolveResult.getElement();
for (PsiElement target : targets) {
if (target == this || target == null) {
continue;
}
@@ -427,19 +421,6 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere
myQualifiedName = null;
}
private static int getMaxRate(@NotNull ResolveResult[] targets) {
int maxRate = Integer.MIN_VALUE;
for (ResolveResult target : targets) {
if (target instanceof RatedResolveResult) {
final int rate = ((RatedResolveResult)target).getRate();
if (rate > maxRate) {
maxRate = rate;
}
}
}
return maxRate;
}
private static class QualifiedResolveResultImpl extends RatedResolveResult implements QualifiedResolveResult {
// a trivial implementation
private List<PyExpression> myQualifiers;