diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/Java15CompletionData.java b/java/java-impl/src/com/intellij/codeInsight/completion/Java15CompletionData.java index 92a4c9dc5aa3..9a72690035b6 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/Java15CompletionData.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/Java15CompletionData.java @@ -50,15 +50,6 @@ public class Java15CompletionData extends JavaCompletionData { registerVariant(variant); } - - { - final CompletionVariant variant = new CompletionVariant(PsiJavaFile.class, CLASS_START); - variant.includeScopeClass(PsiClass.class); - - variant.addCompletion(PsiKeyword.ENUM, TailType.HUMBLE_SPACE_BEFORE_WORD); - registerVariant(variant); - } - } protected void initVariantsInClassScope() { 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 e79c47edf9b2..35fe9016630d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionData.java @@ -138,17 +138,6 @@ public class JavaCompletionData extends JavaAwareCompletionData { not(psiElement().inside(PsiAnnotation.class)), not(START_SWITCH)); - public static final AndFilter CLASS_START = new AndFilter( - new OrFilter( - END_OF_BLOCK, - new PatternFilter(psiElement().afterLeaf( - or( - psiElement().withoutText(".").inside(psiElement(PsiModifierList.class).withParent(not(psiElement(PsiParameter.class)))).andNot( - psiElement().inside(PsiAnnotationParameterList.class)), - psiElement().isNull()))) - ), - new PatternFilter(not(psiElement().afterLeaf("@")))); - private static final String[] PRIMITIVE_TYPES = new String[]{ PsiKeyword.SHORT, PsiKeyword.BOOLEAN, PsiKeyword.DOUBLE, PsiKeyword.LONG, @@ -233,16 +222,6 @@ public class JavaCompletionData extends JavaAwareCompletionData { } protected void initVariantsInFileScope(){ - { - final CompletionVariant variant = new CompletionVariant(PsiJavaFile.class, CLASS_START); - variant.includeScopeClass(PsiClass.class); - - variant.addCompletion(PsiKeyword.CLASS); - variant.addCompletion(PsiKeyword.INTERFACE); - - registerVariant(variant); - } - } /** @@ -513,11 +492,17 @@ public class JavaCompletionData extends JavaAwareCompletionData { result.addElement(TailTypeDecorator.withTail(createKeyword(position, PsiKeyword.FINAL), TailType.HUMBLE_SPACE_BEFORE_WORD)); } - if (CLASS_START.isAcceptable(position, position) && - PsiTreeUtil.getNonStrictParentOfType(position, PsiLiteralExpression.class, PsiComment.class) == null) { + if (isSuitableForClass(position)) { for (String s : ModifierChooser.getKeywords(position)) { result.addElement(new OverrideableSpace(createKeyword(position, s), TailType.HUMBLE_SPACE_BEFORE_WORD)); } + result.addElement(new OverrideableSpace(createKeyword(position, PsiKeyword.CLASS), TailType.HUMBLE_SPACE_BEFORE_WORD)); + if (PsiTreeUtil.getParentOfType(position, PsiCodeBlock.class, true, PsiMember.class) == null) { + result.addElement(new OverrideableSpace(createKeyword(position, PsiKeyword.INTERFACE), TailType.HUMBLE_SPACE_BEFORE_WORD)); + if (PsiUtil.getLanguageLevel(position).isAtLeast(LanguageLevel.JDK_1_5)) { + result.addElement(new OverrideableSpace(createKeyword(position, PsiKeyword.ENUM), TailType.INSERT_SPACE)); + } + } } addPrimitiveTypes(result, position); @@ -538,6 +523,23 @@ public class JavaCompletionData extends JavaAwareCompletionData { } } + public static boolean isSuitableForClass(PsiElement position) { + if (psiElement().afterLeaf("@").accepts(position) || + PsiTreeUtil.getNonStrictParentOfType(position, PsiLiteralExpression.class, PsiComment.class) != null) { + return false; + } + + if (psiElement().afterLeaf( + or( + psiElement().withoutText(".").inside(psiElement(PsiModifierList.class).withParent(not(psiElement(PsiParameter.class)))).andNot( + psiElement().inside(PsiAnnotationParameterList.class)), + psiElement().isNull())).accepts(position)) { + return true; + } + + return END_OF_BLOCK.isAcceptable(position, position); + } + static void addExpectedTypeMembers(CompletionParameters parameters, final CompletionResultSet result, PsiElement position) { for (final ExpectedTypeInfo info : JavaSmartCompletionContributor.getExpectedTypes(parameters)) { new JavaMembersGetter(info.getDefaultType(), parameters).addMembers(parameters.getInvocationCount() > 1, new Consumer() { diff --git a/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java b/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java index efdf2675c37b..76bcf2a80035 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java @@ -159,7 +159,7 @@ public abstract class JavaCodeContextType extends TemplateContextType { return false; } - return JavaCompletionData.CLASS_START.isAcceptable(element, element) || JavaCompletionData.isInsideParameterList(element); + return JavaCompletionData.isSuitableForClass(element) || JavaCompletionData.isInsideParameterList(element); } } diff --git a/java/java-tests/testData/codeInsight/completion/keywords/classInMethod.java b/java/java-tests/testData/codeInsight/completion/keywords/classInMethod.java new file mode 100644 index 000000000000..c9f963cf6854 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/keywords/classInMethod.java @@ -0,0 +1,5 @@ +public class Util { + void foo() { + c + } +} 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 97498c8b06eb..c55902596223 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/KeywordCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/KeywordCompletionTest.java @@ -102,6 +102,7 @@ public class KeywordCompletionTest extends LightCompletionTestCase { public void testCharInAnnotatedParameter() throws Exception { doTest(1, "char"); } public void testReturnInTernary() throws Exception { doTest(1, "return"); } public void testFinalAfterParameterAnno() throws Exception { doTest(2, "final", "float", "class"); } + public void testClassInMethod() throws Exception { doTest(2, "class", "char"); } public void testTryInExpression() throws Exception { configureByFile(BASE_PATH + "/" + getTestName(true) + ".java");