From 83b6e645a3e299a2ea238e1555103ecc3df86b70 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Wed, 21 Aug 2013 17:13:10 +0200 Subject: [PATCH] use new api for better candidates (belonging to navigatable scope) --- .../DefaultClassNavigationContributor.java | 36 +++++++-- .../psi/search/PsiShortNamesCache.java | 6 ++ .../psi/impl/CompositeShortNamesCache.java | 11 +++ .../psi/impl/PsiShortNamesCacheImpl.java | 7 ++ .../stubs/index/JavaShortClassNameIndex.java | 12 +++ .../intellij/psi/search/FilenameIndex.java | 7 +- .../DefaultFileNavigationContributor.java | 78 ++++++++++++++++++- .../ide/util/gotoByName/GotoClassModel2.java | 7 ++ .../ide/util/gotoByName/GotoFileModel.java | 6 ++ 9 files changed, 160 insertions(+), 10 deletions(-) diff --git a/java/java-impl/src/com/intellij/ide/util/gotoByName/DefaultClassNavigationContributor.java b/java/java-impl/src/com/intellij/ide/util/gotoByName/DefaultClassNavigationContributor.java index d123dffff106..0738da4cc1e3 100644 --- a/java/java-impl/src/com/intellij/ide/util/gotoByName/DefaultClassNavigationContributor.java +++ b/java/java-impl/src/com/intellij/ide/util/gotoByName/DefaultClassNavigationContributor.java @@ -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 processor = new CommonProcessors.CollectProcessor(); + 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 processor, GlobalSearchScope scope, IdFilter filter) { + PsiShortNamesCache.getInstance(scope.getProject()).processAllClassNames(processor, scope, filter); + } } \ No newline at end of file diff --git a/java/java-indexing-api/src/com/intellij/psi/search/PsiShortNamesCache.java b/java/java-indexing-api/src/com/intellij/psi/search/PsiShortNamesCache.java index 38465bdba03f..6854c57b141a 100644 --- a/java/java-indexing-api/src/com/intellij/psi/search/PsiShortNamesCache.java +++ b/java/java-indexing-api/src/com/intellij/psi/search/PsiShortNamesCache.java @@ -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 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. diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/CompositeShortNamesCache.java b/java/java-indexing-impl/src/com/intellij/psi/impl/CompositeShortNamesCache.java index 52d580151d88..e6ba22dc5837 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/CompositeShortNamesCache.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/CompositeShortNamesCache.java @@ -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 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 dest) { for (PsiShortNamesCache cache : myCaches) { diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/PsiShortNamesCacheImpl.java b/java/java-indexing-impl/src/com/intellij/psi/impl/PsiShortNamesCacheImpl.java index b17c4b18d35e..e702d011a0e2 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/PsiShortNamesCacheImpl.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/PsiShortNamesCacheImpl.java @@ -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 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) { diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java index 7faeaf9ff01d..95e27ea9f91c 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/java/stubs/index/JavaShortClassNameIndex.java @@ -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 { 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 getKey() { @@ -47,4 +54,9 @@ public class JavaShortClassNameIndex extends StringStubIndexExtension public Collection 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; + } } \ No newline at end of file diff --git a/platform/indexing-impl/src/com/intellij/psi/search/FilenameIndex.java b/platform/indexing-impl/src/com/intellij/psi/search/FilenameIndex.java index ededc778b4ee..641751a1c2a5 100644 --- a/platform/indexing-impl/src/com/intellij/psi/search/FilenameIndex.java +++ b/platform/indexing-impl/src/com/intellij/psi/search/FilenameIndex.java @@ -71,7 +71,7 @@ public class FilenameIndex extends ScalarIndexExtension { @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 { } return files; } + + @Override + public boolean traceKeyHashToVirtualFileMapping() { + return FileBasedIndex.ourEnableTracingOfKeyHashToVirtualFileMapping; + } } diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/DefaultFileNavigationContributor.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/DefaultFileNavigationContributor.java index 7b0e73b97548..4c796da67bfc 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/DefaultFileNavigationContributor.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/DefaultFileNavigationContributor.java @@ -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 names = new THashSet(1000); + IdFilter filter = getFilter(project, includeNonProjectItems); + processNames(new Processor() { + @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 processor, GlobalSearchScope scope, IdFilter filter) { + long started = System.currentTimeMillis(); + FileBasedIndex.getInstance().processAllKeys(FilenameIndex.NAME, new Processor() { + @Override + public boolean process(String s) { + return processor.process(s); + } + }, scope, filter); + System.out.println("All names retrieved:" + (System.currentTimeMillis() - started)); + } } diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoClassModel2.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoClassModel2.java index 329c190b2cda..8d80a1c1fbac 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoClassModel2.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoClassModel2.java @@ -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 { public boolean willOpenEditor() { return true; } + + @Override + public boolean sameNamesForProjectAndLibraries() { + return !FileBasedIndex.ourEnableTracingOfKeyHashToVirtualFileMapping; + } } diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileModel.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileModel.java index adc943ea17bc..82ecacb41849 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileModel.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileModel.java @@ -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 { return new GotoFileCellRenderer(myMaxSize); } + @Override + public boolean sameNamesForProjectAndLibraries() { + return !FileBasedIndex.ourEnableTracingOfKeyHashToVirtualFileMapping; + } + @Override @Nullable public String getFullName(final Object element) {