diff --git a/python/src/com/jetbrains/python/psi/types/PyModuleType.java b/python/src/com/jetbrains/python/psi/types/PyModuleType.java index c6f6bd2ddea2..6cfe5b12cd6b 100644 --- a/python/src/com/jetbrains/python/psi/types/PyModuleType.java +++ b/python/src/com/jetbrains/python/psi/types/PyModuleType.java @@ -92,7 +92,7 @@ public class PyModuleType implements PyType { // Modules don't descend from obje if (PyUtil.isPackage(anchor, location)) { final ResolveResultList implicitMembers = new ResolveResultList(); processImplicitPackageMembers(anchor, location, importedModule, n -> name.endsWith(n), results -> { - implicitMembers.addAll(results); + implicitMembers.addAll(convertDirsToInit(results)); return implicitMembers.isEmpty(); }); if (!implicitMembers.isEmpty()) { @@ -238,6 +238,20 @@ public class PyModuleType implements PyType { // Modules don't descend from obje } } + private static @NotNull + List convertDirsToInit(@NotNull List ratedResolveList) { + return ContainerUtil.map(ratedResolveList, result -> { + final PsiElement element = result.getElement(); + if (element instanceof PsiDirectory) { + final PsiElement pkgInit = PyUtil.turnDirIntoInit(element); + return pkgInit != null ? result.replace(pkgInit) : result; + } + else { + return result; + } + }); + } + @Nullable private static PsiElement resolveByMembersProviders(PyFile module, String name, @NotNull PyResolveContext resolveContext) { for (PyModuleMembersProvider provider : Extensions.getExtensions(PyModuleMembersProvider.EP_NAME)) { diff --git a/python/testData/resolve/multiFile/importResolvesToPkgInit/pkg1/__init__.py b/python/testData/resolve/multiFile/importResolvesToPkgInit/pkg1/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/resolve/multiFile/importResolvesToPkgInit/pkg1/pkg2/__init__.py b/python/testData/resolve/multiFile/importResolvesToPkgInit/pkg1/pkg2/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/resolve/multiFile/importResolvesToPkgInit/pkg1/pkg2/mod1.py b/python/testData/resolve/multiFile/importResolvesToPkgInit/pkg1/pkg2/mod1.py new file mode 100644 index 000000000000..3ecd747d1a0d --- /dev/null +++ b/python/testData/resolve/multiFile/importResolvesToPkgInit/pkg1/pkg2/mod1.py @@ -0,0 +1,4 @@ +import pkg1 + +pkg1.pkg2 +# # \ 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 534319bb0487..7ec62d2fe39f 100644 --- a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java @@ -571,4 +571,9 @@ public class PyMultiFileResolveTest extends PyMultiFileResolveTestCase { prepareTestDirectory(); assertSameElements(doMultiResolveAndGetFileUrls("pkg1/pkg2/mod1.py"), "pkg1/pkg2/mod1.py"); } + + public void testImportResolvesToPkgInit() { + prepareTestDirectory(); + assertSameElements(doMultiResolveAndGetFileUrls("pkg1/pkg2/mod1.py"), "pkg1/pkg2/__init__.py"); + } } \ No newline at end of file