mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Extracted PyUtil.multiResolveTopPriority()
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user