complete 'import' after 'from .' (PY-2772)

This commit is contained in:
Dmitry Jemerov
2011-01-25 12:22:27 +01:00
parent c282af056d
commit 7fbc8a7eba
5 changed files with 41 additions and 6 deletions
@@ -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<PsiElement> IN_STRING_LITERAL =
psiElement().inside(PyStringLiteralExpression.class);
private static final PsiElementPattern.Capture<PsiElement> AFTER_QUALIFIER =
psiElement().afterLeaf(".");
public static final PsiElementPattern.Capture<PsiElement> 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<PsiElement> IN_FROM_IMPORT_AFTER_REF =
public static final PsiElementPattern.Capture<PsiElement> 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<PsiElement> IN_WITH_AFTER_REF =
psiElement().afterLeaf(psiElement()
@@ -0,0 +1 @@
from . import <caret>
@@ -0,0 +1 @@
from . im<caret>
@@ -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();
}
}
@@ -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));
}
}