PY-28461 Fixed completion for implicit package members imported via relative imports from the same level

This commit is contained in:
Andrey Vlasovskikh
2018-03-16 15:08:34 +03:00
parent 52c0422028
commit a8650dfd23
11 changed files with 30 additions and 9 deletions
@@ -16,6 +16,7 @@ import com.intellij.psi.*;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.QualifiedName;
import com.intellij.util.ObjectUtils;
import com.intellij.util.ProcessingContext;
import com.intellij.util.Processor;
import com.intellij.util.containers.ContainerUtil;
@@ -285,8 +286,8 @@ public class PyModuleType implements PyType { // Modules don't descend from obje
private static List<QualifiedName> getImportedQNames(@NotNull PyImportElement element) {
final List<QualifiedName> importedQNames = new ArrayList<>();
final PyStatement stmt = element.getContainingImportStatement();
if (stmt instanceof PyFromImportStatement) {
final PyFromImportStatement fromImportStatement = (PyFromImportStatement)stmt;
final PyFromImportStatement fromImportStatement = ObjectUtils.tryCast(stmt, PyFromImportStatement.class);
if (fromImportStatement != null) {
final QualifiedName importedQName = fromImportStatement.getImportSourceQName();
final String visibleName = element.getVisibleName();
if (importedQName != null) {
@@ -316,7 +317,8 @@ public class PyModuleType implements PyType { // Modules don't descend from obje
importedQNames.add(importedQName);
}
}
if (!ResolveImportUtil.isAbsoluteImportEnabledFor(element)) {
if (!ResolveImportUtil.isAbsoluteImportEnabledFor(element) ||
(fromImportStatement != null && fromImportStatement.getRelativeLevel() == 1)) {
PsiFile file = element.getContainingFile();
if (file != null) {
file = file.getOriginalFile();
@@ -1,2 +1,2 @@
import pkg1
pkg1.<caret>
pkg1.<caret>
@@ -1 +1 @@
foo=1
foo = 1
@@ -1 +1 @@
bar = 1
bar = 1
@@ -1 +1 @@
foo2
foo2 = 0
@@ -0,0 +1,2 @@
import pkg1
pkg1.<caret>
@@ -0,0 +1,3 @@
from .m1 import foo
from pkg1.pkg2 import bar
from .pkg3 import foo2
@@ -0,0 +1 @@
foo = 1
@@ -1255,14 +1255,25 @@ public class PythonCompletionTest extends PyTestCase {
assertContainsElements(suggested, "__init__(self)");
}
//PY-28461
// PY-28461
public void testImplicitImportsInsidePackage() {
runWithLanguageLevel(LanguageLevel.PYTHON37,
() -> doMultiFileAssertSameElements("m1", "pkg2", "pkg3", "bar", "foo", "foo2"));
}
// PY-28461
public void testImplicitImportsInsidePackagePy2() {
runWithLanguageLevel(LanguageLevel.PYTHON27,
() -> doMultiFileAssertSameElements("m1", "pkg2", "pkg3", "bar", "foo", "foo2"));
}
private void doMultiFileAssertSameElements(String... variants) {
myFixture.copyDirectoryToProject(getTestName(true), "");
myFixture.configureByFile("a.py");
myFixture.completeBasic();
final List<String> suggested = myFixture.getLookupElementStrings();
assertNotNull(suggested);
assertSameElements(suggested, "m1", "pkg2", "pkg3", "bar", "foo", "foo2");
assertSameElements(suggested, variants);
}
@Override