diff --git a/python/pluginTestSrc/com/jetbrains/jython/PyToJavaResolveTest.java b/python/pluginTestSrc/com/jetbrains/jython/PyToJavaResolveTest.java index 1d9602795fa7..f59be673c4d8 100644 --- a/python/pluginTestSrc/com/jetbrains/jython/PyToJavaResolveTest.java +++ b/python/pluginTestSrc/com/jetbrains/jython/PyToJavaResolveTest.java @@ -15,12 +15,19 @@ */ package com.jetbrains.jython; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; +import com.intellij.testFramework.PsiTestUtil; import com.intellij.testFramework.ResolveTestCase; import com.intellij.testFramework.TestDataPath; +import com.intellij.util.containers.ContainerUtil; import com.jetbrains.python.PythonHelpersLocator; +import com.jetbrains.python.psi.PyFile; import junit.framework.Assert; +import java.util.List; + /** * @author yole */ @@ -85,6 +92,23 @@ public class PyToJavaResolveTest extends ResolveTestCase { Assert.assertEquals("println", ((PsiMethod) target).getName()); } + // PY-23265, PY-23857 + public void testPurePythonSymbolsFirst() throws Exception { + final LocalFileSystem fs = LocalFileSystem.getInstance(); + final VirtualFile tmpDir = fs.findFileByIoFile(createTempDirectory()); + copyDirContentsTo(fs.findFileByPath(getTestDataPath() + getTestName(true)), tmpDir); + PsiTestUtil.addSourceRoot(getModule(), tmpDir.findChild("src")); + + final PsiReference ref = configureByFile(getTestName(true) + "/src/main.py", tmpDir); + final PsiPolyVariantReference multiRef = (PsiPolyVariantReference)ref; + final ResolveResult[] results = multiRef.multiResolve(false); + final List targets = ContainerUtil.map(results, ResolveResult::getElement); + + assertSize(2, targets); + assertInstanceOf(targets.get(0), PyFile.class); + assertInstanceOf(targets.get(1), PsiPackage.class); + } + @Override protected String getTestDataPath() { return PythonHelpersLocator.getPythonCommunityPath() + "/testData/resolve/pyToJava/"; diff --git a/python/src/com/jetbrains/python/psi/resolve/PyResolveImportUtil.kt b/python/src/com/jetbrains/python/psi/resolve/PyResolveImportUtil.kt index d8d3d61330bf..2888c0c52445 100644 --- a/python/src/com/jetbrains/python/psi/resolve/PyResolveImportUtil.kt +++ b/python/src/com/jetbrains/python/psi/resolve/PyResolveImportUtil.kt @@ -82,8 +82,8 @@ fun resolveQualifiedName(name: QualifiedName, context: PyQualifiedNameResolveCon val pythonResults = listOf(relativeResults, resultsFromRoots(name, context), relativeResultsFromSkeletons(name, context)).flatten().distinct() - val allResults = foreignResults + pythonResults - val results = if (name.componentCount > 0) foreignResults + findFirstResults(pythonResults) else allResults + val allResults = pythonResults + foreignResults + val results = if (name.componentCount > 0) findFirstResults(pythonResults) + foreignResults else allResults if (mayCache) { cache?.put(key, results) @@ -250,9 +250,10 @@ private fun resultsFromRoots(name: QualifiedName, context: PyQualifiedNameResolv val visitor = RootVisitor { root, module, sdk, isModuleSource -> val results = if (isModuleSource) moduleResults else sdkResults + val effectiveSdk = sdk ?: context.effectiveSdk if (!root.isValid || root == PyUserSkeletonsUtil.getUserSkeletonsDirectory() || - sdk != null && PyTypeShed.isInside(root) && !PyTypeShed.maySearchForStubInRoot(name, root, sdk)) { + effectiveSdk != null && PyTypeShed.isInside(root) && !PyTypeShed.maySearchForStubInRoot(name, root, effectiveSdk)) { return@RootVisitor true } results.addAll(resolveInRoot(name, root, context)) diff --git a/python/testData/resolve/pyToJava/purePythonSymbolsFirst/src/main.py b/python/testData/resolve/pyToJava/purePythonSymbolsFirst/src/main.py new file mode 100644 index 000000000000..6b40aaab4645 --- /dev/null +++ b/python/testData/resolve/pyToJava/purePythonSymbolsFirst/src/main.py @@ -0,0 +1,3 @@ +import pkg + +print(pkg) diff --git a/python/testData/resolve/pyToJava/purePythonSymbolsFirst/src/pkg/__init__.py b/python/testData/resolve/pyToJava/purePythonSymbolsFirst/src/pkg/__init__.py new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/python/testData/resolve/pyToJava/purePythonSymbolsFirst/src/pkg/__init__.py @@ -0,0 +1 @@ +