From 8f6eed481f70a87653bcee9a13c1dddbda1b4dc1 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 29 Feb 2012 13:53:48 +0100 Subject: [PATCH] don't select current item when typing : in groovy map or method call --- .../completion/GroovyReferenceCharFilter.java | 24 ++++++++++++------- .../MapArgumentCompletionProvider.java | 15 ++++++------ .../completion/GroovyAutoPopupTest.groovy | 12 ++++++++++ 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyReferenceCharFilter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyReferenceCharFilter.java index 185e62caa2c5..6df03c3d5f32 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyReferenceCharFilter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyReferenceCharFilter.java @@ -20,14 +20,16 @@ import com.intellij.codeInsight.lookup.CharFilter; import com.intellij.codeInsight.lookup.Lookup; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.impl.LookupImpl; +import com.intellij.patterns.StandardPatterns; import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyFileType; -import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrListOrMap; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; +import org.jetbrains.plugins.groovy.extensions.NamedArgumentDescriptor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrCaseLabel; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrConditionalExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; + +import static com.intellij.patterns.PsiJavaPatterns.psiElement; /** * @author ilyas @@ -58,12 +60,16 @@ public class GroovyReferenceCharFilter extends CharFilter { if (c == ':') { PsiFile file = lookup.getPsiFile(); PsiDocumentManager.getInstance(file.getProject()).commitDocument(lookup.getEditor().getDocument()); - PsiElement element = lookup.getPsiElement(); - if (PsiTreeUtil.getParentOfType(element, GrCaseLabel.class) != null || - PsiTreeUtil.getParentOfType(element, GrConditionalExpression.class) != null || - PsiTreeUtil.getParentOfType(element, GrArgumentList.class) != null || - PsiTreeUtil.getParentOfType(element, GrListOrMap.class) != null - ) { + PsiElement element = file.findElementAt(Math.max(caret - 1, 0)); + if (psiElement().withParent( + psiElement(GrReferenceExpression.class).withParent( + StandardPatterns.or(psiElement(GrCaseLabel.class), + psiElement(GrConditionalExpression.class)))).accepts(element)) { + return Result.SELECT_ITEM_AND_FINISH_LOOKUP; + } + if (item.getObject() instanceof NamedArgumentDescriptor && + (MapArgumentCompletionProvider.IN_ARGUMENT_LIST_OF_CALL.accepts(element) || + MapArgumentCompletionProvider.IN_LABEL.accepts(element))) { return Result.SELECT_ITEM_AND_FINISH_LOOKUP; } return Result.HIDE_LOOKUP; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/MapArgumentCompletionProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/MapArgumentCompletionProvider.java index 84b6b2808589..e69a65085b31 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/MapArgumentCompletionProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/MapArgumentCompletionProvider.java @@ -51,20 +51,19 @@ import static org.jetbrains.plugins.groovy.extensions.NamedArgumentDescriptor.Pr */ class MapArgumentCompletionProvider extends CompletionProvider { + public static final ElementPattern IN_ARGUMENT_LIST_OF_CALL = psiElement().withParent(psiElement(GrReferenceExpression.class).withParent( + StandardPatterns.or(psiElement(GrArgumentList.class), psiElement(GrListOrMap.class))) + ); + public static final ElementPattern IN_LABEL = psiElement(GroovyTokenTypes.mIDENT).withParent(GrArgumentLabel.class); + private MapArgumentCompletionProvider() { } public static void register(CompletionContributor contributor) { MapArgumentCompletionProvider instance = new MapArgumentCompletionProvider(); - ElementPattern inArgumentListOfCall = psiElement().withParent(psiElement(GrReferenceExpression.class).withParent( - StandardPatterns.or(psiElement(GrArgumentList.class), psiElement(GrListOrMap.class))) - ); - - ElementPattern inLabel = psiElement(GroovyTokenTypes.mIDENT).withParent(GrArgumentLabel.class); - - contributor.extend(CompletionType.BASIC, inArgumentListOfCall, instance); - contributor.extend(CompletionType.BASIC, inLabel, instance); + contributor.extend(CompletionType.BASIC, IN_ARGUMENT_LIST_OF_CALL, instance); + contributor.extend(CompletionType.BASIC, IN_LABEL, instance); } @Override diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyAutoPopupTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyAutoPopupTest.groovy index e47e50a569e7..e37f354abbc9 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyAutoPopupTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyAutoPopupTest.groovy @@ -232,4 +232,16 @@ class GroovyAutoPopupTest extends CompletionAutoPopupTestCase { assert myFixture.file.text == 'FIS:' } + public void testEnteringNamedArg() { + myFixture.configureByText 'a.groovy', 'foo()' + type 'has:' + myFixture.checkResult 'foo(has:)' + } + + public void testEnteringMapKey() { + myFixture.configureByText 'a.groovy', '[]' + type 'has:' + myFixture.checkResult '[has:]' + } + }