use new api for better candidates (belonging to navigatable scope)

This commit is contained in:
Maxim.Mossienko
2013-08-21 17:30:37 +02:00
parent 75c58e1845
commit 83b6e645a3
9 changed files with 160 additions and 10 deletions
@@ -15,6 +15,7 @@
*/
package com.intellij.ide.util.gotoByName;
import com.intellij.navigation.EfficientChooseByNameContributor;
import com.intellij.navigation.GotoClassContributor;
import com.intellij.navigation.NavigationItem;
import com.intellij.openapi.project.Project;
@@ -22,14 +23,27 @@ import com.intellij.psi.PsiClass;
import com.intellij.psi.presentation.java.SymbolPresentationUtil;
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.indexing.FileBasedIndex;
import com.intellij.util.indexing.IdFilter;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
public class DefaultClassNavigationContributor implements GotoClassContributor {
public class DefaultClassNavigationContributor implements EfficientChooseByNameContributor, GotoClassContributor {
@Override
@NotNull
public String[] getNames(Project project, boolean includeNonProjectItems) {
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));
return ArrayUtil.toStringArray(processor.getResults());
}
return PsiShortNamesCache.getInstance(project).getAllClassNames();
}
@@ -54,18 +68,26 @@ public class DefaultClassNavigationContributor implements GotoClassContributor {
@Override
public String getQualifiedName(final NavigationItem item) {
if (item instanceof PsiClass) {
final PsiClass psiClass = (PsiClass)item;
final String qName = psiClass.getQualifiedName();
if (qName != null) return qName;
final String containerText = SymbolPresentationUtil.getSymbolContainerText(psiClass);
return containerText + "." + psiClass.getName();
return getQualifiedNameForClass((PsiClass)item);
}
return null;
}
public static String getQualifiedNameForClass(PsiClass psiClass) {
final String qName = psiClass.getQualifiedName();
if (qName != null) return qName;
final String containerText = SymbolPresentationUtil.getSymbolContainerText(psiClass);
return containerText + "." + psiClass.getName();
}
@Override
public String getQualifiedNameSeparator() {
return ".";
}
@Override
public void processNames(Processor<String> processor, GlobalSearchScope scope, IdFilter filter) {
PsiShortNamesCache.getInstance(scope.getProject()).processAllClassNames(processor, scope, filter);
}
}
@@ -20,9 +20,11 @@ import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
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;
import com.intellij.util.indexing.IdFilter;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -89,6 +91,10 @@ public abstract class PsiShortNamesCache {
return ContainerUtil.process(getAllClassNames(), processor);
}
public boolean processAllClassNames(Processor<String> processor, GlobalSearchScope scope, IdFilter filter) {
return ContainerUtil.process(getAllClassNames(), processor);
}
/**
* Adds the names of all classes in the project and (optionally) libraries
* to the specified set.
@@ -27,6 +27,7 @@ import com.intellij.util.CommonProcessors;
import com.intellij.util.Processor;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.HashSet;
import com.intellij.util.indexing.IdFilter;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -105,6 +106,16 @@ public class CompositeShortNamesCache extends PsiShortNamesCache {
return true;
}
@Override
public boolean processAllClassNames(Processor<String> processor, GlobalSearchScope scope, IdFilter filter) {
for (PsiShortNamesCache cache : myCaches) {
if (!cache.processAllClassNames(processor, scope, filter)) {
return false;
}
}
return true;
}
@Override
public void getAllClassNames(@NotNull HashSet<String> dest) {
for (PsiShortNamesCache cache : myCaches) {
@@ -32,6 +32,8 @@ import com.intellij.util.CommonProcessors;
import com.intellij.util.Processor;
import com.intellij.util.SmartList;
import com.intellij.util.containers.HashSet;
import com.intellij.util.indexing.FileBasedIndex;
import com.intellij.util.indexing.IdFilter;
import gnu.trove.THashSet;
import gnu.trove.TObjectHashingStrategy;
import org.jetbrains.annotations.NonNls;
@@ -114,6 +116,11 @@ public class PsiShortNamesCacheImpl extends PsiShortNamesCache {
return JavaShortClassNameIndex.getInstance().processAllKeys(myManager.getProject(), processor);
}
@Override
public boolean processAllClassNames(Processor<String> processor, GlobalSearchScope scope, IdFilter filter) {
return StubIndex.getInstance().processAllKeys(JavaStubIndexKeys.CLASS_SHORT_NAMES, processor, scope, filter);
}
@Override
@NotNull
public PsiMethod[] getMethodsByName(@NotNull String name, @NotNull final GlobalSearchScope scope) {
@@ -26,6 +26,7 @@ import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.stubs.StringStubIndexExtension;
import com.intellij.psi.stubs.StubIndex;
import com.intellij.psi.stubs.StubIndexKey;
import com.intellij.util.indexing.FileBasedIndex;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
@@ -33,10 +34,16 @@ import java.util.Collection;
public class JavaShortClassNameIndex extends StringStubIndexExtension<PsiClass> {
private static final JavaShortClassNameIndex ourInstance = new JavaShortClassNameIndex();
public static JavaShortClassNameIndex getInstance() {
return ourInstance;
}
@Override
public int getVersion() {
return super.getVersion() + (FileBasedIndex.ourEnableTracingOfKeyHashToVirtualFileMapping ? 1 : 0);
}
@NotNull
@Override
public StubIndexKey<String, PsiClass> getKey() {
@@ -47,4 +54,9 @@ public class JavaShortClassNameIndex extends StringStubIndexExtension<PsiClass>
public Collection<PsiClass> get(final String s, final Project project, @NotNull final GlobalSearchScope scope) {
return StubIndex.getInstance().safeGet(getKey(), s, project, new JavaSourceFilterScope(scope), PsiClass.class);
}
@Override
public boolean traceKeyHashToVirtualFileMapping() {
return FileBasedIndex.ourEnableTracingOfKeyHashToVirtualFileMapping;
}
}
@@ -71,7 +71,7 @@ public class FilenameIndex extends ScalarIndexExtension<String> {
@Override
public int getVersion() {
return 1;
return 1 + (FileBasedIndex.ourEnableTracingOfKeyHashToVirtualFileMapping ? 1 : 0);
}
public static String[] getAllFilenames(Project project) {
@@ -160,4 +160,9 @@ public class FilenameIndex extends ScalarIndexExtension<String> {
}
return files;
}
@Override
public boolean traceKeyHashToVirtualFileMapping() {
return FileBasedIndex.ourEnableTracingOfKeyHashToVirtualFileMapping;
}
}
@@ -16,21 +16,83 @@
package com.intellij.ide.util.gotoByName;
import com.intellij.navigation.ChooseByNameContributor;
import com.intellij.navigation.EfficientChooseByNameContributor;
import com.intellij.navigation.NavigationItem;
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;
import com.intellij.psi.search.ProjectScope;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Processor;
import com.intellij.util.indexing.FileBasedIndex;
import com.intellij.util.indexing.FileBasedIndexImpl;
import com.intellij.util.indexing.IdFilter;
import gnu.trove.THashSet;
import gnu.trove.TIntArrayList;
import gnu.trove.TIntHashSet;
import org.jetbrains.annotations.NotNull;
public class DefaultFileNavigationContributor implements ChooseByNameContributor, DumbAware {
import java.util.BitSet;
public class DefaultFileNavigationContributor implements EfficientChooseByNameContributor, DumbAware {
@Override
@NotNull
public String[] getNames(Project project, boolean includeNonProjectItems) {
return FilenameIndex.getAllFilenames(project);
if (FileBasedIndex.ourEnableTracingOfKeyHashToVirtualFileMapping) {
final THashSet<String> names = new THashSet<String>(1000);
IdFilter filter = getFilter(project, includeNonProjectItems);
processNames(new Processor<String>() {
@Override
public boolean process(String s) {
names.add(s);
return true;
}
}, getScope(project, includeNonProjectItems), filter);
System.out.println("All names retrieved2:" + names.size());
return ArrayUtil.toStringArray(names);
} else {
return FilenameIndex.getAllFilenames(project);
}
}
public static GlobalSearchScope getScope(Project project, boolean includeNonProjectItems) {
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()
);
return true;
}
};
if (!includeNonProjectItems) {
ProjectRootManager.getInstance(project).getFileIndex().iterateContent(iterator);
} else {
FileBasedIndex.getInstance().iterateIndexableFiles(iterator, project, null);
}
System.out.println("Done filter " + (System.currentTimeMillis() -started) + ":" + idSet.size());
return new IdFilter() {
@Override
public boolean contains(int id) {
return idSet.get(id);
}
};
}
@Override
@@ -48,4 +110,16 @@ public class DefaultFileNavigationContributor implements ChooseByNameContributor
}
return items;
}
@Override
public void processNames(final Processor<String> processor, GlobalSearchScope scope, IdFilter filter) {
long started = System.currentTimeMillis();
FileBasedIndex.getInstance().processAllKeys(FilenameIndex.NAME, new Processor<String>() {
@Override
public boolean process(String s) {
return processor.process(s);
}
}, scope, filter);
System.out.println("All names retrieved:" + (System.currentTimeMillis() - started));
}
}
@@ -22,9 +22,11 @@ import com.intellij.navigation.ChooseByNameContributor;
import com.intellij.navigation.ChooseByNameRegistry;
import com.intellij.navigation.GotoClassContributor;
import com.intellij.navigation.NavigationItem;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.psi.PsiElement;
import com.intellij.util.indexing.FileBasedIndex;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -146,4 +148,9 @@ public class GotoClassModel2 extends FilteringGotoByModel<Language> {
public boolean willOpenEditor() {
return true;
}
@Override
public boolean sameNamesForProjectAndLibraries() {
return !FileBasedIndex.ourEnableTracingOfKeyHashToVirtualFileMapping;
}
}
@@ -30,6 +30,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.ex.WindowManagerEx;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileSystemItem;
import com.intellij.util.indexing.FileBasedIndex;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -114,6 +115,11 @@ public class GotoFileModel extends FilteringGotoByModel<FileType> {
return new GotoFileCellRenderer(myMaxSize);
}
@Override
public boolean sameNamesForProjectAndLibraries() {
return !FileBasedIndex.ourEnableTracingOfKeyHashToVirtualFileMapping;
}
@Override
@Nullable
public String getFullName(final Object element) {