From 2ffcdf1cb97e455346236433fb6bcf2772ea8817 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 8 Sep 2011 17:49:03 +0200 Subject: [PATCH] IDEA-72776 JAVA: duplicate "boolean" autocomplete suggestion --- .../completion/JavaCompletionContributor.java | 2 +- .../completion/JavaCompletionData.java | 72 +++++++++---------- .../normal/DoubleBooleanInParameter.java | 4 ++ .../completion/NormalCompletionTest.groovy | 7 +- 4 files changed, 43 insertions(+), 42 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normal/DoubleBooleanInParameter.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java index 0f70a482fb5a..495dd50dec67 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -126,7 +126,7 @@ public class JavaCompletionContributor extends CompletionContributor { return new ElementExtractorFilter(ElementClassFilter.CLASS); } - if (JavaCompletionData.AFTER_FINAL.accepts(position)) { + if (JavaCompletionData.VARIABLE_AFTER_FINAL.accepts(position)) { return ElementClassFilter.CLASS; } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java index 9bd72b07cd9b..3c732f0d301a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java @@ -22,10 +22,7 @@ import com.intellij.codeInsight.completion.util.ParenthesesInsertHandler; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupItem; import com.intellij.codeInsight.lookup.TailTypeDecorator; -import com.intellij.patterns.ElementPattern; -import com.intellij.patterns.PsiElementPattern; -import com.intellij.patterns.PsiJavaElementPattern; -import com.intellij.patterns.PsiJavaPatterns; +import com.intellij.patterns.*; import com.intellij.psi.*; import com.intellij.psi.filters.*; import com.intellij.psi.filters.classes.EnumOrAnnotationTypeFilter; @@ -58,7 +55,7 @@ public class JavaCompletionData extends JavaAwareCompletionData{ new ParentElementFilter(new ClassFilter(PsiExpression.class)), new ClassFilter(PsiExpression.class))))), new AndFilter(new TextFilter("]"), new ParentElementFilter(new ClassFilter(PsiArrayAccessExpression.class))))); - public static final PsiJavaElementPattern.Capture AFTER_FINAL = + public static final PsiJavaElementPattern.Capture VARIABLE_AFTER_FINAL = PsiJavaPatterns.psiElement().afterLeaf(PsiKeyword.FINAL).inside(PsiDeclarationStatement.class); public static final LeftNeighbour AFTER_TRY_BLOCK = new LeftNeighbour(new AndFilter( new TextFilter("}"), @@ -311,19 +308,6 @@ public class JavaCompletionData extends JavaAwareCompletionData{ } - { -// declaration start -// position - final CompletionVariant variant = new CompletionVariant(PsiClass.class, DECLARATION_START); - variant.includeScopeClass(JspClassLevelDeclarationStatement.class); - -// completion - addPrimitiveTypes(variant); - variant.addCompletion(PsiKeyword.VOID); - - registerVariant(variant); - } - { final CompletionVariant variant = new CompletionVariant(PsiElement.class, psiElement().afterLeaf( psiElement(PsiIdentifier.class).afterLeaf( @@ -359,7 +343,7 @@ public class JavaCompletionData extends JavaAwareCompletionData{ // completion for declarations final CompletionVariant variant = new CompletionVariant(new OrFilter(END_OF_BLOCK, new LeftNeighbour(new TextFilter(PsiKeyword.FINAL)))); variant.includeScopeClass(PsiCodeBlock.class, false); - addPrimitiveTypes(variant); + addPrimitiveTypes(variant, CompletionVariant.DEFAULT_TAIL_TYPE); variant.addCompletion(PsiKeyword.CLASS); registerVariant(variant); } @@ -371,7 +355,7 @@ public class JavaCompletionData extends JavaAwareCompletionData{ new ParentElementFilter(new OrFilter( new ClassFilter(PsiParenthesizedExpression.class), new ClassFilter(PsiTypeCastExpression.class)))))); - addPrimitiveTypes(variant); + addPrimitiveTypes(variant, CompletionVariant.DEFAULT_TAIL_TYPE); registerVariant(variant); } @@ -386,17 +370,6 @@ public class JavaCompletionData extends JavaAwareCompletionData{ registerVariant(variant); } - { -// after final keyword - final ElementFilter position = new PatternFilter(AFTER_FINAL); - final CompletionVariant variant = new CompletionVariant(position); - variant.includeScopeClass(PsiDeclarationStatement.class, true); - addPrimitiveTypes(variant); - - registerVariant(variant); - } - - { // Keyword completion in start of declaration final CompletionVariant variant = new CompletionVariant(PsiMethod.class, END_OF_BLOCK); @@ -465,10 +438,6 @@ public class JavaCompletionData extends JavaAwareCompletionData{ } } - private static void addPrimitiveTypes(CompletionVariant variant){ - addPrimitiveTypes(variant, CompletionVariant.DEFAULT_TAIL_TYPE); - } - private static void addPrimitiveTypes(CompletionVariant variant, TailType tailType){ variant.addCompletion(PRIMITIVE_TYPES, tailType); } @@ -553,11 +522,7 @@ public class JavaCompletionData extends JavaAwareCompletionData{ result.addElement(createKeyword(position, PsiKeyword.FALSE)); } - if (START_FOR.accepts(position) || INSIDE_PARAMETER_LIST.accepts(position) && !AFTER_DOT.accepts(position)) { - for (String primitiveType : PRIMITIVE_TYPES) { - result.addElement(TailTypeDecorator.withTail(createKeyword(position, primitiveType), TailType.SPACE)); - } - } + addPrimitiveTypes(result, position); if (psiElement().afterLeaf(psiElement().withText(".").inside(PsiExpression.class).afterLeaf(or( psiElement().withParent(psiElement().referencing(psiClass())), @@ -598,6 +563,22 @@ public class JavaCompletionData extends JavaAwareCompletionData{ } } + private static void addPrimitiveTypes(CompletionResultSet result, PsiElement position) { + boolean declaration = DECLARATION_START.isAcceptable(position, position) || + psiElement().withParents(PsiJavaCodeReferenceElement.class, PsiTypeElement.class, PsiMember.class).accepts(position); + if (START_FOR.accepts(position) || + INSIDE_PARAMETER_LIST.accepts(position) && !AFTER_DOT.accepts(position) || + VARIABLE_AFTER_FINAL.accepts(position) || + declaration) { + for (String primitiveType : PRIMITIVE_TYPES) { + result.addElement(new OverrideableSpace(createKeyword(position, primitiveType))); + } + } + if (declaration) { + result.addElement(new OverrideableSpace(createKeyword(position, PsiKeyword.VOID))); + } + } + private static void addBreakContinue(CompletionResultSet result, PsiElement position) { PsiLoopStatement loop = PsiTreeUtil.getParentOfType(position, PsiLoopStatement.class); @@ -675,4 +656,15 @@ public class JavaCompletionData extends JavaAwareCompletionData{ } return false; } + + private static class OverrideableSpace extends TailTypeDecorator { + public OverrideableSpace(LookupElement keyword) { + super(keyword); + } + + @Override + protected TailType computeTailType(InsertionContext context) { + return context.shouldAddCompletionChar() ? TailType.NONE : TailType.SPACE; + } + } } diff --git a/java/java-tests/testData/codeInsight/completion/normal/DoubleBooleanInParameter.java b/java/java-tests/testData/codeInsight/completion/normal/DoubleBooleanInParameter.java new file mode 100644 index 000000000000..aa4a59a4dfce --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/DoubleBooleanInParameter.java @@ -0,0 +1,4 @@ +interface Foo { + void getGooBarDoo(); + void bar(final b); +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy index 440fc8b366ba..22b877de4b9d 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -321,7 +321,7 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase { public void testIDEADEV6408() throws Exception { configureByFile("IDEADEV6408.java"); - assertEquals(2, myItems.length); + assertStringItems "boolean", "byte" } public void testMethodWithLeftParTailType() throws Exception { @@ -463,6 +463,11 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase { doTest(); } + public void testDoubleBooleanInParameter() throws Throwable { + configure() + assertStringItems("boolean", "byte") + } + public void testNotOnlyKeywordsInsideSwitch() throws Throwable { doTest(); }