diff --git a/python/src/com/jetbrains/python/psi/resolve/PyResolveImportUtil.kt b/python/src/com/jetbrains/python/psi/resolve/PyResolveImportUtil.kt index 0f3b45adb2ae..328685ece839 100644 --- a/python/src/com/jetbrains/python/psi/resolve/PyResolveImportUtil.kt +++ b/python/src/com/jetbrains/python/psi/resolve/PyResolveImportUtil.kt @@ -122,7 +122,7 @@ private fun resolveModuleFromRoots(name: QualifiedName, context: PyQualifiedName return nameNoHead.components.fold(resultsFromRoots(head, context)) { results, component -> findFirstResults(results, context.module) .asSequence() - .filterIsInstance() + .filterIsInstance() .flatMap { resolveModuleAt(QualifiedName.fromComponents(component), it, context).asSequence() } .toList() } @@ -143,15 +143,15 @@ fun resolveTopLevelMember(name: QualifiedName, context : PyQualifiedNameResolveC } /** - * Resolves a [name] relative to the specified [directory]. + * Resolves a [name] relative to the specified [item]. */ -fun resolveModuleAt(name: QualifiedName, directory: PsiDirectory?, context: PyQualifiedNameResolveContext): List { +fun resolveModuleAt(name: QualifiedName, item: PsiFileSystemItem?, context: PyQualifiedNameResolveContext): List { checkAccess() val empty = emptyList() - if (directory == null || !directory.isValid) { + if (item == null || !item.isValid) { return empty } - return name.components.fold(listOf(directory)) { seekers, component -> + return name.components.fold(listOf(item)) { seekers, component -> if (component == null) empty else seekers.flatMap { val children = ResolveImportUtil.resolveChildren(it, component, context.footholdFile, !context.withMembers, diff --git a/python/testData/resolve/multiFile/osAttributesFromPosixPathAndNTPath/a.py b/python/testData/resolve/multiFile/osAttributesFromPosixPathAndNTPath/a.py new file mode 100644 index 000000000000..be866eaa1966 --- /dev/null +++ b/python/testData/resolve/multiFile/osAttributesFromPosixPathAndNTPath/a.py @@ -0,0 +1,2 @@ +from os.path import join +# \ No newline at end of file diff --git a/python/testData/resolve/multiFile/osAttributesFromPosixPathAndNTPath/lib/ntpath.py b/python/testData/resolve/multiFile/osAttributesFromPosixPathAndNTPath/lib/ntpath.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/resolve/multiFile/osAttributesFromPosixPathAndNTPath/lib/os.py b/python/testData/resolve/multiFile/osAttributesFromPosixPathAndNTPath/lib/os.py new file mode 100644 index 000000000000..8217b070f3eb --- /dev/null +++ b/python/testData/resolve/multiFile/osAttributesFromPosixPathAndNTPath/lib/os.py @@ -0,0 +1,4 @@ +if a: + import posixpath as path +elif b: + import ntpath as path \ No newline at end of file diff --git a/python/testData/resolve/multiFile/osAttributesFromPosixPathAndNTPath/lib/posixpath.py b/python/testData/resolve/multiFile/osAttributesFromPosixPathAndNTPath/lib/posixpath.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 565751ec7a07..fdde049e300c 100644 --- a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java @@ -24,6 +24,7 @@ import com.jetbrains.python.sdk.PythonSdkType; import org.jetbrains.annotations.NotNull; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -559,4 +560,26 @@ public class PyMultiFileResolveTest extends PyMultiFileResolveTestCase { prepareTestDirectory(); assertSameElements(doMultiResolveAndGetFileUrls("pkg1/pkg2/mod1.py"), "pkg1/pkg2/__init__.py"); } + + // PY-28764 + public void testOsAttributesFromPosixPathAndNTPath() { + myFixture.copyDirectoryToProject(getTestName(true), ""); + + runWithSourceRoots( + Collections.singletonList(myFixture.findFileInTempDir("lib")), + () -> { + final PsiReference reference = PyResolveTestCase.findReferenceByMarker(myFixture.configureByFile("a.py")); + assertInstanceOf(reference, PsiPolyVariantReference.class); + + final List elements = PyUtil.multiResolveTopPriority((PsiPolyVariantReference)reference); + assertEquals(1, elements.size()); + + final PsiElement element = elements.get(0); + assertInstanceOf(element, PyFile.class); + + final VirtualFile file = ((PyFile)element).getVirtualFile(); + assertEquals("ntpath.py", file.getName()); + } + ); + } } \ No newline at end of file