Don't ignore files and resolve modules in them (PY-28764)

This commit is contained in:
Semyon Proshev
2018-03-30 15:09:00 +03:00
parent 9dd33df8ad
commit 9c27646752
6 changed files with 34 additions and 5 deletions
@@ -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<PsiDirectory>()
.filterIsInstance<PsiFileSystemItem>()
.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<PsiElement> {
fun resolveModuleAt(name: QualifiedName, item: PsiFileSystemItem?, context: PyQualifiedNameResolveContext): List<PsiElement> {
checkAccess()
val empty = emptyList<PsiElement>()
if (directory == null || !directory.isValid) {
if (item == null || !item.isValid) {
return empty
}
return name.components.fold(listOf<PsiElement>(directory)) { seekers, component ->
return name.components.fold(listOf<PsiElement>(item)) { seekers, component ->
if (component == null) empty
else seekers.flatMap {
val children = ResolveImportUtil.resolveChildren(it, component, context.footholdFile, !context.withMembers,
@@ -0,0 +1,2 @@
from os.path import join
# <ref>
@@ -0,0 +1,4 @@
if a:
import posixpath as path
elif b:
import ntpath as path
@@ -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<PsiElement> 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());
}
);
}
}