From 1154b6f0965227365dcf6c5b4a28a21af019593b Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 2 Oct 2015 14:22:03 +0200 Subject: [PATCH] IDEA-145752 Annotation attribute value: irrelevant completion proposals for boolean attribute (basic completion) --- .../completion/JavaCompletionContributor.java | 1 + .../completion/JavaKeywordCompletion.java | 17 +++++++++++++++-- .../JavaSmartCompletionContributor.java | 5 ++--- ...oPrimitivesInBooleanAnnotationAttribute.java | 5 +++++ .../noPrimitivesInEnumAnnotationAttribute.java | 6 ++++++ ...PrimitivesInIntAnnotationValueAttribute.java | 5 +++++ .../primitivesInClassAnnotationAttribute.java | 5 +++++ ...imitivesInClassAnnotationValueAttribute.java | 5 +++++ .../completion/KeywordCompletionTest.java | 8 +++++++- 9 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesInBooleanAnnotationAttribute.java create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesInEnumAnnotationAttribute.java create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesInIntAnnotationValueAttribute.java create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/primitivesInClassAnnotationAttribute.java create mode 100644 java/java-tests/testData/codeInsight/completion/keywords/primitivesInClassAnnotationValueAttribute.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 a196cf93eec4..ba51df0c5f10 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -216,6 +216,7 @@ public class JavaCompletionContributor extends CompletionContributor { if (ANNOTATION_ATTRIBUTE_NAME.accepts(position) && !JavaKeywordCompletion.isAfterPrimitiveOrArrayType(position)) { JavaKeywordCompletion.addExpectedTypeMembers(parameters, result); + JavaKeywordCompletion.addPrimitiveTypes(result, position); completeAnnotationAttributeName(result, position, parameters); result.stopHere(); return; diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java index a5710722a064..1f8d88ae665f 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaKeywordCompletion.java @@ -22,6 +22,7 @@ import com.intellij.codeInsight.completion.util.ParenthesesInsertHandler; import com.intellij.codeInsight.daemon.impl.analysis.LambdaHighlightingUtil; import com.intellij.codeInsight.lookup.*; import com.intellij.openapi.util.AtomicNotNullLazyValue; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.NotNullLazyValue; import com.intellij.patterns.ElementPattern; import com.intellij.pom.java.LanguageLevel; @@ -32,10 +33,12 @@ import com.intellij.psi.filters.position.*; import com.intellij.psi.impl.source.jsp.jspJava.JspClassLevelDeclarationStatement; import com.intellij.psi.jsp.JspElementType; import com.intellij.psi.templateLanguages.OuterLanguageElement; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.Consumer; import com.intellij.util.ProcessingContext; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -578,8 +581,9 @@ public class JavaKeywordCompletion { isAfterPrimitiveOrArrayType(position); } - private static void addPrimitiveTypes(final Consumer result, PsiElement position) { - if (AFTER_DOT.accepts(position)) { + static void addPrimitiveTypes(final Consumer result, PsiElement position) { + if (AFTER_DOT.accepts(position) || + psiElement().inside(psiAnnotation()).accepts(position) && !expectsClassLiteral(position)) { return; } @@ -623,6 +627,15 @@ public class JavaKeywordCompletion { } } + private static boolean expectsClassLiteral(PsiElement position) { + return ContainerUtil.find(JavaSmartCompletionContributor.getExpectedTypes(position, false), new Condition() { + @Override + public boolean value(ExpectedTypeInfo info) { + return InheritanceUtil.isInheritor(info.getType(), CommonClassNames.JAVA_LANG_CLASS); + } + }) != null; + } + private static boolean isAtResourceVariableStart(PsiElement position) { return psiElement().insideStarting(psiElement(PsiTypeElement.class).withParent(PsiResourceList.class)).accepts(position); } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java index dd27cbe3dc66..d181a34e6358 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaSmartCompletionContributor.java @@ -246,12 +246,11 @@ public class JavaSmartCompletionContributor extends CompletionContributor { @NotNull public static ExpectedTypeInfo[] getExpectedTypes(final CompletionParameters parameters) { - return getExpectedTypes(parameters, parameters.getCompletionType() == CompletionType.SMART); + return getExpectedTypes(parameters.getPosition(), parameters.getCompletionType() == CompletionType.SMART); } @NotNull - public static ExpectedTypeInfo[] getExpectedTypes(final CompletionParameters parameters, boolean voidable) { - final PsiElement position = parameters.getPosition(); + public static ExpectedTypeInfo[] getExpectedTypes(PsiElement position, boolean voidable) { if (psiElement().withParent(psiElement(PsiReferenceExpression.class).withParent(PsiThrowStatement.class)).accepts(position)) { final PsiElementFactory factory = JavaPsiFacade.getInstance(position.getProject()).getElementFactory(); final PsiClassType classType = factory diff --git a/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesInBooleanAnnotationAttribute.java b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesInBooleanAnnotationAttribute.java new file mode 100644 index 000000000000..7cf8d9765b33 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesInBooleanAnnotationAttribute.java @@ -0,0 +1,5 @@ +@interface Foo { + boolean foo(); +} + +@Foo(foo=) \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesInEnumAnnotationAttribute.java b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesInEnumAnnotationAttribute.java new file mode 100644 index 000000000000..a1ba97625987 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesInEnumAnnotationAttribute.java @@ -0,0 +1,6 @@ +@interface Foo { + MyEnum value(); +} +enum MyEnum { x, y } + +@Foo() \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesInIntAnnotationValueAttribute.java b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesInIntAnnotationValueAttribute.java new file mode 100644 index 000000000000..12868cf66116 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/noPrimitivesInIntAnnotationValueAttribute.java @@ -0,0 +1,5 @@ +@interface Foo { + int value(); +} + +@Foo() \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/keywords/primitivesInClassAnnotationAttribute.java b/java/java-tests/testData/codeInsight/completion/keywords/primitivesInClassAnnotationAttribute.java new file mode 100644 index 000000000000..3ed64ecd7353 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/primitivesInClassAnnotationAttribute.java @@ -0,0 +1,5 @@ +@interface Foo { + Class attr(); +} + +@Foo(attr = ) \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/keywords/primitivesInClassAnnotationValueAttribute.java b/java/java-tests/testData/codeInsight/completion/keywords/primitivesInClassAnnotationValueAttribute.java new file mode 100644 index 000000000000..915beafdbeba --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/primitivesInClassAnnotationValueAttribute.java @@ -0,0 +1,5 @@ +@interface Foo { + Class value(); +} + +@Foo() \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/KeywordCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/KeywordCompletionTest.java index ec6cf94b62ac..ddc784b08a25 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/KeywordCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/KeywordCompletionTest.java @@ -112,7 +112,13 @@ public class KeywordCompletionTest extends LightCompletionTestCase { selectItem(myItems[0], '!'); checkResultByFile(BASE_PATH + "/" + getTestName(true) + "_after.java"); } - + + public void testNoPrimitivesInBooleanAnnotationAttribute() { doTest(1, "true", "int", "boolean"); } + public void testNoPrimitivesInIntAnnotationValueAttribute() { doTest(0, "true", "int", "boolean"); } + public void testNoPrimitivesInEnumAnnotationAttribute() { doTest(0, "true", "int", "boolean"); } + public void testPrimitivesInClassAnnotationValueAttribute() { doTest(2, "true", "int", "boolean"); } + public void testPrimitivesInClassAnnotationAttribute() { doTest(3, "true", "int", "boolean"); } + public void testImportStatic() throws Exception { doTest(1, "static"); } public void testAbstractInInterface() throws Exception { doTest(1, "abstract"); } public void testCharInAnnotatedParameter() throws Exception { doTest(1, "char"); }