faster class name completion

This commit is contained in:
peter
2013-07-04 19:55:11 +02:00
parent 615ae0d90d
commit 1d72da71bb
4 changed files with 47 additions and 22 deletions
@@ -23,6 +23,7 @@ import com.intellij.psi.PsiMethod;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.PsiShortNamesCache;
import com.intellij.util.ArrayUtil;
import com.intellij.util.CommonProcessors;
import com.intellij.util.Processor;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.HashSet;
@@ -93,6 +94,17 @@ public class CompositeShortNamesCache extends PsiShortNamesCache {
return result != null ? result : ArrayUtil.EMPTY_STRING_ARRAY;
}
@Override
public boolean processAllClassNames(Processor<String> processor) {
CommonProcessors.UniqueProcessor<String> uniqueProcessor = new CommonProcessors.UniqueProcessor<String>(processor);
for (PsiShortNamesCache cache : myCaches) {
if (!cache.processAllClassNames(uniqueProcessor)) {
return false;
}
}
return true;
}
@Override
public void getAllClassNames(@NotNull HashSet<String> dest) {
for (PsiShortNamesCache cache : myCaches) {
@@ -106,7 +106,12 @@ public class PsiShortNamesCacheImpl extends PsiShortNamesCache {
@Override
public void getAllClassNames(@NotNull HashSet<String> set) {
JavaShortClassNameIndex.getInstance().processAllKeys(myManager.getProject(), new CommonProcessors.CollectProcessor<String>(set));
processAllClassNames(new CommonProcessors.CollectProcessor<String>(set));
}
@Override
public boolean processAllClassNames(Processor<String> processor) {
return JavaShortClassNameIndex.getInstance().processAllKeys(myManager.getProject(), processor);
}
@Override
@@ -31,12 +31,10 @@ import com.intellij.psi.search.SearchScope;
import com.intellij.psi.search.searches.AllClassesSearch;
import com.intellij.util.Processor;
import com.intellij.util.QueryExecutor;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.*;
public class AllClassesSearchExecutor implements QueryExecutor<PsiClass, AllClassesSearch.SearchParameters> {
@Override
@@ -54,31 +52,36 @@ public class AllClassesSearchExecutor implements QueryExecutor<PsiClass, AllClas
return true;
}
private static boolean processAllClassesInGlobalScope(final GlobalSearchScope scope, final Processor<PsiClass> processor, AllClassesSearch.SearchParameters parameters) {
private static boolean processAllClassesInGlobalScope(final GlobalSearchScope scope, final Processor<PsiClass> processor, final AllClassesSearch.SearchParameters parameters) {
final PsiShortNamesCache cache = PsiShortNamesCache.getInstance(parameters.getProject());
final String[] names = ApplicationManager.getApplication().runReadAction(new Computable<String[]>() {
@Override
public String[] compute() {
return cache.getAllClassNames();
}
});
final Set<String> names = new THashSet<String>();
final ProgressIndicator indicator = ProgressIndicatorProvider.getGlobalProgressIndicator();
if (indicator != null) {
indicator.checkCanceled();
}
List<String> sorted = new ArrayList<String>(names.length);
for (int i = 0; i < names.length; i++) {
String name = names[i];
if (parameters.nameMatches(name)) {
sorted.add(name);
ApplicationManager.getApplication().runReadAction(new Runnable() {
@Override
public void run() {
cache.processAllClassNames(new Processor<String>() {
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;
}
});
}
if (indicator != null && i % 512 == 0) {
indicator.checkCanceled();
}
}
});
List<String> sorted = new ArrayList<String>(names);
if (indicator != null) {
indicator.checkCanceled();