don't select current item when typing : in groovy map or method call

This commit is contained in:
peter
2012-02-29 17:22:53 +01:00
parent 0e6295cf03
commit 8f6eed481f
3 changed files with 34 additions and 17 deletions
@@ -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;
@@ -51,20 +51,19 @@ import static org.jetbrains.plugins.groovy.extensions.NamedArgumentDescriptor.Pr
*/
class MapArgumentCompletionProvider extends CompletionProvider<CompletionParameters> {
public static final ElementPattern<PsiElement> IN_ARGUMENT_LIST_OF_CALL = psiElement().withParent(psiElement(GrReferenceExpression.class).withParent(
StandardPatterns.or(psiElement(GrArgumentList.class), psiElement(GrListOrMap.class)))
);
public static final ElementPattern<PsiElement> IN_LABEL = psiElement(GroovyTokenTypes.mIDENT).withParent(GrArgumentLabel.class);
private MapArgumentCompletionProvider() {
}
public static void register(CompletionContributor contributor) {
MapArgumentCompletionProvider instance = new MapArgumentCompletionProvider();
ElementPattern<PsiElement> inArgumentListOfCall = psiElement().withParent(psiElement(GrReferenceExpression.class).withParent(
StandardPatterns.or(psiElement(GrArgumentList.class), psiElement(GrListOrMap.class)))
);
ElementPattern<PsiElement> 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
@@ -232,4 +232,16 @@ class GroovyAutoPopupTest extends CompletionAutoPopupTestCase {
assert myFixture.file.text == 'FIS:'
}
public void testEnteringNamedArg() {
myFixture.configureByText 'a.groovy', 'foo(<caret>)'
type 'has:'
myFixture.checkResult 'foo(has:<caret>)'
}
public void testEnteringMapKey() {
myFixture.configureByText 'a.groovy', '[<caret>]'
type 'has:'
myFixture.checkResult '[has:<caret>]'
}
}