diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java b/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java index 4010d61cfdb0..257bddd6d07a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java @@ -24,12 +24,11 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.RangeMarker; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.util.Condition; -import com.intellij.patterns.PsiJavaPatterns; import com.intellij.psi.*; -import com.intellij.psi.filters.ElementFilter; import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.searches.AllClassesSearch; +import com.intellij.util.Consumer; import com.intellij.util.IncorrectOperationException; import com.intellij.util.Processor; import gnu.trove.THashSet; @@ -46,7 +45,6 @@ import java.util.Set; */ public class AllClassesGetter { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.completion.AllClassesGetter"); - private final ElementFilter myFilter; private static final InsertHandler INSERT_HANDLER = new InsertHandler() { private void _handleInsert(final InsertionContext context, final JavaPsiClassReferenceElement item) { @@ -138,30 +136,15 @@ public class AllClassesGetter { }; - public AllClassesGetter(final ElementFilter filter) { - myFilter = filter; - } - - public void getClasses(final PsiElement context, final CompletionResultSet set, final int offset, final boolean filterByScope) { - if (context == null || !context.isValid()) return; - - final boolean lookingForAnnotations = PsiJavaPatterns.psiElement().afterLeaf("@").accepts(context); - getClasses(context, set, offset, filterByScope, lookingForAnnotations); - } - - public void getClasses(final PsiElement context, - final CompletionResultSet set, - final int offset, - final boolean filterByScope, - final boolean lookingForAnnotations) { - if (context == null || !context.isValid()) return; - - final String packagePrefix = getPackagePrefix(context, offset); + public static void processJavaClasses(CompletionParameters parameters, + final PrefixMatcher prefixMatcher, final boolean filterByScope, + final Consumer consumer) { + final PsiElement context = parameters.getPosition(); + final String packagePrefix = getPackagePrefix(context, parameters.getOffset()); final Set qnames = new THashSet(); final GlobalSearchScope scope = filterByScope ? context.getContainingFile().getResolveScope() : GlobalSearchScope.allScope(context.getProject()); - final PrefixMatcher prefixMatcher = set.getPrefixMatcher(); AllClassesSearch.search(scope, context.getProject(), new Condition() { public boolean value(String s) { @@ -170,14 +153,15 @@ public class AllClassesGetter { }).forEach(new Processor() { public boolean process(PsiClass psiClass) { assert psiClass != null; - if (isSuitable(context, packagePrefix, qnames, lookingForAnnotations, psiClass, filterByScope)) { - set.addElement(createLookupItem(psiClass)); + if (isSuitable(context, packagePrefix, qnames, psiClass, filterByScope)) { + consumer.consume(psiClass); } return true; } }); } + private static String getPackagePrefix(final PsiElement context, final int offset) { final String fileText = context.getContainingFile().getText(); int i = offset - 1; @@ -191,23 +175,18 @@ public class AllClassesGetter { return j > 0 ? prefix.substring(0, j) : ""; } - private boolean isSuitable(@NotNull final PsiElement context, final String packagePrefix, final Set qnames, - final boolean lookingForAnnotations, + private static boolean isSuitable(@NotNull final PsiElement context, final String packagePrefix, final Set qnames, @NotNull final PsiClass psiClass, final boolean filterByScope) { ProgressManager.checkCanceled(); if (!context.isValid() || !psiClass.isValid()) return false; - if (lookingForAnnotations && !psiClass.isAnnotationType()) return false; - if (JavaCompletionUtil.isInExcludedPackage(psiClass)) return false; final String qualifiedName = psiClass.getQualifiedName(); if (qualifiedName == null || !qualifiedName.startsWith(packagePrefix)) return false; - if (!myFilter.isAcceptable(psiClass, context)) return false; - if (!(psiClass instanceof PsiCompiledElement) || !filterByScope || JavaPsiFacade.getInstance(psiClass.getProject()).getResolveHelper().isAccessible(psiClass, context, psiClass)) { return qnames.add(qualifiedName); 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 c663c8072f3b..978cefc6d1ef 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java @@ -23,14 +23,17 @@ import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.text.StringUtil; import com.intellij.patterns.PsiJavaElementPattern; +import com.intellij.patterns.PsiJavaPatterns; import com.intellij.psi.*; import com.intellij.psi.filters.ClassFilter; +import com.intellij.psi.filters.ElementFilter; import com.intellij.psi.filters.TrueFilter; import com.intellij.psi.filters.classes.ThisOrAnyInnerFilter; import com.intellij.psi.filters.element.ExcludeDeclaredFilter; import com.intellij.psi.filters.types.AssignableFromFilter; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; +import com.intellij.util.Consumer; import com.intellij.util.ProcessingContext; import org.jetbrains.annotations.NotNull; @@ -57,18 +60,14 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { CompletionService.getCompletionService().setAdvertisementText(CompletionBundle.message("completion.class.name.hint.2", getActionShortcut(IdeActions.ACTION_CLASS_NAME_COMPLETION))); } - PsiElement insertedElement = parameters.getPosition(); + final PsiElement insertedElement = parameters.getPosition(); + + final ElementFilter filter = + AFTER_THROW_NEW.accepts(insertedElement) ? new AssignableFromFilter("java.lang.Throwable") : + IN_TYPE_PARAMETER.accepts(insertedElement) ? new ExcludeDeclaredFilter(new ClassFilter(PsiTypeParameter.class)) : + INSIDE_METHOD_THROWS_CLAUSE.accepts(insertedElement) ? new ThisOrAnyInnerFilter(new AssignableFromFilter("java.lang.Throwable")) : + TrueFilter.INSTANCE; - AllClassesGetter getter = new AllClassesGetter(TrueFilter.INSTANCE); - if (AFTER_THROW_NEW.accepts(insertedElement)) { - getter = new AllClassesGetter(new AssignableFromFilter("java.lang.Throwable")); - } - else if (IN_TYPE_PARAMETER.accepts(insertedElement)) { - getter = new AllClassesGetter(new ExcludeDeclaredFilter(new ClassFilter(PsiTypeParameter.class))); - } - else if (INSIDE_METHOD_THROWS_CLAUSE.accepts(insertedElement)) { - getter = new AllClassesGetter(new ThisOrAnyInnerFilter(new AssignableFromFilter("java.lang.Throwable"))); - } if (AFTER_NEW.accepts(insertedElement)) { final PsiExpression expr = PsiTreeUtil.getContextOfType(insertedElement, PsiExpression.class, true); @@ -88,7 +87,18 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { } } - getter.getClasses(insertedElement, result, parameters.getOffset(), parameters.getInvocationCount() <= 1); + 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)) { + result.addElement(AllClassesGetter.createLookupItem(psiClass)); + } + } + }); } });