diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/ModifierChooser.java b/java/java-impl/src/com/intellij/codeInsight/completion/ModifierChooser.java index a9ae7df9d98c..66f378d631d7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/ModifierChooser.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/ModifierChooser.java @@ -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"} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionData.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionData.java index 4973ccb148f0..fc83bfcb618b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionData.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionData.java @@ -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); 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 62203a14ed76..537ede85132c 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy @@ -966,4 +966,12 @@ class X { public void testPrimitiveCastOverwrite() { checkCompletion 'byte v1 = (byte) 0', '\t', 'byte v1 = (byte) 0' } + + public void testNoRepeatingModifiers() { + myFixture.configureByText 'a.groovy', 'class A { public static }' + myFixture.completeBasic() + assert !('public' in myFixture.lookupElementStrings) + assert !('static' in myFixture.lookupElementStrings) + assert 'final' in myFixture.lookupElementStrings + } } \ No newline at end of file