optimization: fewer getInfoForFile() calls
authorAlexey Kudravtsev <cdr@intellij.com>
Wed, 25 Jul 2018 15:22:19 +0000 (18:22 +0300)
committerAlexey Kudravtsev <cdr@intellij.com>
Thu, 26 Jul 2018 10:27:23 +0000 (13:27 +0300)
platform/core-api/src/com/intellij/openapi/roots/FileIndexFacade.java
platform/core-impl/src/com/intellij/psi/search/ProjectScopeImpl.java
platform/indexing-impl/src/com/intellij/openapi/module/impl/scopes/ModuleWithDependentsScope.java
platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectFileIndexFacade.java

index 8ab403b99bc93b039965b4c0bd5a3396077786be..62c1cef193731e122fdb1f672fcdb623979227fa 100644 (file)
@@ -15,6 +15,7 @@
  */
 package com.intellij.openapi.roots;
 
+import com.intellij.injected.editor.VirtualFileWindow;
 import com.intellij.openapi.components.ServiceManager;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.module.UnloadedModuleDescription;
@@ -75,4 +76,15 @@ public abstract class FileIndexFacade {
    */
   @NotNull
   public abstract Collection<UnloadedModuleDescription> getUnloadedModuleDescriptions();
+
+  /**
+   * @return true if the {@code file} is {@link #isInContent} except when it's in {@link #isInLibraryClasses} and not in {@link #isInLibrarySource}
+   */
+  public boolean isInContentExceptLibraryClassesWithoutSources(@NotNull VirtualFile file) {
+    if (file instanceof VirtualFileWindow) return true;
+
+    if (isInLibraryClasses(file) && !isInSourceContent(file)) return false;
+
+    return isInContent(file);
+  }
 }
index 355e51f57409c0add31f91d834340691f8d82931..bfcf5794b1b96d3bc3131b5bf11aac80a93c1d26 100644 (file)
@@ -15,7 +15,6 @@
  */
 package com.intellij.psi.search;
 
-import com.intellij.injected.editor.VirtualFileWindow;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.module.UnloadedModuleDescription;
 import com.intellij.openapi.project.Project;
@@ -36,11 +35,7 @@ public class ProjectScopeImpl extends GlobalSearchScope {
 
   @Override
   public boolean contains(@NotNull VirtualFile file) {
-    if (file instanceof VirtualFileWindow) return true;
-
-    if (myFileIndex.isInLibraryClasses(file) && !myFileIndex.isInSourceContent(file)) return false;
-
-    return myFileIndex.isInContent(file);
+    return myFileIndex.isInContentExceptLibraryClassesWithoutSources(file);
   }
 
   @Override
index e19c4109a0b8182527c8caf87b15230a094f8e29..3cff803e91a1b9c6054024b49509eb123364cdc9 100644 (file)
@@ -21,6 +21,9 @@ import com.intellij.openapi.module.UnloadedModuleDescription;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.*;
 import com.intellij.openapi.roots.impl.DirectoryIndex;
+import com.intellij.openapi.roots.impl.DirectoryInfo;
+import com.intellij.openapi.roots.impl.FileIndexBase;
+import com.intellij.openapi.roots.impl.ProjectFileIndexImpl;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.search.GlobalSearchScope;
 import com.intellij.psi.search.ProjectScope;
@@ -57,7 +60,7 @@ class ModuleWithDependentsScope extends GlobalSearchScope {
   }
 
   @NotNull
-  private static Set<Module> buildDependents(Module module) {
+  private static Set<Module> buildDependents(@NotNull Module module) {
     Set<Module> result = new THashSet<>();
     result.add(module);
 
@@ -86,7 +89,8 @@ class ModuleWithDependentsScope extends GlobalSearchScope {
     final MultiMap<Module, Module> exportingUsages = MultiMap.create();
   }
 
-  private static ModuleIndex getModuleIndex(final Project project) {
+  @NotNull
+  private static ModuleIndex getModuleIndex(@NotNull Project project) {
     return CachedValuesManager.getManager(project).getCachedValue(project, () -> {
       ModuleIndex index = new ModuleIndex();
       for (Module module : ModuleManager.getInstance(project).getModules()) {
@@ -110,6 +114,14 @@ class ModuleWithDependentsScope extends GlobalSearchScope {
   }
 
   boolean contains(@NotNull VirtualFile file, boolean myOnlyTests) {
+    if (myProjectFileIndex instanceof FileIndexBase) {
+      // optimization: fewer calls to getInfoForFileOrDirectory()
+      DirectoryInfo info = ((FileIndexBase)myProjectFileIndex).getInfoForFileOrDirectory(file);
+      Module moduleOfFile = info.getModule();
+      if (moduleOfFile == null || !myModules.contains(moduleOfFile)) return false;
+      if (myOnlyTests && !TestSourcesFilter.isTestSources(file, moduleOfFile.getProject())) return false;
+      return ProjectFileIndexImpl.isFileInContent(file, info);
+    }
     Module moduleOfFile = myProjectFileIndex.getModuleForFile(file);
     if (moduleOfFile == null || !myModules.contains(moduleOfFile)) return false;
     if (myOnlyTests && !TestSourcesFilter.isTestSources(file, moduleOfFile.getProject())) return false;
index d8fcf3b52b60da9c6d463d197c706dcfec84d9e7..fa6bf75721116557e9db304c4842c98738fdc513 100644 (file)
@@ -16,6 +16,7 @@
 
 package com.intellij.openapi.roots.impl;
 
+import com.intellij.injected.editor.VirtualFileWindow;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.module.ModuleManager;
 import com.intellij.openapi.module.UnloadedModuleDescription;
@@ -108,4 +109,14 @@ public class ProjectFileIndexFacade extends FileIndexFacade {
   public Collection<UnloadedModuleDescription> getUnloadedModuleDescriptions() {
     return ModuleManager.getInstance(myProject).getUnloadedModuleDescriptions();
   }
+
+  @Override
+  public boolean isInContentExceptLibraryClassesWithoutSources(@NotNull VirtualFile file) {
+    // optimization: equivalent to the super method but has fewer getInfoForFile() calls
+    if (file instanceof VirtualFileWindow) return true;
+    DirectoryInfo info = myDirectoryIndex.getInfoForFile(file);
+    if (!info.isInProject(file)) return false;
+    if (info.hasLibraryClassRoot() && !info.isInModuleSource(file)) return false;
+    return info.getModule() != null;
+  }
 }