From 75e41f09a45f63afad6dfe628f51c71764b957bb Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 15 Oct 2014 17:08:08 +0400 Subject: [PATCH] Extracted PyUtil.multiResolveTopPriority() --- .../src/com/jetbrains/python/psi/PyUtil.java | 35 +++++++++++++++++++ .../psi/impl/PyReferenceExpressionImpl.java | 27 +++----------- 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/python/src/com/jetbrains/python/psi/PyUtil.java b/python/src/com/jetbrains/python/psi/PyUtil.java index dc8787328554..3dfe465b1da6 100644 --- a/python/src/com/jetbrains/python/psi/PyUtil.java +++ b/python/src/com/jetbrains/python/psi/PyUtil.java @@ -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 multiResolveTopPriority(@NotNull PsiPolyVariantReference reference) { + return filterTopPriorityResults(reference.multiResolve(false)); + } + + @NotNull + private static List filterTopPriorityResults(@NotNull ResolveResult[] resolveResults) { + if (resolveResults.length == 0) { + return Collections.emptyList(); + } + final List filtered = new ArrayList(); + 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 * diff --git a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java index 4bc9bd26834b..edd902da1a55 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java @@ -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 targets = PyUtil.multiResolveTopPriority(reference); + if (targets.isEmpty()) { return getQualifiedReferenceTypeByControlFlow(context); } final List members = new ArrayList(); - 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 myQualifiers;