diff --git a/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java b/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java index 01bcf032bfa2..19f247d4a4bf 100644 --- a/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java +++ b/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java @@ -15,14 +15,12 @@ */ package com.jetbrains.python.psi.types; -import com.google.common.collect.Sets; import com.intellij.codeInsight.lookup.LookupElement; -import com.intellij.openapi.util.Condition; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.util.ArrayUtil; import com.intellij.util.ProcessingContext; -import com.intellij.util.containers.ContainerUtil; import com.jetbrains.python.psi.AccessDirection; import com.jetbrains.python.psi.PyExpression; import com.jetbrains.python.psi.PyFile; @@ -38,7 +36,6 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Set; /** * @author yole @@ -57,21 +54,9 @@ public class PyImportedModuleType implements PyType { @NotNull AccessDirection direction, @NotNull PyResolveContext resolveContext) { final PsiElement resolved = myImportedModule.resolve(); - if (resolved instanceof PyFile) { - final PyFile file = (PyFile)resolved; - return new PyModuleType(file, myImportedModule).resolveMember(name, location, direction, resolveContext); - } - else if (resolved instanceof PsiDirectory) { - List elements = Collections.singletonList(ResolveImportUtil.resolveChild(resolved, name, null, true, true)); - if (location != null && ResolveImportUtil.getPointInImport(location) == PointInImport.NONE) { - final Set imported = Sets.newHashSet(PyModuleType.collectImportedSubmodules((PsiDirectory)resolved, location)); - elements = ContainerUtil.filter(elements, new Condition() { - @Override - public boolean value(PsiElement element) { - return imported.contains(element); - } - }); - } + if (resolved != null) { + final PsiFile containingFile = location != null ? location.getContainingFile() : null; + List elements = Collections.singletonList(ResolveImportUtil.resolveChild(resolved, name, containingFile, false, true)); return ResolveImportUtil.rateResults(elements); } return null; diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/ImplicitlyImportedSubModule/a.py b/python/testData/inspections/PyUnresolvedReferencesInspection/ImplicitlyImportedSubModule/a.py new file mode 100644 index 000000000000..6de874dee44a --- /dev/null +++ b/python/testData/inspections/PyUnresolvedReferencesInspection/ImplicitlyImportedSubModule/a.py @@ -0,0 +1,5 @@ +import pkg1.m1 + +print(pkg1.m2) +print(pkg1.nonexistent) + diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/ImplicitlyImportedSubModule/pkg1/__init__.py b/python/testData/inspections/PyUnresolvedReferencesInspection/ImplicitlyImportedSubModule/pkg1/__init__.py new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/python/testData/inspections/PyUnresolvedReferencesInspection/ImplicitlyImportedSubModule/pkg1/__init__.py @@ -0,0 +1 @@ + diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/ImplicitlyImportedSubModule/pkg1/m1.py b/python/testData/inspections/PyUnresolvedReferencesInspection/ImplicitlyImportedSubModule/pkg1/m1.py new file mode 100644 index 000000000000..123f7cbbfd9d --- /dev/null +++ b/python/testData/inspections/PyUnresolvedReferencesInspection/ImplicitlyImportedSubModule/pkg1/m1.py @@ -0,0 +1 @@ +import pkg1.m2 diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/ImplicitlyImportedSubModule/pkg1/m2.py b/python/testData/inspections/PyUnresolvedReferencesInspection/ImplicitlyImportedSubModule/pkg1/m2.py new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/python/testData/inspections/PyUnresolvedReferencesInspection/ImplicitlyImportedSubModule/pkg1/m2.py @@ -0,0 +1 @@ + diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection3K/NotImportedSubmodulesOfNamespacePackage/main.py b/python/testData/inspections/PyUnresolvedReferencesInspection3K/NotImportedSubmodulesOfNamespacePackage/main.py deleted file mode 100644 index 54e2273f4550..000000000000 --- a/python/testData/inspections/PyUnresolvedReferencesInspection3K/NotImportedSubmodulesOfNamespacePackage/main.py +++ /dev/null @@ -1,5 +0,0 @@ -import nspkg1.m2 - -print(nspkg1.m2) -print(nspkg1.m3) -print(nspkg1.nssubpkg1) diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection3K/NotImportedSubmodulesOfNamespacePackage/nspkg1/m2.py b/python/testData/inspections/PyUnresolvedReferencesInspection3K/NotImportedSubmodulesOfNamespacePackage/nspkg1/m2.py deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection3K/NotImportedSubmodulesOfNamespacePackage/nspkg1/m3.py b/python/testData/inspections/PyUnresolvedReferencesInspection3K/NotImportedSubmodulesOfNamespacePackage/nspkg1/m3.py deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection3K/NotImportedSubmodulesOfNamespacePackage/nspkg1/nssubpkg1/m1.py b/python/testData/inspections/PyUnresolvedReferencesInspection3K/NotImportedSubmodulesOfNamespacePackage/nspkg1/nssubpkg1/m1.py deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/python/testData/inspections/unusedImport/unusedSubmodule/p1/__init__.py b/python/testData/inspections/unusedImport/unusedSubmodule/p1/__init__.py deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/python/testData/inspections/unusedImport/unusedSubmodule/p1/m1.py b/python/testData/inspections/unusedImport/unusedSubmodule/p1/m1.py deleted file mode 100644 index a43e3eb876c1..000000000000 --- a/python/testData/inspections/unusedImport/unusedSubmodule/p1/m1.py +++ /dev/null @@ -1 +0,0 @@ -a1 = 42 \ No newline at end of file diff --git a/python/testData/inspections/unusedImport/unusedSubmodule/p1/m2.py b/python/testData/inspections/unusedImport/unusedSubmodule/p1/m2.py deleted file mode 100644 index 97f0eb4ade34..000000000000 --- a/python/testData/inspections/unusedImport/unusedSubmodule/p1/m2.py +++ /dev/null @@ -1 +0,0 @@ -a2 = -1 \ No newline at end of file diff --git a/python/testData/inspections/unusedImport/unusedSubmodule/test1.py b/python/testData/inspections/unusedImport/unusedSubmodule/test1.py deleted file mode 100644 index 40e9e79d3ac1..000000000000 --- a/python/testData/inspections/unusedImport/unusedSubmodule/test1.py +++ /dev/null @@ -1,3 +0,0 @@ -import p1.m1 - -print(p1.m2.a2) diff --git a/python/testData/resolve/multiFile/fromImportSubModuleDunderAll/FromImportSubModuleDunderAll.py b/python/testData/resolve/multiFile/fromImportSubModuleDunderAll/FromImportSubModuleDunderAll.py new file mode 100644 index 000000000000..e5ee56c5fc66 --- /dev/null +++ b/python/testData/resolve/multiFile/fromImportSubModuleDunderAll/FromImportSubModuleDunderAll.py @@ -0,0 +1,4 @@ +from pkg1 import m1 + +print(m1) +# diff --git a/python/testData/resolve/multiFile/fromImportSubModuleDunderAll/pkg1/__init__.py b/python/testData/resolve/multiFile/fromImportSubModuleDunderAll/pkg1/__init__.py new file mode 100644 index 000000000000..a6d9575178da --- /dev/null +++ b/python/testData/resolve/multiFile/fromImportSubModuleDunderAll/pkg1/__init__.py @@ -0,0 +1 @@ +__all__ = ['m1'] diff --git a/python/testData/resolve/multiFile/fromImportSubModuleDunderAll/pkg1/m1.py b/python/testData/resolve/multiFile/fromImportSubModuleDunderAll/pkg1/m1.py new file mode 100644 index 000000000000..9332a2735b6a --- /dev/null +++ b/python/testData/resolve/multiFile/fromImportSubModuleDunderAll/pkg1/m1.py @@ -0,0 +1,2 @@ +def foo(): + pass diff --git a/python/testData/resolve/multiFile/importSubModuleDunderAll/ImportSubModuleDunderAll.py b/python/testData/resolve/multiFile/importSubModuleDunderAll/ImportSubModuleDunderAll.py index e5ee56c5fc66..7bba9e409ba0 100644 --- a/python/testData/resolve/multiFile/importSubModuleDunderAll/ImportSubModuleDunderAll.py +++ b/python/testData/resolve/multiFile/importSubModuleDunderAll/ImportSubModuleDunderAll.py @@ -1,4 +1,4 @@ -from pkg1 import m1 +import pkg1.m1 -print(m1) -# +print(pkg1.m1) +# diff --git a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java index fd5ee281e4a8..fdec830dbaef 100644 --- a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java @@ -407,7 +407,13 @@ public class PyMultiFileResolveTest extends PyMultiFileResolveTestCase { assertResolvesTo(PyFile.class, "z.py"); } + // PY-11454 public void testImportSubModuleDunderAll() { assertResolvesTo(PyFile.class, "m1.py"); } + + // PY-11454 + public void testFromImportSubModuleDunderAll() { + assertResolvesTo(PyFile.class, "m1.py"); + } } \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java index 1a29300f947d..9cdac1dd034b 100644 --- a/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java @@ -112,11 +112,6 @@ public class Py3UnresolvedReferencesInspectionTest extends PyTestCase { doTest(); } - // PY-14385 - public void testNotImportedSubmodulesOfNamespacePackage() { - doMultiFileTest("main.py"); - } - // PY-15017 public void testClassLevelReferenceInMethodAnnotation() { doTest(); diff --git a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java index 1499084c4def..6e0c1b333f7a 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java @@ -510,6 +510,11 @@ public class PyUnresolvedReferencesInspectionTest extends PyInspectionTestCase { doTest(); } + // PY-14615 + public void testImplicitlyImportedSubModule() { + doMultiFileTest(); + } + @NotNull @Override protected Class getInspectionClass() { diff --git a/python/testSrc/com/jetbrains/python/inspections/PyUnusedImportTest.java b/python/testSrc/com/jetbrains/python/inspections/PyUnusedImportTest.java index 018d75e8fbde..1ce20f386adf 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyUnusedImportTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyUnusedImportTest.java @@ -38,11 +38,6 @@ public class PyUnusedImportTest extends PyTestCase { doTest("test1.py"); } - // PY-5621 - public void testUnusedSubmodule() { - doTest("test1.py"); - } - // PY-6380 public void testUnusedAfterStarImport() { doTest("test1.py");