summaryrefslogtreecommitdiff
path: root/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java')
-rw-r--r--python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java38
1 files changed, 34 insertions, 4 deletions
diff --git a/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java b/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java
index da8c0d618a8b..838a4dbcc75a 100644
--- a/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java
+++ b/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java
@@ -38,6 +38,11 @@ import com.jetbrains.python.psi.impl.PyPsiUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
/**
* Ref resolution routines.
* User: dcheryasov
@@ -106,16 +111,17 @@ public class PyResolveUtil {
owner = outerScopeOwner;
}
}
- scopeCrawlUp(processor, owner, originalOwner, name, roof);
+ scopeCrawlUp(processor, owner, originalOwner, name, roof, realContext);
}
public static void scopeCrawlUp(@NotNull PsiScopeProcessor processor, @NotNull ScopeOwner scopeOwner, @Nullable String name,
@Nullable PsiElement roof) {
- scopeCrawlUp(processor, scopeOwner, scopeOwner, name, roof);
+ scopeCrawlUp(processor, scopeOwner, scopeOwner, name, roof, null);
}
public static void scopeCrawlUp(@NotNull PsiScopeProcessor processor, @Nullable ScopeOwner scopeOwner,
- @Nullable ScopeOwner originalScopeOwner, @Nullable String name, @Nullable PsiElement roof) {
+ @Nullable ScopeOwner originalScopeOwner, @Nullable String name, @Nullable PsiElement roof,
+ @Nullable final PsiElement anchor) {
while (scopeOwner != null) {
if (!(scopeOwner instanceof PyClass) || scopeOwner == originalScopeOwner) {
final Scope scope = ControlFlowCache.getScope(scopeOwner);
@@ -136,7 +142,31 @@ public class PyResolveUtil {
}
}
}
- for (NameDefiner definer : scope.getImportedNameDefiners()) {
+ List<NameDefiner> definers = new ArrayList<NameDefiner>(scope.getImportedNameDefiners());
+ if (anchor != null && ScopeUtil.getScopeOwner(anchor) == scopeOwner) {
+ final Comparator<NameDefiner> nearestDefinerComparator = new Comparator<NameDefiner>() {
+ @Override
+ public int compare(NameDefiner a, NameDefiner b) {
+ final boolean aIsBefore = PyPsiUtils.isBefore(a, anchor);
+ final boolean bIsBefore = PyPsiUtils.isBefore(b, anchor);
+ final int diff = a.getTextOffset() - b.getTextOffset();
+ if (aIsBefore && bIsBefore) {
+ return -diff;
+ }
+ else if (aIsBefore) {
+ return -1;
+ }
+ else if (bIsBefore) {
+ return 1;
+ }
+ else {
+ return diff;
+ }
+ }
+ };
+ Collections.sort(definers, nearestDefinerComparator);
+ }
+ for (NameDefiner definer : definers) {
if (!processor.execute(definer, ResolveState.initial())) {
found = true;
break;