IDEA-72071 Groovy: Completion: Completion variants contains modifiers which already typed

This commit is contained in:
peter
2011-10-05 20:34:10 +02:00
parent 597295075e
commit 288d3a008d
3 changed files with 20 additions and 7 deletions
@@ -51,7 +51,7 @@ public class ModifierChooser {
return addClassModifiers(list);
}
if (scope instanceof PsiClass) {
return addMemberModifiers(list, (PsiClass)scope);
return addMemberModifiers(list, ((PsiClass)scope).isInterface());
}
scope = scope.getParent();
@@ -67,8 +67,8 @@ public class ModifierChooser {
});
}
public static String[] addMemberModifiers(PsiModifierList list, PsiClass scope) {
return addKeywords(list, scope.isInterface() ? new String[][]{
public static String[] addMemberModifiers(PsiModifierList list, final boolean inInterface) {
return addKeywords(list, inInterface ? new String[][]{
new String[]{"public", "protected"},
new String[]{"static"},
new String[]{"final"}
@@ -20,14 +20,13 @@ package org.jetbrains.plugins.groovy.lang.completion;
import com.intellij.codeInsight.TailType;
import com.intellij.codeInsight.completion.CompletionParameters;
import com.intellij.codeInsight.completion.CompletionResultSet;
import com.intellij.codeInsight.completion.ModifierChooser;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.codeInsight.lookup.TailTypeDecorator;
import com.intellij.lang.ASTNode;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiErrorElement;
import com.intellij.psi.PsiKeyword;
import com.intellij.psi.*;
import com.intellij.psi.templateLanguages.OuterLanguageElement;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
@@ -112,7 +111,7 @@ public class GroovyCompletionData {
}
} else {
if (suggestModifiers(position)) {
addKeywords(result, true, MODIFIERS);
addModifiers(position, result);
}
if (psiElement().afterLeaf(MODIFIERS).accepts(position) ||
GroovyCompletionUtil.isInTypeDefinitionBody(position) && GroovyCompletionUtil.isNewStatement(position, true)) {
@@ -126,6 +125,12 @@ public class GroovyCompletionData {
}
}
public static void addModifiers(PsiElement position, CompletionResultSet result) {
PsiClass scope = PsiTreeUtil.getParentOfType(position, PsiClass.class);
PsiModifierList modifierList = ModifierChooser.findModifierList(position);
addKeywords(result, true, ModifierChooser.addMemberModifiers(modifierList, scope != null && scope.isInterface()));
}
private static void addTypeDefinitionKeywords(CompletionResultSet result, PsiElement position) {
if (suggestClassInterfaceEnum(position)) {
addKeywords(result, true, PsiKeyword.CLASS, PsiKeyword.INTERFACE, PsiKeyword.ENUM);
@@ -966,4 +966,12 @@ class X {
public void testPrimitiveCastOverwrite() {
checkCompletion 'byte v1 = (by<caret>te) 0', '\t', 'byte v1 = (byte<caret>) 0'
}
public void testNoRepeatingModifiers() {
myFixture.configureByText 'a.groovy', 'class A { public static <caret> }'
myFixture.completeBasic()
assert !('public' in myFixture.lookupElementStrings)
assert !('static' in myFixture.lookupElementStrings)
assert 'final' in myFixture.lookupElementStrings
}
}