diff --git a/python/src/com/jetbrains/python/psi/impl/PyImportedModule.java b/python/src/com/jetbrains/python/psi/impl/PyImportedModule.java index 61cdf56fcef1..0adc79d2e176 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyImportedModule.java +++ b/python/src/com/jetbrains/python/psi/impl/PyImportedModule.java @@ -147,7 +147,7 @@ public class PyImportedModule extends LightElement implements NameDefiner { element = ResolveImportUtil.resolveImportElement(myImportElement, myImportedPrefix); } else { - element = ResolveImportUtil.resolveModuleInRoots(getImportedPrefix(), getContainingFile()); + element = ResolveImportUtil.resolveModuleInRoots(myImportedPrefix, myContainingFile); } if (element instanceof PsiDirectory) { return PyUtil.getPackageElement((PsiDirectory)element, this); diff --git a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java index 6cfdbe15cce8..37e2d63f9f99 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java @@ -36,10 +36,7 @@ import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.references.PyImportReference; import com.jetbrains.python.psi.impl.references.PyQualifiedReference; import com.jetbrains.python.psi.impl.references.PyReferenceImpl; -import com.jetbrains.python.psi.resolve.ImplicitResolveResult; -import com.jetbrains.python.psi.resolve.PyResolveContext; -import com.jetbrains.python.psi.resolve.QualifiedResolveResult; -import com.jetbrains.python.psi.resolve.RatedResolveResult; +import com.jetbrains.python.psi.resolve.*; import com.jetbrains.python.psi.types.*; import com.jetbrains.python.refactoring.PyDefUseUtil; import org.jetbrains.annotations.NotNull; @@ -385,19 +382,11 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere if (PyUtil.isPackage(dir, anchor)) { final PsiFile containingFile = anchor.getContainingFile(); if (containingFile instanceof PyFile) { - final PyImportElement importElement = PsiTreeUtil.getParentOfType(anchor, PyImportElement.class); - final QualifiedName qualifiedName; - if (importElement != null) { - qualifiedName = anchor.asQualifiedName(); + final QualifiedName qualifiedName = QualifiedNameFinder.findShortestImportableQName(dir); + if (qualifiedName != null) { + final PyImportedModule module = new PyImportedModule(null, (PyFile)containingFile, qualifiedName); + return new PyImportedModuleType(module); } - else { - qualifiedName = QualifiedName.fromComponents(dir.getName()); - } - if (qualifiedName == null) { - return null; - } - final PyImportedModule module = new PyImportedModule(importElement, (PyFile)containingFile, qualifiedName); - return new PyImportedModuleType(module); } } } diff --git a/python/testData/resolve/multiFile/moduleInDeeplyNestedNamespacePackage/ModuleInDeeplyNestedNamespacePackage.py b/python/testData/resolve/multiFile/moduleInDeeplyNestedNamespacePackage/ModuleInDeeplyNestedNamespacePackage.py new file mode 100644 index 000000000000..617580b055ce --- /dev/null +++ b/python/testData/resolve/multiFile/moduleInDeeplyNestedNamespacePackage/ModuleInDeeplyNestedNamespacePackage.py @@ -0,0 +1,4 @@ +import pkg1.pkg2.m1 + +pkg1.pkg2.m1 + \ No newline at end of file diff --git a/python/testData/resolve/multiFile/moduleInDeeplyNestedNamespacePackage/pkg1/pkg2/m1.py b/python/testData/resolve/multiFile/moduleInDeeplyNestedNamespacePackage/pkg1/pkg2/m1.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java index 4585832844eb..6073f713eb0e 100644 --- a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java @@ -373,4 +373,13 @@ public class PyMultiFileResolveTest extends PyMultiFileResolveTestCase { public void testModulePrivateNameInDunderAll() { assertResolvesTo(PyTargetExpression.class, "_private_name"); } + + public void testModuleInDeeplyNestedNamespacePackage() { + runWithLanguageLevel(LanguageLevel.PYTHON33, new Runnable() { + @Override + public void run() { + assertResolvesTo(PyFile.class, "m1.py"); + } + }); + } }