mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
don't select current item when typing : in groovy map or method call
This commit is contained in:
+15
-9
@@ -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;
|
||||
|
||||
+7
-8
@@ -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
|
||||
|
||||
+12
@@ -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>]'
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user