IDEA-104677 Selected completion item isn't inserted by typing a colon

This commit is contained in:
peter
2013-08-01 17:54:34 +02:00
parent a01ab44997
commit 67465a724e
2 changed files with 23 additions and 3 deletions

View File

@@ -30,9 +30,11 @@ import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.impl.LookupImpl;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.patterns.PsiJavaPatterns;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
public class JavaCharFilter extends CharFilter {
@@ -67,9 +69,16 @@ public class JavaCharFilter extends CharFilter {
if (c == ':') {
PsiFile file = lookup.getPsiFile();
PsiDocumentManager.getInstance(file.getProject()).commitDocument(lookup.getEditor().getDocument());
PsiElement element = lookup.getPsiElement();
if (PsiTreeUtil.getParentOfType(element, PsiSwitchLabelStatement.class) != null ||
PsiTreeUtil.getParentOfType(element, PsiConditionalExpression.class) != null) {
PsiElement leaf = file.findElementAt(lookup.getEditor().getCaretModel().getOffset() - 1);
if (PsiUtil.getLanguageLevel(file).isAtLeast(LanguageLevel.JDK_1_8)) {
PsiStatement statement = PsiTreeUtil.getParentOfType(leaf, PsiStatement.class);
if (statement == null ||
statement.getTextRange().getStartOffset() != leaf.getTextRange().getStartOffset()) { // not typing a statement label
return Result.SELECT_ITEM_AND_FINISH_LOOKUP;
}
}
if (PsiTreeUtil.getParentOfType(leaf, PsiSwitchLabelStatement.class) != null ||
PsiTreeUtil.getParentOfType(leaf, PsiConditionalExpression.class) != null) {
return Result.SELECT_ITEM_AND_FINISH_LOOKUP;
}
return Result.HIDE_LOOKUP;

View File

@@ -39,4 +39,15 @@ public class Normal8CompletionTest extends LightFixtureCompletionTestCase {
configureByFile("SelfStaticsOnly.java");
assertStringItems("ba", "bar");
}
public void testFinishWithColon() {
myFixture.configureByText "a.java", """
class Foo {{ Object o = Fo<caret>x }}
"""
myFixture.completeBasic()
myFixture.type('::')
myFixture.checkResult """
class Foo {{ Object o = Foo::<caret>x }}
"""
}
}