ensure packages resolve to __init__.py when possible

This commit is contained in:
fitermay
2018-03-13 18:11:11 +03:00
committed by Andrey Vlasovskikh
parent 972c9fb44e
commit bd2a9bbfee
5 changed files with 24 additions and 1 deletions
@@ -92,7 +92,7 @@ public class PyModuleType implements PyType { // Modules don't descend from obje
if (PyUtil.isPackage(anchor, location)) {
final ResolveResultList implicitMembers = new ResolveResultList();
processImplicitPackageMembers(anchor, location, importedModule, n -> name.endsWith(n), results -> {
implicitMembers.addAll(results);
implicitMembers.addAll(convertDirsToInit(results));
return implicitMembers.isEmpty();
});
if (!implicitMembers.isEmpty()) {
@@ -238,6 +238,20 @@ public class PyModuleType implements PyType { // Modules don't descend from obje
}
}
private static @NotNull
List<? extends RatedResolveResult> convertDirsToInit(@NotNull List<? extends RatedResolveResult> ratedResolveList) {
return ContainerUtil.map(ratedResolveList, result -> {
final PsiElement element = result.getElement();
if (element instanceof PsiDirectory) {
final PsiElement pkgInit = PyUtil.turnDirIntoInit(element);
return pkgInit != null ? result.replace(pkgInit) : result;
}
else {
return result;
}
});
}
@Nullable
private static PsiElement resolveByMembersProviders(PyFile module, String name, @NotNull PyResolveContext resolveContext) {
for (PyModuleMembersProvider provider : Extensions.getExtensions(PyModuleMembersProvider.EP_NAME)) {
@@ -0,0 +1,4 @@
import pkg1
pkg1.pkg2
# #<ref>
@@ -571,4 +571,9 @@ public class PyMultiFileResolveTest extends PyMultiFileResolveTestCase {
prepareTestDirectory();
assertSameElements(doMultiResolveAndGetFileUrls("pkg1/pkg2/mod1.py"), "pkg1/pkg2/mod1.py");
}
public void testImportResolvesToPkgInit() {
prepareTestDirectory();
assertSameElements(doMultiResolveAndGetFileUrls("pkg1/pkg2/mod1.py"), "pkg1/pkg2/__init__.py");
}
}