don't replace a more specific imported module with a more broad one

This commit is contained in:
Dmitry Jemerov
2010-06-30 22:02:14 +04:00
parent 0d6040ba29
commit 88a19e9bf5
4 changed files with 12 additions and 0 deletions
@@ -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);
}
}
@@ -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);
@@ -1,3 +1,5 @@
import mypackage.goo
def foo():
import mypackage.bar
mypackage.bar.dostuff()