diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java b/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java index 13100e9c0600..df15e9219b1e 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyImportReference.java @@ -26,12 +26,13 @@ import com.intellij.openapi.editor.Editor; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.QualifiedName; import com.intellij.util.ArrayUtil; import com.intellij.util.ProcessingContext; import com.jetbrains.python.PyNames; import com.jetbrains.python.PyTokenTypes; import com.jetbrains.python.psi.*; -import com.intellij.psi.util.QualifiedName; +import com.jetbrains.python.psi.impl.PyPsiUtils; import com.jetbrains.python.psi.impl.PyReferenceExpressionImpl; import com.jetbrains.python.psi.resolve.*; import com.jetbrains.python.psi.types.PyModuleType; @@ -222,10 +223,10 @@ public class PyImportReference extends PyReferenceImpl { } } else { // in "import _" or "from _ import" - ASTNode n = myElement.getNode().getTreePrev(); - while (n != null && n.getElementType() == PyTokenTypes.DOT) { + PsiElement prevElem = PyPsiUtils.getPrevNonWhitespaceSibling(myElement); + while (prevElem != null && prevElem.getNode().getElementType() == PyTokenTypes.DOT) { relativeLevel += 1; - n = n.getTreePrev(); + prevElem = PyPsiUtils.getPrevNonWhitespaceSibling(prevElem); } if (fromImport != null) { addImportedNames(fromImport.getImportElements()); diff --git a/python/testData/completion/relativeFromImportWhitespacesAfterDot/pkg/__init__.py b/python/testData/completion/relativeFromImportWhitespacesAfterDot/pkg/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/relativeFromImportWhitespacesAfterDot/pkg/m.py b/python/testData/completion/relativeFromImportWhitespacesAfterDot/pkg/m.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/relativeFromImportWhitespacesAfterDot/pkg/subpkg1/__init__.py b/python/testData/completion/relativeFromImportWhitespacesAfterDot/pkg/subpkg1/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/completion/relativeFromImportWhitespacesAfterDot/pkg/subpkg1/a.py b/python/testData/completion/relativeFromImportWhitespacesAfterDot/pkg/subpkg1/a.py new file mode 100644 index 000000000000..8e127a30dac3 --- /dev/null +++ b/python/testData/completion/relativeFromImportWhitespacesAfterDot/pkg/subpkg1/a.py @@ -0,0 +1 @@ +from . . diff --git a/python/testData/completion/relativeFromImportWhitespacesAfterDot/pkg/subpkg2/__init__.py b/python/testData/completion/relativeFromImportWhitespacesAfterDot/pkg/subpkg2/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index 288384ee6dc3..952126dcbfde 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -767,6 +767,14 @@ public class PythonCompletionTest extends PyTestCase { assertEmpty(variants); } + // PY-15119 + public void testRelativeFromImportWhitespacesAfterDot() { + myFixture.copyDirectoryToProject("completion/" + getTestName(true), ""); + myFixture.configureByFile("pkg/subpkg1/a.py"); + myFixture.completeBasic(); + assertSameElements(myFixture.getLookupElementStrings(), "import", "subpkg1", "subpkg2", "m"); + } + public void testStructuralType() { doTest(); } diff --git a/python/testSrc/com/jetbrains/python/PythonKeywordCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonKeywordCompletionTest.java index 60171fb7c899..54bee3ceaa51 100644 --- a/python/testSrc/com/jetbrains/python/PythonKeywordCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonKeywordCompletionTest.java @@ -233,7 +233,7 @@ public class PythonKeywordCompletionTest extends PyTestCase { List variants = doTestByText("from ..."); assertDoesntContain(variants, "import"); - variants = doTestByText("from ... "); - assertContainsElements(variants, "import"); + assertNull(doTestByText("from ... ")); + myFixture.checkResult("from ... import "); } }