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 e0daaa0f0082..b5f751b33b57 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -123,7 +123,7 @@ public class JavaCompletionContributor extends CompletionContributor { return new AnnotationTypeFilter(); } - if (JavaKeywordCompletion.DECLARATION_START.getValue().accepts(position) || + if (JavaKeywordCompletion.isDeclarationStart(position) || JavaKeywordCompletion.isInsideParameterList(position) || isInsideAnnotationName(position)) { return new OrFilter(ElementClassFilter.CLASS, ElementClassFilter.PACKAGE); 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 b90a7600c3a5..d5bb1ed359bd 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.Conditions; import com.intellij.openapi.util.NotNullLazyValue; import com.intellij.patterns.ElementPattern; import com.intellij.patterns.PsiElementPattern; @@ -162,25 +163,6 @@ public class JavaKeywordCompletion { not(psiElement().afterLeaf(".")) ); - static final NotNullLazyValue> DECLARATION_START = new NotNullLazyValue>() { - @NotNull - @Override - protected ElementPattern compute() { - return psiElement().andNot(psiElement().afterLeaf("@", ".")). - andOr( - psiElement().and(new FilterPattern(CLASS_BODY.getValue())). - andOr( - new FilterPattern(END_OF_BLOCK.getValue()), - psiElement().afterLeaf(or( - psiElement().inside(PsiModifierList.class), - psiElement().withElementType(JavaTokenType.GT).inside(PsiTypeParameterList.class) - ))), - psiElement().withParents(PsiJavaCodeReferenceElement.class, PsiTypeElement.class, PsiMember.class), - psiElement().withParents(PsiJavaCodeReferenceElement.class, PsiTypeElement.class, PsiClassLevelDeclarationStatement.class) - ); - } - }; - private final CompletionParameters myParameters; private final JavaCompletionSession mySession; private final PsiElement myPosition; @@ -689,7 +671,7 @@ public class JavaKeywordCompletion { .accepts(position); boolean typeFragment = position.getContainingFile() instanceof PsiTypeCodeFragment && PsiTreeUtil.prevVisibleLeaf(position) == null; - boolean declaration = DECLARATION_START.getValue().accepts(position); + boolean declaration = isDeclarationStart(position); boolean expressionPosition = isExpressionPosition(position); boolean inGenerics = PsiTreeUtil.getParentOfType(position, PsiReferenceParameterList.class) != null; if (START_FOR.accepts(position) || @@ -716,6 +698,28 @@ public class JavaKeywordCompletion { } } + static boolean isDeclarationStart(@NotNull PsiElement position) { + if (psiElement().afterLeaf("@", ".").accepts(position)) return false; + + if (new FilterPattern(CLASS_BODY.getValue()).accepts(position)) { + if (new FilterPattern(END_OF_BLOCK.getValue()).accepts(position)) return true; + if (psiElement().afterLeaf(or( + psiElement().inside(PsiModifierList.class), + psiElement().withElementType(JavaTokenType.GT).inside(PsiTypeParameterList.class) + )).accepts(position)) { + return true; + } + } + + PsiElement parent = position.getParent(); + if (parent instanceof PsiJavaCodeReferenceElement && parent.getParent() instanceof PsiTypeElement) { + PsiElement typeHolder = psiApi().parents(parent.getParent()).skipWhile(Conditions.instanceOf(PsiTypeElement.class)).first(); + return typeHolder instanceof PsiMember || typeHolder instanceof PsiClassLevelDeclarationStatement; + } + + return false; + } + private static boolean expectsClassLiteral(PsiElement position) { return ContainerUtil.find(JavaSmartCompletionContributor.getExpectedTypes(position, false), info -> InheritanceUtil.isInheritor(info.getType(), CommonClassNames.JAVA_LANG_CLASS)) != null; diff --git a/java/java-tests/testData/codeInsight/completion/keywords/primitivesInMethodReturningArray.java b/java/java-tests/testData/codeInsight/completion/keywords/primitivesInMethodReturningArray.java new file mode 100644 index 000000000000..4da9382f8418 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/primitivesInMethodReturningArray.java @@ -0,0 +1,8 @@ +class MyTest { + + [] foo() { + + } + +} + diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java index e7b34e71c3fd..cda69c211976 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/KeywordCompletionTest.java @@ -123,6 +123,7 @@ public class KeywordCompletionTest extends LightCompletionTestCase { 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 testPrimitivesInMethodReturningArray() { doTest(2, "true", "byte", "boolean"); } public void testImportStatic() { doTest(1, "static"); } public void testAbstractInInterface() { doTest(1, "abstract"); }