From d9aed3f444effaf7fcb78b6b6961dbeee83a0955 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 21 Apr 2014 20:10:41 +0200 Subject: [PATCH] process class names just once in completion --- .../completion/AllClassesGetter.java | 23 ++++--- .../impl/search/AllClassesSearchExecutor.java | 62 +++++++++++-------- 2 files changed, 48 insertions(+), 37 deletions(-) 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 a5431b56082a..270d6f93f767 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/AllClassesGetter.java @@ -22,20 +22,20 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.RangeMarker; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; +import com.intellij.psi.impl.search.AllClassesSearchExecutor; import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl; 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; import org.jetbrains.annotations.NotNull; +import java.util.LinkedHashSet; import java.util.Set; /** @@ -184,18 +184,17 @@ public class AllClassesGetter { @NotNull Project project, @NotNull GlobalSearchScope scope, @NotNull Processor processor) { - AllClassesSearch.search(scope, project, new Condition() { + final Set names = new THashSet(10000); + AllClassesSearchExecutor.processClassNames(project, scope, new Consumer() { @Override - public boolean value(String s) { - return prefixMatcher.isStartMatch(s); + public void consume(String s) { + if (prefixMatcher.prefixMatches(s)) { + names.add(s); + } } - }).forEach(processor); - AllClassesSearch.search(scope, project, new Condition() { - @Override - public boolean value(String s) { - return prefixMatcher.prefixMatches(s); - } - }).forEach(processor); + }); + LinkedHashSet sorted = CompletionUtil.sortMatching(prefixMatcher, names); + AllClassesSearchExecutor.processClassesByNames(project, scope, sorted, processor); } diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/AllClassesSearchExecutor.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/AllClassesSearchExecutor.java index 09b60c173f9b..293d3350040b 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/AllClassesSearchExecutor.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/AllClassesSearchExecutor.java @@ -30,6 +30,7 @@ import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.PsiShortNamesCache; import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.AllClassesSearch; +import com.intellij.util.Consumer; import com.intellij.util.Processor; import com.intellij.util.QueryExecutor; import com.intellij.util.indexing.IdFilter; @@ -57,39 +58,28 @@ public class AllClassesSearchExecutor implements QueryExecutor processor) { - Project project = parameters.getProject(); - final PsiShortNamesCache cache = PsiShortNamesCache.getInstance(project); - final ProgressIndicator indicator = ProgressIndicatorProvider.getGlobalProgressIndicator(); - final Set names = new THashSet(10000); - cache.processAllClassNames(new Processor() { - int i = 0; - + processClassNames(parameters.getProject(), scope, new Consumer() { @Override - public boolean process(String s) { - if (indicator != null && i++ % 512 == 0) { - indicator.checkCanceled(); - } + public void consume(String s) { if (parameters.nameMatches(s)) { names.add(s); } - return true; - } - }, scope, IdFilter.getProjectIdFilter(project, true)); - - if (indicator != null) { - indicator.checkCanceled(); - } - - List sorted = new ArrayList(names); - Collections.sort(sorted, new Comparator() { - @Override - public int compare(final String o1, final String o2) { - return o1.compareToIgnoreCase(o2); } }); - for (final String name : sorted) { + List sorted = new ArrayList(names); + Collections.sort(sorted, String.CASE_INSENSITIVE_ORDER); + + return processClassesByNames(parameters.getProject(), scope, sorted, processor); + } + + public static boolean processClassesByNames(Project project, + final GlobalSearchScope scope, + Collection names, + Processor processor) { + final PsiShortNamesCache cache = PsiShortNamesCache.getInstance(project); + for (final String name : names) { ProgressIndicatorProvider.checkCanceled(); final PsiClass[] classes = ApplicationManager.getApplication().runReadAction(new Computable() { @Override @@ -107,6 +97,28 @@ public class AllClassesSearchExecutor implements QueryExecutor consumer) { + final ProgressIndicator indicator = ProgressIndicatorProvider.getGlobalProgressIndicator(); + + PsiShortNamesCache.getInstance(project).processAllClassNames(new Processor() { + int i = 0; + + @Override + public boolean process(String s) { + if (indicator != null && i++ % 512 == 0) { + indicator.checkCanceled(); + } + consumer.consume(s); + return true; + } + }, scope, IdFilter.getProjectIdFilter(project, true)); + + if (indicator != null) { + indicator.checkCanceled(); + } + return project; + } + private static boolean processScopeRootForAllClasses(@NotNull final PsiElement scopeRoot, @NotNull final Processor processor) { final boolean[] stopped = {false};