From 452a7b63df21f5d8404b5e0802849f0cec913389 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 4 Jul 2013 22:24:29 +0200 Subject: [PATCH] faster class name completion: cache all class names --- .../impl/search/AllClassesSearchExecutor.java | 61 +++++++++++-------- 1 file changed, 36 insertions(+), 25 deletions(-) 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 8d8d2e21a046..ec6c197b32ec 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 @@ -22,6 +22,7 @@ package com.intellij.psi.impl.search; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressIndicatorProvider; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; @@ -29,12 +30,18 @@ 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.psi.util.CachedValueProvider; +import com.intellij.psi.util.CachedValuesManager; +import com.intellij.psi.util.PsiModificationTracker; import com.intellij.util.Processor; import com.intellij.util.QueryExecutor; -import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; public class AllClassesSearchExecutor implements QueryExecutor { @Override @@ -51,37 +58,40 @@ public class AllClassesSearchExecutor implements QueryExecutor() { + @Nullable + @Override + public Result compute() { + String[] names = ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public String[] compute() { + return PsiShortNamesCache.getInstance(project).getAllClassNames(); + } + }); + return Result.create(names, PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT); + } + }); + } private static boolean processAllClassesInGlobalScope(final GlobalSearchScope scope, final Processor processor, final AllClassesSearch.SearchParameters parameters) { - final PsiShortNamesCache cache = PsiShortNamesCache.getInstance(parameters.getProject()); - - final Set names = new THashSet(); + String[] names = getAllClassNames(parameters.getProject()); final ProgressIndicator indicator = ProgressIndicatorProvider.getGlobalProgressIndicator(); if (indicator != null) { indicator.checkCanceled(); } - ApplicationManager.getApplication().runReadAction(new Runnable() { - @Override - public void run() { - cache.processAllClassNames(new Processor() { - int i = 0; - @Override - public boolean process(String s) { - if (parameters.nameMatches(s)) { - names.add(s); - } - if (indicator != null && i++ % 512 == 0) { - indicator.checkCanceled(); - } - - return true; - } - }); + List sorted = new ArrayList(names.length); + for (int i = 0; i < names.length; i++) { + String name = names[i]; + if (parameters.nameMatches(name)) { + sorted.add(name); } - }); - - List sorted = new ArrayList(names); + if (indicator != null && i % 512 == 0) { + indicator.checkCanceled(); + } + } if (indicator != null) { indicator.checkCanceled(); @@ -94,6 +104,7 @@ public class AllClassesSearchExecutor implements QueryExecutor() {