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"); }