diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java b/python/python-psi-impl/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java index ffc9b0928a13..87400fc1b672 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java +++ b/python/python-psi-impl/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java @@ -133,7 +133,10 @@ public final class ResolveImportUtil { candidate.getClass()); } if (candidate instanceof PsiDirectory) { - candidate = PyUtil.getPackageElement((PsiDirectory)candidate, importStatement); + final var packageElement = PyUtil.getPackageElement((PsiDirectory)candidate, importStatement); + if (packageElement != importStatement.getContainingFile()) { + candidate = packageElement; + } } results.addAll(resolveChildren(candidate, name, file, false, true, false, false)); } diff --git a/python/testData/completion/haveCompletionVariantsForOsPath.py b/python/testData/completion/haveCompletionVariantsForOsPath.py new file mode 100644 index 000000000000..46d2da6c99d3 --- /dev/null +++ b/python/testData/completion/haveCompletionVariantsForOsPath.py @@ -0,0 +1,2 @@ +import os +os.path. \ No newline at end of file diff --git a/python/testData/resolve/multiFile/fromPackageImportIntoInitConflictWithAssignment/pack/__init__.py b/python/testData/resolve/multiFile/fromPackageImportIntoInitConflictWithAssignment/pack/__init__.py new file mode 100644 index 000000000000..0a324a294ffb --- /dev/null +++ b/python/testData/resolve/multiFile/fromPackageImportIntoInitConflictWithAssignment/pack/__init__.py @@ -0,0 +1,7 @@ +from . import mod as mmm_ + +print(mmm_) +print(mod) +mod = mmm_ +# +print(mod) diff --git a/python/testData/resolve/multiFile/fromPackageImportIntoInitConflictWithAssignment/pack/mod.py b/python/testData/resolve/multiFile/fromPackageImportIntoInitConflictWithAssignment/pack/mod.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testSrc/com/jetbrains/python/Py3CompletionTest.java b/python/testSrc/com/jetbrains/python/Py3CompletionTest.java index 00a23617dfff..8849747a46c9 100644 --- a/python/testSrc/com/jetbrains/python/Py3CompletionTest.java +++ b/python/testSrc/com/jetbrains/python/Py3CompletionTest.java @@ -517,6 +517,15 @@ public class Py3CompletionTest extends PyTestCase { myFixture.checkResultByFile(getTestName(true) + "/foo_bar/sample.after.py"); } + // PY-49156 + public void testHaveCompletionVariantsForOsPath() { + myFixture.configureByFile(getTestName(true) + ".py"); + LookupElement[] variants = myFixture.completeBasic(); + assertNotNull(variants); + assertTrue(variants.length > 0); + assertTrue(ContainerUtil.exists(variants, v -> v.getLookupString().equals("join"))); + } + @Override protected String getTestDataPath() { return super.getTestDataPath() + "/completion"; diff --git a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java index 832628c2f0c6..efd0e93dbeb8 100644 --- a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java @@ -636,4 +636,13 @@ public class PyMultiFileResolveTest extends PyMultiFileResolveTestCase { }); }); } + + // PY-49156 + public void testFromPackageImportIntoInitConflictWithAssignment() { + myFixture.copyDirectoryToProject("fromPackageImportIntoInitConflictWithAssignment/pack", "pack"); + final PsiFile psiFile = myFixture.configureByFile("pack/__init__.py"); + final PsiElement result = doResolve(psiFile); + assertInstanceOf(result, PyFile.class); + assertEquals("mod.py", ((PyFile)result).getName()); + } }