From 1be90c1c0f0a4b3b6a6df58eb1cd14ea1cc412b5 Mon Sep 17 00:00:00 2001 From: peter Date: Sat, 31 Dec 2011 15:11:29 +0100 Subject: [PATCH] groovy: don't suggest classes where nothing except map key (string literal) is expected --- .../completion/GroovyNoVariantsDelegator.java | 3 +- .../MapArgumentCompletionProvider.java | 39 ++++++++++++------- .../completion/GroovyCompletionTest.groovy | 5 +++ .../completion/NoClassesAsMapKeys.groovy | 1 + 4 files changed, 33 insertions(+), 15 deletions(-) create mode 100644 plugins/groovy/testdata/groovy/completion/NoClassesAsMapKeys.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java index ef74cc4702e9..957e080bd9f0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyNoVariantsDelegator.java @@ -30,7 +30,8 @@ public class GroovyNoVariantsDelegator extends NoVariantsDelegator { if (parameters.getCompletionType() == CompletionType.BASIC && parameters.getInvocationCount() <= 1 && JavaCompletionContributor.mayStartClassName(result, false) && - GroovyCompletionContributor.isClassNamePossible(parameters.getPosition())) { + GroovyCompletionContributor.isClassNamePossible(parameters.getPosition()) && + !MapArgumentCompletionProvider.isMapKeyCompletion(parameters)) { final ClassByNameMerger merger = new ClassByNameMerger(parameters.getInvocationCount() == 0, result); GroovyCompletionContributor.addAllClasses(parameters, result, 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 96379c531464..84b6b2808589 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 @@ -23,6 +23,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiRecursiveElementWalkingVisitor; import com.intellij.util.ProcessingContext; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyIcons; import org.jetbrains.plugins.groovy.extensions.GroovyNamedArgumentProvider; import org.jetbrains.plugins.groovy.extensions.NamedArgumentDescriptor; @@ -70,21 +71,13 @@ class MapArgumentCompletionProvider extends CompletionProvider 0) { - result.stopHere(); - } + if (isMapKeyCompletion(parameters)) { + result.stopHere(); } Map map = calcNamedArgumentsForCall(mapOrArgumentList); @@ -113,6 +106,24 @@ class MapArgumentCompletionProvider extends CompletionProvider 0; + } + + @Nullable + private static PsiElement findMapOrArgumentList(CompletionParameters parameters) { + PsiElement parent = parameters.getPosition().getParent(); + if (parent instanceof GrReferenceExpression) { + if (((GrReferenceExpression)parent).getQualifier() != null) return null; + return parent.getParent(); + } + if (parent == null || parent.getParent() == null) { + return null; + } + return parent.getParent().getParent(); + } + private static Map findOtherNamedArgumentsInFile(PsiElement mapOrArgumentList) { final Map map = new HashMap(); mapOrArgumentList.getContainingFile().accept(new PsiRecursiveElementWalkingVisitor() { @@ -145,7 +156,7 @@ class MapArgumentCompletionProvider extends CompletionProvider calcNamedArgumentsForCall(PsiElement mapOrArgumentList) { + private static Map calcNamedArgumentsForCall(@NotNull PsiElement mapOrArgumentList) { PsiElement argumentList = mapOrArgumentList instanceof GrArgumentList ? mapOrArgumentList : mapOrArgumentList.getParent(); if (argumentList instanceof GrArgumentList) { if (mapOrArgumentList instanceof GrListOrMap) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy index 23b18f2a4c25..5048a4c08756 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy @@ -840,6 +840,11 @@ return foo()""" doVariantableTest 'foo1', 'foo3', 'foo4', 'Foo5', 'Foo7' } + public void testNoClassesAsMapKeys() throws Exception { + CodeInsightSettings.instance.COMPLETION_CASE_SENSITIVE = CodeInsightSettings.NONE + doVariantableTest() + } + public void testNamedArgsUsedInFile() throws Exception { myFixture.configureByFile(getTestName(false) + ".groovy"); doVariantableTest 'false', 'foo2', 'float', 'foo1', 'foo3', 'foo4', 'foo5' diff --git a/plugins/groovy/testdata/groovy/completion/NoClassesAsMapKeys.groovy b/plugins/groovy/testdata/groovy/completion/NoClassesAsMapKeys.groovy new file mode 100644 index 000000000000..6bff03f999a8 --- /dev/null +++ b/plugins/groovy/testdata/groovy/completion/NoClassesAsMapKeys.groovy @@ -0,0 +1 @@ +[foo6:'aaa', d] \ No newline at end of file