diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java index cc3d3fd2178f..c299e311aa80 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.ExpectedTypeInfo; import com.intellij.codeInsight.ExpectedTypesProvider; +import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.lang.LangBundle; import com.intellij.lang.StdLanguages; import com.intellij.openapi.actionSystem.IdeActions; @@ -58,45 +59,10 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { final CompletionResultSet result = JavaCompletionSorting.addJavaSorting(parameters, _result); - final PsiElement insertedElement = parameters.getPosition(); - - final ElementFilter filter = - or(JavaSmartCompletionContributor.AFTER_THROW_NEW, - JavaCompletionContributor.INSIDE_METHOD_THROWS_CLAUSE, - JavaCompletionContributor.IN_CATCH_TYPE).accepts(insertedElement) ? new AssignableFromFilter(CommonClassNames.JAVA_LANG_THROWABLE) : - IN_TYPE_PARAMETER.accepts(insertedElement) ? new ExcludeDeclaredFilter(new ClassFilter(PsiTypeParameter.class)) : - TrueFilter.INSTANCE; - - - final boolean inJavaContext = parameters.getPosition() instanceof PsiIdentifier; - if (AFTER_NEW.accepts(insertedElement)) { - final PsiExpression expr = PsiTreeUtil.getContextOfType(insertedElement, PsiExpression.class, true); - for (final ExpectedTypeInfo info : ExpectedTypesProvider.getExpectedTypes(expr, true)) { - final PsiType type = info.getType(); - final PsiClass psiClass = PsiUtil.resolveClassInType(type); - if (psiClass != null) { - result.addElement(createClassLookupItem(psiClass, inJavaContext)); - } - final PsiType defaultType = info.getDefaultType(); - if (!defaultType.equals(type)) { - final PsiClass defClass = PsiUtil.resolveClassInType(defaultType); - if (defClass != null) { - result.addElement(createClassLookupItem(defClass, inJavaContext)); - } - } - } - } - - final boolean lookingForAnnotations = PsiJavaPatterns.psiElement().afterLeaf("@").accepts(insertedElement); - - AllClassesGetter.processJavaClasses(parameters, result.getPrefixMatcher(), parameters.getInvocationCount() <= 1, new Consumer() { + addAllClasses(parameters, result, new Consumer() { @Override - public void consume(PsiClass psiClass) { - if (lookingForAnnotations && !psiClass.isAnnotationType()) return; - - if (filter.isAcceptable(psiClass, insertedElement)) { - result.addElement(createClassLookupItem(psiClass, inJavaContext)); - } + public void consume(LookupElement element) { + _result.addElement(element); } }); } @@ -104,6 +70,51 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { } + public static void addAllClasses(CompletionParameters parameters, final CompletionResultSet result, @NotNull final Consumer consumer) { + final PsiElement insertedElement = parameters.getPosition(); + + final ElementFilter filter = + or(JavaSmartCompletionContributor.AFTER_THROW_NEW, + JavaCompletionContributor.INSIDE_METHOD_THROWS_CLAUSE, + JavaCompletionContributor.IN_CATCH_TYPE).accepts(insertedElement) ? new AssignableFromFilter(CommonClassNames.JAVA_LANG_THROWABLE) : + IN_TYPE_PARAMETER.accepts(insertedElement) ? new ExcludeDeclaredFilter(new ClassFilter(PsiTypeParameter.class)) : + TrueFilter.INSTANCE; + + + final boolean inJavaContext = parameters.getPosition() instanceof PsiIdentifier; + if (AFTER_NEW.accepts(insertedElement)) { + final PsiExpression expr = PsiTreeUtil.getContextOfType(insertedElement, PsiExpression.class, true); + for (final ExpectedTypeInfo info : ExpectedTypesProvider.getExpectedTypes(expr, true)) { + final PsiType type = info.getType(); + final PsiClass psiClass = PsiUtil.resolveClassInType(type); + if (psiClass != null) { + consumer.consume(createClassLookupItem(psiClass, inJavaContext)); + } + final PsiType defaultType = info.getDefaultType(); + if (!defaultType.equals(type)) { + final PsiClass defClass = PsiUtil.resolveClassInType(defaultType); + if (defClass != null) { + consumer.consume(createClassLookupItem(defClass, inJavaContext)); + } + } + } + } + + final boolean lookingForAnnotations = PsiJavaPatterns.psiElement().afterLeaf("@").accepts(insertedElement); + + AllClassesGetter + .processJavaClasses(parameters, result.getPrefixMatcher(), parameters.getInvocationCount() <= 1, new Consumer() { + @Override + public void consume(PsiClass psiClass) { + if (lookingForAnnotations && !psiClass.isAnnotationType()) return; + + if (filter.isAcceptable(psiClass, insertedElement)) { + consumer.consume(createClassLookupItem(psiClass, inJavaContext)); + } + } + }); + } + public static JavaPsiClassReferenceElement createClassLookupItem(final PsiClass psiClass, final boolean inJavaContext) { return AllClassesGetter.createLookupItem(psiClass, inJavaContext ? JavaClassNameInsertHandler.JAVA_CLASS_INSERT_HANDLER : AllClassesGetter.TRY_SHORTENING); } 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 24322a3e410e..6ba1da7d07d4 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -30,7 +30,10 @@ import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.patterns.*; +import com.intellij.patterns.ElementPattern; +import com.intellij.patterns.PatternCondition; +import com.intellij.patterns.PsiJavaElementPattern; +import com.intellij.patterns.PsiNameValuePairPattern; import com.intellij.psi.*; import com.intellij.psi.codeStyle.NameUtil; import com.intellij.psi.filters.*; @@ -212,15 +215,14 @@ public class JavaCompletionContributor extends CompletionContributor { PsiElement position, final InheritorsHolder inheritors) { if (shouldRunClassNameCompletion(result, position)) { - result.runRemainingContributors(parameters.withType(CompletionType.CLASS_NAME), - new Consumer() { - @Override - public void consume(LookupElement lookupElement) { - if (!inheritors.alreadyProcessed(lookupElement)) { - result.addElement(lookupElement); - } + JavaClassNameCompletionContributor.addAllClasses(parameters, result, new Consumer() { + @Override + public void consume(LookupElement element) { + if (!inheritors.alreadyProcessed(element)) { + result.addElement(element); } - }); + } + }); } }