mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
use the new stub index key processing API for class name completion
This commit is contained in:
+1
-1
@@ -39,7 +39,7 @@ public class DefaultClassNavigationContributor implements EfficientChooseByNameC
|
||||
if (FileBasedIndex.ourEnableTracingOfKeyHashToVirtualFileMapping) {
|
||||
GlobalSearchScope scope = includeNonProjectItems ? GlobalSearchScope.allScope(project) : GlobalSearchScope.projectScope(project);
|
||||
CommonProcessors.CollectProcessor<String> processor = new CommonProcessors.CollectProcessor<String>();
|
||||
processNames(processor, scope, DefaultFileNavigationContributor.getFilter(project, includeNonProjectItems));
|
||||
processNames(processor, scope, IdFilter.getProjectIdFilter(project, includeNonProjectItems));
|
||||
|
||||
return ArrayUtil.toStringArray(processor.getResults());
|
||||
}
|
||||
|
||||
+21
-46
@@ -24,8 +24,6 @@ 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.openapi.util.Key;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.search.LocalSearchScope;
|
||||
@@ -34,17 +32,13 @@ import com.intellij.psi.search.SearchScope;
|
||||
import com.intellij.psi.search.searches.AllClassesSearch;
|
||||
import com.intellij.util.Processor;
|
||||
import com.intellij.util.QueryExecutor;
|
||||
import com.intellij.util.TimedReference;
|
||||
import com.intellij.util.indexing.IdFilter;
|
||||
import gnu.trove.THashSet;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.lang.ref.SoftReference;
|
||||
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> {
|
||||
private static final Key<TimedReference<SoftReference<Pair<String[], Long>>>> ALL_CLASS_NAMES_CACHE = Key.create("ALL_CLASS_NAMES_CACHE");
|
||||
@Override
|
||||
public boolean execute(@NotNull final AllClassesSearch.SearchParameters queryParameters, @NotNull final Processor<PsiClass> consumer) {
|
||||
SearchScope scope = queryParameters.getScope();
|
||||
@@ -60,52 +54,34 @@ public class AllClassesSearchExecutor implements QueryExecutor<PsiClass, AllClas
|
||||
return true;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static String[] getAllClassNames(@NotNull final Project project) {
|
||||
return ApplicationManager.getApplication().runReadAction(new Computable<String[]>() {
|
||||
@Override
|
||||
public String[] compute() {
|
||||
final long modCount = PsiManager.getInstance(project).getModificationTracker().getJavaStructureModificationCount();
|
||||
TimedReference<SoftReference<Pair<String[], Long>>> ref1 = project.getUserData(ALL_CLASS_NAMES_CACHE);
|
||||
SoftReference<Pair<String[], Long>> ref2 = ref1 == null ? null : ref1.get();
|
||||
Pair<String[], Long> pair = ref2 == null ? null : ref2.get();
|
||||
if (pair != null && pair.second.equals(modCount)) {
|
||||
return pair.first;
|
||||
}
|
||||
|
||||
String[] names = PsiShortNamesCache.getInstance(project).getAllClassNames();
|
||||
ref1 = new TimedReference<SoftReference<Pair<String[], Long>>>(null);
|
||||
ref1.set(new SoftReference<Pair<String[], Long>>(Pair.create(names, modCount)));
|
||||
project.putUserData(ALL_CLASS_NAMES_CACHE, ref1);
|
||||
return names;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static boolean processAllClassesInGlobalScope(@NotNull final GlobalSearchScope scope,
|
||||
@NotNull AllClassesSearch.SearchParameters parameters,
|
||||
@NotNull final AllClassesSearch.SearchParameters parameters,
|
||||
@NotNull Processor<PsiClass> processor) {
|
||||
String[] names = getAllClassNames(parameters.getProject());
|
||||
Project project = parameters.getProject();
|
||||
final PsiShortNamesCache cache = PsiShortNamesCache.getInstance(project);
|
||||
final ProgressIndicator indicator = ProgressIndicatorProvider.getGlobalProgressIndicator();
|
||||
if (indicator != null) {
|
||||
indicator.checkCanceled();
|
||||
}
|
||||
|
||||
final Set<String> names = new THashSet<String>(10000);
|
||||
cache.processAllClassNames(new Processor<String>() {
|
||||
int i = 0;
|
||||
|
||||
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);
|
||||
@Override
|
||||
public boolean process(String s) {
|
||||
if (indicator != null && i++ % 512 == 0) {
|
||||
indicator.checkCanceled();
|
||||
}
|
||||
if (parameters.nameMatches(s)) {
|
||||
names.add(s);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (indicator != null && i % 512 == 0) {
|
||||
indicator.checkCanceled();
|
||||
}
|
||||
}
|
||||
}, scope, IdFilter.getProjectIdFilter(project, true));
|
||||
|
||||
if (indicator != null) {
|
||||
indicator.checkCanceled();
|
||||
}
|
||||
|
||||
List<String> sorted = new ArrayList<String>(names);
|
||||
Collections.sort(sorted, new Comparator<String>() {
|
||||
@Override
|
||||
public int compare(final String o1, final String o2) {
|
||||
@@ -113,7 +89,6 @@ public class AllClassesSearchExecutor implements QueryExecutor<PsiClass, AllClas
|
||||
}
|
||||
});
|
||||
|
||||
final PsiShortNamesCache cache = PsiShortNamesCache.getInstance(parameters.getProject());
|
||||
for (final String name : sorted) {
|
||||
ProgressIndicatorProvider.checkCanceled();
|
||||
final PsiClass[] classes = ApplicationManager.getApplication().runReadAction(new Computable<PsiClass[]>() {
|
||||
|
||||
@@ -15,9 +15,53 @@
|
||||
*/
|
||||
package com.intellij.util.indexing;
|
||||
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.progress.ProgressManager;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.ContentIterator;
|
||||
import com.intellij.openapi.roots.ProjectRootManager;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.vfs.VirtualFileWithId;
|
||||
|
||||
import java.util.BitSet;
|
||||
|
||||
/**
|
||||
* Created by Maxim.Mossienko on 8/14/13.
|
||||
*/
|
||||
public abstract class IdFilter {
|
||||
public static final Logger LOG = Logger.getInstance("#com.intellij.ide.util.gotoByName.DefaultFileNavigationContributor");
|
||||
|
||||
public static IdFilter getProjectIdFilter(Project project, boolean includeNonProjectItems) {
|
||||
long started = System.currentTimeMillis();
|
||||
final BitSet idSet = new BitSet();
|
||||
|
||||
ContentIterator iterator = new ContentIterator() {
|
||||
@Override
|
||||
public boolean processFile(VirtualFile fileOrDir) {
|
||||
idSet.set(
|
||||
((VirtualFileWithId)fileOrDir).getId()
|
||||
);
|
||||
ProgressManager.checkCanceled();
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
if (!includeNonProjectItems) {
|
||||
ProjectRootManager.getInstance(project).getFileIndex().iterateContent(iterator);
|
||||
} else {
|
||||
FileBasedIndex.getInstance().iterateIndexableFiles(iterator, project, null);
|
||||
}
|
||||
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug("Done filter " + (System.currentTimeMillis() -started) + ":" + idSet.size());
|
||||
}
|
||||
return new IdFilter() {
|
||||
@Override
|
||||
public boolean contains(int id) {
|
||||
return idSet.get(id);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public abstract boolean contains(int id);
|
||||
}
|
||||
|
||||
+2
-2
@@ -35,9 +35,9 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.CommonProcessors;
|
||||
import com.intellij.util.Processor;
|
||||
import com.intellij.util.SynchronizedCollectConsumer;
|
||||
import com.intellij.util.containers.ConcurrentHashMap;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.indexing.IdFilter;
|
||||
import gnu.trove.THashSet;
|
||||
import gnu.trove.TIntHashSet;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -107,7 +107,7 @@ public abstract class ContributorsBasedGotoByModel implements EfficientChooseByN
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}, DefaultFileNavigationContributor.getScope(myProject, checkBoxState), DefaultFileNavigationContributor.getFilter(myProject, checkBoxState));
|
||||
}, DefaultFileNavigationContributor.getScope(myProject, checkBoxState), IdFilter.getProjectIdFilter(myProject, checkBoxState));
|
||||
} else {
|
||||
String[] names = contributor.getNames(myProject, checkBoxState);
|
||||
for (String element : names) {
|
||||
|
||||
+5
-46
@@ -17,14 +17,8 @@ package com.intellij.ide.util.gotoByName;
|
||||
|
||||
import com.intellij.navigation.EfficientChooseByNameContributor;
|
||||
import com.intellij.navigation.NavigationItem;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.progress.ProgressManager;
|
||||
import com.intellij.openapi.project.DumbAware;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.ContentIterator;
|
||||
import com.intellij.openapi.roots.ProjectRootManager;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.vfs.VirtualFileWithId;
|
||||
import com.intellij.psi.PsiFileSystemItem;
|
||||
import com.intellij.psi.search.FilenameIndex;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
@@ -36,17 +30,14 @@ import com.intellij.util.indexing.IdFilter;
|
||||
import gnu.trove.THashSet;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.BitSet;
|
||||
|
||||
public class DefaultFileNavigationContributor implements EfficientChooseByNameContributor, DumbAware {
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.ide.util.gotoByName.DefaultFileNavigationContributor");
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String[] getNames(Project project, boolean includeNonProjectItems) {
|
||||
if (FileBasedIndex.ourEnableTracingOfKeyHashToVirtualFileMapping) {
|
||||
final THashSet<String> names = new THashSet<String>(1000);
|
||||
IdFilter filter = getFilter(project, includeNonProjectItems);
|
||||
IdFilter filter = IdFilter.getProjectIdFilter(project, includeNonProjectItems);
|
||||
processNames(new Processor<String>() {
|
||||
@Override
|
||||
public boolean process(String s) {
|
||||
@@ -54,8 +45,8 @@ public class DefaultFileNavigationContributor implements EfficientChooseByNameCo
|
||||
return true;
|
||||
}
|
||||
}, getScope(project, includeNonProjectItems), filter);
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug("All names retrieved2:" + names.size());
|
||||
if (IdFilter.LOG.isDebugEnabled()) {
|
||||
IdFilter.LOG.debug("All names retrieved2:" + names.size());
|
||||
}
|
||||
return ArrayUtil.toStringArray(names);
|
||||
} else {
|
||||
@@ -67,38 +58,6 @@ public class DefaultFileNavigationContributor implements EfficientChooseByNameCo
|
||||
return includeNonProjectItems ? GlobalSearchScope.projectScope(project) : GlobalSearchScope.allScope(project);
|
||||
}
|
||||
|
||||
public static IdFilter getFilter(Project project, boolean includeNonProjectItems) {
|
||||
long started = System.currentTimeMillis();
|
||||
final BitSet idSet = new BitSet();
|
||||
|
||||
ContentIterator iterator = new ContentIterator() {
|
||||
@Override
|
||||
public boolean processFile(VirtualFile fileOrDir) {
|
||||
idSet.set(
|
||||
((VirtualFileWithId)fileOrDir).getId()
|
||||
);
|
||||
ProgressManager.checkCanceled();
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
if (!includeNonProjectItems) {
|
||||
ProjectRootManager.getInstance(project).getFileIndex().iterateContent(iterator);
|
||||
} else {
|
||||
FileBasedIndex.getInstance().iterateIndexableFiles(iterator, project, null);
|
||||
}
|
||||
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug("Done filter " + (System.currentTimeMillis() -started) + ":" + idSet.size());
|
||||
}
|
||||
return new IdFilter() {
|
||||
@Override
|
||||
public boolean contains(int id) {
|
||||
return idSet.get(id);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public NavigationItem[] getItemsByName(String name, final String pattern, Project project, boolean includeNonProjectItems) {
|
||||
@@ -124,8 +83,8 @@ public class DefaultFileNavigationContributor implements EfficientChooseByNameCo
|
||||
return processor.process(s);
|
||||
}
|
||||
}, scope, filter);
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug("All names retrieved:" + (System.currentTimeMillis() - started));
|
||||
if (IdFilter.LOG.isDebugEnabled()) {
|
||||
IdFilter.LOG.debug("All names retrieved:" + (System.currentTimeMillis() - started));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user