From 88a19e9bf58d9b5aadb93f951ff08b1b230d984b Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 30 Jun 2010 19:44:16 +0400 Subject: [PATCH] don't replace a more specific imported module with a more broad one --- .../src/com/jetbrains/python/psi/impl/PyImportedModule.java | 4 ++++ .../com/jetbrains/python/psi/resolve/ResolveProcessor.java | 6 ++++++ .../testData/resolve/multiFile/localImport/LocalImport.py | 2 ++ .../testData/resolve/multiFile/localImport/mypackage/goo.py | 0 4 files changed, 12 insertions(+) create mode 100644 python/testData/resolve/multiFile/localImport/mypackage/goo.py diff --git a/python/src/com/jetbrains/python/psi/impl/PyImportedModule.java b/python/src/com/jetbrains/python/psi/impl/PyImportedModule.java index e64cae41f9c3..6805f7403f27 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyImportedModule.java +++ b/python/src/com/jetbrains/python/psi/impl/PyImportedModule.java @@ -163,4 +163,8 @@ public class PyImportedModule extends LightElement implements NameDefiner { private PsiElement resolve(PyImportElement importElement, final PyQualifiedName prefix) { return PyUtil.turnDirIntoInit(ResolveImportUtil.resolveImportElement(importElement, prefix)); } + + public boolean isAncestorOf(PyImportedModule other) { + return PsiTreeUtil.isAncestor(myContainer, other.myContainer, true); + } } diff --git a/python/src/com/jetbrains/python/psi/resolve/ResolveProcessor.java b/python/src/com/jetbrains/python/psi/resolve/ResolveProcessor.java index 37ad76073779..96b1ba5942df 100644 --- a/python/src/com/jetbrains/python/psi/resolve/ResolveProcessor.java +++ b/python/src/com/jetbrains/python/psi/resolve/ResolveProcessor.java @@ -78,6 +78,12 @@ public class ResolveProcessor implements PyAsScopeProcessor { final NameDefiner definer = (NameDefiner)element; PsiElement by_name = definer.getElementNamed(myName); if (by_name != null) { + // prefer more specific imported modules to less specific ones + if (by_name instanceof PyImportedModule && myResult instanceof PyImportedModule && + ((PyImportedModule)by_name).isAncestorOf((PyImportedModule)myResult)) { + return false; + } + setResult(by_name); if (!PsiTreeUtil.isAncestor(element, by_name, true)) { addNameDefiner(definer); diff --git a/python/testData/resolve/multiFile/localImport/LocalImport.py b/python/testData/resolve/multiFile/localImport/LocalImport.py index 9852379debeb..cadaa6836b27 100644 --- a/python/testData/resolve/multiFile/localImport/LocalImport.py +++ b/python/testData/resolve/multiFile/localImport/LocalImport.py @@ -1,3 +1,5 @@ +import mypackage.goo + def foo(): import mypackage.bar mypackage.bar.dostuff() diff --git a/python/testData/resolve/multiFile/localImport/mypackage/goo.py b/python/testData/resolve/multiFile/localImport/mypackage/goo.py new file mode 100644 index 000000000000..e69de29bb2d1