groovy: don't suggest classes where nothing except map key (string literal) is expected

This commit is contained in:
peter
2012-01-01 23:14:30 +01:00
parent 9c282ec3e8
commit 1be90c1c0f
4 changed files with 33 additions and 15 deletions
@@ -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,
@@ -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<CompletionParamet
protected void addCompletions(@NotNull CompletionParameters parameters,
ProcessingContext context,
@NotNull CompletionResultSet result) {
PsiElement mapOrArgumentList;
PsiElement parent = parameters.getPosition().getParent();
if (parent instanceof GrReferenceExpression) {
if (((GrReferenceExpression)parent).getQualifier() != null) return;
mapOrArgumentList = parent.getParent();
}
else {
mapOrArgumentList = parent.getParent().getParent();
PsiElement mapOrArgumentList = findMapOrArgumentList(parameters);
if (mapOrArgumentList == null) {
return;
}
if (mapOrArgumentList instanceof GrListOrMap) {
if (((GrListOrMap)mapOrArgumentList).getNamedArguments().length > 0) {
result.stopHere();
}
if (isMapKeyCompletion(parameters)) {
result.stopHere();
}
Map<String, NamedArgumentDescriptor> map = calcNamedArgumentsForCall(mapOrArgumentList);
@@ -113,6 +106,24 @@ class MapArgumentCompletionProvider extends CompletionProvider<CompletionParamet
}
public static boolean isMapKeyCompletion(CompletionParameters parameters) {
PsiElement mapOrArgumentList = findMapOrArgumentList(parameters);
return mapOrArgumentList instanceof GrListOrMap && ((GrListOrMap)mapOrArgumentList).getNamedArguments().length > 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<String, NamedArgumentDescriptor> findOtherNamedArgumentsInFile(PsiElement mapOrArgumentList) {
final Map<String, NamedArgumentDescriptor> map = new HashMap<String, NamedArgumentDescriptor>();
mapOrArgumentList.getContainingFile().accept(new PsiRecursiveElementWalkingVisitor() {
@@ -145,7 +156,7 @@ class MapArgumentCompletionProvider extends CompletionProvider<CompletionParamet
return GrNamedArgument.EMPTY_ARRAY;
}
private static Map<String, NamedArgumentDescriptor> calcNamedArgumentsForCall(PsiElement mapOrArgumentList) {
private static Map<String, NamedArgumentDescriptor> calcNamedArgumentsForCall(@NotNull PsiElement mapOrArgumentList) {
PsiElement argumentList = mapOrArgumentList instanceof GrArgumentList ? mapOrArgumentList : mapOrArgumentList.getParent();
if (argumentList instanceof GrArgumentList) {
if (mapOrArgumentList instanceof GrListOrMap) {
@@ -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'
@@ -0,0 +1 @@
[foo6:'aaa', d<caret>]