diff --git a/python/src/com/jetbrains/python/codeInsight/PyKeywordCompletionContributor.java b/python/src/com/jetbrains/python/codeInsight/PyKeywordCompletionContributor.java index b463b3df1479..31e01dbc4517 100644 --- a/python/src/com/jetbrains/python/codeInsight/PyKeywordCompletionContributor.java +++ b/python/src/com/jetbrains/python/codeInsight/PyKeywordCompletionContributor.java @@ -6,7 +6,6 @@ import com.intellij.codeInsight.lookup.TailTypeDecorator; import com.intellij.lang.ASTNode; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; -import com.intellij.patterns.ElementPattern; import com.intellij.patterns.PsiElementPattern; import com.intellij.patterns.StandardPatterns; import com.intellij.psi.*; @@ -22,6 +21,7 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import static com.intellij.patterns.PlatformPatterns.psiElement; +import static com.intellij.patterns.StandardPatterns.or; /** * Python keyword completion contributor. @@ -230,8 +230,8 @@ public class PyKeywordCompletionContributor extends PySeeingOriginalCompletionCo private static final PsiElementPattern.Capture IN_STRING_LITERAL = psiElement().inside(PyStringLiteralExpression.class); - private static final PsiElementPattern.Capture AFTER_QUALIFIER = - psiElement().afterLeaf("."); + public static final PsiElementPattern.Capture AFTER_QUALIFIER = + psiElement().afterLeaf(psiElement().withText(".").inside(PyReferenceExpression.class)); private static final FilterPattern FIRST_ON_LINE = new FilterPattern(new StartOfLineFilter()); @@ -239,10 +239,11 @@ public class PyKeywordCompletionContributor extends PySeeingOriginalCompletionCo psiElement() .afterLeaf(psiElement().withElementType(PyTokenTypes.IDENTIFIER).inside(PyReferenceExpression.class).inside(PyImportElement.class)); - private static final PsiElementPattern.Capture IN_FROM_IMPORT_AFTER_REF = + public static final PsiElementPattern.Capture IN_FROM_IMPORT_AFTER_REF = psiElement().afterLeaf( - psiElement().withElementType(PyTokenTypes.IDENTIFIER).inside(PyReferenceExpression.class).inside(PyFromImportStatement.class) - ).inside(PyFromImportStatement.class); + or(psiElement().withElementType(PyTokenTypes.IDENTIFIER).inside(PyReferenceExpression.class), + psiElement().withElementType(PyTokenTypes.DOT)) + ).inside(PyFromImportStatement.class); private static final PsiElementPattern.Capture IN_WITH_AFTER_REF = psiElement().afterLeaf(psiElement() diff --git a/python/testData/completion/fromDotImport.after.py b/python/testData/completion/fromDotImport.after.py new file mode 100644 index 000000000000..8f88dd170c20 --- /dev/null +++ b/python/testData/completion/fromDotImport.after.py @@ -0,0 +1 @@ +from . import \ No newline at end of file diff --git a/python/testData/completion/fromDotImport.py b/python/testData/completion/fromDotImport.py new file mode 100644 index 000000000000..bdfbfaeae31c --- /dev/null +++ b/python/testData/completion/fromDotImport.py @@ -0,0 +1 @@ +from . im \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index f4e61be09af2..ff5ea3578d26 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -231,6 +231,10 @@ public class PythonCompletionTest extends PyLightFixtureTestCase { } public void testNonlocal() { // PY-2289 + doTest3K(); + } + + private void doTest3K() { PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), LanguageLevel.PYTHON30); try { doTest(); @@ -255,4 +259,8 @@ public class PythonCompletionTest extends PyLightFixtureTestCase { public void testDictKeyPrefix() { doTest(); } + + public void testFromDotImport() { // PY-2772 + doTest3K(); + } } diff --git a/python/testSrc/com/jetbrains/python/codeInsight/PyCompletionPatternsTest.java b/python/testSrc/com/jetbrains/python/codeInsight/PyCompletionPatternsTest.java new file mode 100644 index 000000000000..29173c6cdc6c --- /dev/null +++ b/python/testSrc/com/jetbrains/python/codeInsight/PyCompletionPatternsTest.java @@ -0,0 +1,24 @@ +package com.jetbrains.python.codeInsight; + +import com.intellij.psi.PsiElement; +import com.jetbrains.python.PythonFileType; +import com.jetbrains.python.fixtures.PyLightFixtureTestCase; + +/** + * @author yole + */ +public class PyCompletionPatternsTest extends PyLightFixtureTestCase { + public void testInFromImportAfterRef() { + String text = "from . im"; + myFixture.configureByText(PythonFileType.INSTANCE, text); + PsiElement element = myFixture.getFile().findElementAt(text.length() - 1); + assertTrue(PyKeywordCompletionContributor.IN_FROM_IMPORT_AFTER_REF.accepts(element)); + } + + public void testAfterQualifier() { + String text = "from . im"; + myFixture.configureByText(PythonFileType.INSTANCE, text); + PsiElement element = myFixture.getFile().findElementAt(text.length() - 1); + assertFalse(PyKeywordCompletionContributor.AFTER_QUALIFIER.accepts(element)); + } +}