diff --git a/python/src/com/jetbrains/python/psi/types/PyModuleType.java b/python/src/com/jetbrains/python/psi/types/PyModuleType.java index 2cfef4d1ff2a..cd642a6910cf 100644 --- a/python/src/com/jetbrains/python/psi/types/PyModuleType.java +++ b/python/src/com/jetbrains/python/psi/types/PyModuleType.java @@ -106,6 +106,10 @@ public class PyModuleType implements PyType { // Modules don't descend from obje if (!inSameFile(location, myModule)) { importElements.addAll(myModule.getImportTargets()); } + final List imports = myModule.getFromImports(); + for (PyFromImportStatement anImport : imports) { + Collections.addAll(importElements, anImport.getImportElements()); + } } final List implicitMembers = resolveImplicitPackageMember(name, importElements); if (implicitMembers != null) { @@ -185,6 +189,18 @@ public class PyModuleType implements PyType { // Modules don't descend from obje importedQNames.add(implicitSubModuleQName); } } + else { + final List elements = ResolveImportUtil.resolveFromImportStatementSource(fromImportStatement, element.getImportedQName()); + for (PsiElement psiElement : elements) { + if (psiElement instanceof PsiFile) { + final VirtualFile virtualFile = ((PsiFile)psiElement).getVirtualFile(); + final QualifiedName qName = QualifiedNameFinder.findShortestImportableQName(element, virtualFile); + if (qName != null) { + importedQNames.add(qName); + } + } + } + } } else if (stmt instanceof PyImportStatement) { final QualifiedName importedQName = element.getImportedQName(); diff --git a/python/testData/resolve/multiFile/relativeImport/RelativeImport.py b/python/testData/resolve/multiFile/relativeImport/RelativeImport.py new file mode 100644 index 000000000000..2a53048be7ae --- /dev/null +++ b/python/testData/resolve/multiFile/relativeImport/RelativeImport.py @@ -0,0 +1,4 @@ +import x + +print(x.z) +# diff --git a/python/testData/resolve/multiFile/relativeImport/x/__init__.py b/python/testData/resolve/multiFile/relativeImport/x/__init__.py new file mode 100644 index 000000000000..d7c3d7cec70a --- /dev/null +++ b/python/testData/resolve/multiFile/relativeImport/x/__init__.py @@ -0,0 +1,5 @@ +__author__ = 'ktisha' + +from . import z as qq + +print(z) \ No newline at end of file diff --git a/python/testData/resolve/multiFile/relativeImport/x/z.py b/python/testData/resolve/multiFile/relativeImport/x/z.py new file mode 100644 index 000000000000..ab9d841608ef --- /dev/null +++ b/python/testData/resolve/multiFile/relativeImport/x/z.py @@ -0,0 +1,4 @@ +__author__ = 'ktisha' + +def foo(): + return 1 \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java index d5dbea0a5b30..97060e8922e3 100644 --- a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java @@ -402,4 +402,9 @@ public class PyMultiFileResolveTest extends PyMultiFileResolveTestCase { } assertResolveResult(element, PyClass.class, "A"); } + + public void testRelativeImport() { + assertResolvesTo(PyFile.class, "z.py"); + } + } \ No newline at end of file