added GlobalSearchScope.getUnloadedModulesBelongingToScope method clion/173.79
authornik <Nikolay.Chashnikov@jetbrains.com>
Fri, 9 Jun 2017 12:02:05 +0000 (14:02 +0200)
committernik <Nikolay.Chashnikov@jetbrains.com>
Fri, 9 Jun 2017 12:06:35 +0000 (14:06 +0200)
It is needed to determine that some occurrences may be missing from a scope because containing modules are currently unloaded.

17 files changed:
platform/analysis-api/src/com/intellij/psi/search/GlobalSearchScopesCore.java
platform/core-api/src/com/intellij/openapi/roots/FileIndexFacade.java
platform/core-api/src/com/intellij/psi/search/DelegatingGlobalSearchScope.java
platform/core-api/src/com/intellij/psi/search/EverythingGlobalScope.java
platform/core-api/src/com/intellij/psi/search/GlobalSearchScope.java
platform/core-impl/src/com/intellij/core/CoreProjectScopeBuilder.java
platform/core-impl/src/com/intellij/mock/MockFileIndexFacade.java
platform/core-impl/src/com/intellij/psi/search/ProjectScopeImpl.java
platform/indexing-api/src/com/intellij/psi/search/ProjectAndLibrariesScope.java
platform/indexing-impl/src/com/intellij/openapi/module/impl/scopes/ModuleWithDependentsScope.java
platform/indexing-impl/src/com/intellij/psi/search/ProjectScopeBuilderImpl.java
platform/projectModel-api/src/com/intellij/openapi/module/ModuleManager.java
platform/projectModel-impl/src/com/intellij/openapi/module/EmptyModuleManager.kt
platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java
platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectFileIndexFacade.java
platform/testRunner/src/com/intellij/execution/testframework/SourceScope.java
platform/vcs-impl/src/com/intellij/openapi/vcs/impl/DefaultFileIndexFacade.java

index 8d191133141638a95f9a07b4c32193fa838bc629..9877e03ccd82f666aa1ac261906df0265930115c 100644 (file)
@@ -16,6 +16,8 @@
 package com.intellij.psi.search;
 
 import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.ModuleManager;
+import com.intellij.openapi.module.UnloadedModuleDescription;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.ProjectFileIndex;
 import com.intellij.openapi.roots.ProjectRootManager;
@@ -33,6 +35,7 @@ import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.containers.HashSet;
 import org.jetbrains.annotations.NotNull;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Objects;
 import java.util.Set;
@@ -158,6 +161,11 @@ public class GlobalSearchScopesCore {
       return false;
     }
 
+    @Override
+    public Collection<UnloadedModuleDescription> getUnloadedModulesBelongingToScope() {
+      return ModuleManager.getInstance(ObjectUtils.assertNotNull(getProject())).getUnloadedModuleDescriptions();
+    }
+
     @NotNull
     @Override
     public String getDisplayName() {
index 0bad3e572c25abf62bd35de8a3cb84e73354f182..4b0a997d6b24a202f4706bb840aa5bac95a0bd0a 100644 (file)
@@ -17,6 +17,7 @@ package com.intellij.openapi.roots;
 
 import com.intellij.openapi.components.ServiceManager;
 import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.UnloadedModuleDescription;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.ModificationTracker;
 import com.intellij.openapi.vfs.VirtualFile;
@@ -24,6 +25,8 @@ import com.intellij.psi.search.GlobalSearchScope;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import java.util.Collection;
+
 /**
  * @author yole
  */
@@ -65,4 +68,7 @@ public abstract class FileIndexFacade {
   }
 
   @NotNull public abstract ModificationTracker getRootModificationTracker();
+
+  @NotNull
+  public abstract Collection<UnloadedModuleDescription> getUnloadedModuleDescriptions();
 }
index 1d2a61961d797ddd6103c62cf7a54a935e98bd55..89179044fa4b52d844711a1660829eea631d890a 100644 (file)
 package com.intellij.psi.search;
 
 import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.UnloadedModuleDescription;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.util.ArrayUtil;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Arrays;
+import java.util.Collection;
 
 /**
  * @author peter
@@ -69,6 +71,11 @@ public class DelegatingGlobalSearchScope extends GlobalSearchScope {
     return myBaseScope.isSearchOutsideRootModel();
   }
 
+  @Override
+  public Collection<UnloadedModuleDescription> getUnloadedModulesBelongingToScope() {
+    return myBaseScope.getUnloadedModulesBelongingToScope();
+  }
+
   @NotNull
   @Override
   public String getDisplayName() {
index 191a5a29abb0b4c6be3e29f3fdcc251ecf4decba..8d68e7b3e0a25b1ccbf49dc2e3e76450b90ad882 100644 (file)
 package com.intellij.psi.search;
 
 import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.UnloadedModuleDescription;
+import com.intellij.openapi.roots.FileIndexFacade;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.openapi.project.Project;
 import org.jetbrains.annotations.NotNull;
 
+import java.util.Collection;
+import java.util.Collections;
+
 public class EverythingGlobalScope extends GlobalSearchScope {
   public EverythingGlobalScope(Project project) {
     super(project);
@@ -62,6 +67,12 @@ public class EverythingGlobalScope extends GlobalSearchScope {
     return true;
   }
 
+  @Override
+  public Collection<UnloadedModuleDescription> getUnloadedModulesBelongingToScope() {
+    Project project = getProject();
+    return project != null ? FileIndexFacade.getInstance(project).getUnloadedModuleDescriptions() : Collections.emptySet();
+  }
+
   @NotNull
   @Override
   public GlobalSearchScope union(@NotNull SearchScope scope) {
index 70ddadc61b073b1eb276f3d539bd667fb6e78031..f94d07f258fb72fa3485a6eef41076257f614ed9 100644 (file)
@@ -17,6 +17,7 @@ package com.intellij.psi.search;
 
 import com.intellij.openapi.fileTypes.FileType;
 import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.UnloadedModuleDescription;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.FileIndexFacade;
 import com.intellij.openapi.util.Comparing;
@@ -82,6 +83,14 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
     return false;
   }
 
+  /**
+   * Returns descriptions of unloaded modules content of whose might be included into this scope if they had been loaded. Actually search in
+   * unloaded modules isn't performed, so this method is used to determine whether a warning about possible missing results should be shown.
+   */
+  public Collection<UnloadedModuleDescription> getUnloadedModulesBelongingToScope() {
+    return Collections.emptySet();
+  }
+
   @NotNull
   public GlobalSearchScope intersectWith(@NotNull GlobalSearchScope scope) {
     if (scope == this) return this;
@@ -152,6 +161,11 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
         return GlobalSearchScope.this.isSearchInLibraries();
       }
 
+      @Override
+      public Collection<UnloadedModuleDescription> getUnloadedModulesBelongingToScope() {
+        return GlobalSearchScope.this.getUnloadedModulesBelongingToScope();
+      }
+
       @NonNls
       @Override
       public String toString() {
@@ -430,6 +444,11 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
     }
 
     @Override
+    public Collection<UnloadedModuleDescription> getUnloadedModulesBelongingToScope() {
+      return ContainerUtil.intersection(myScope1.getUnloadedModulesBelongingToScope(), myScope2.getUnloadedModulesBelongingToScope());
+    }
+
+    @Override
     public boolean equals(Object o) {
       if (this == o) return true;
       if (!(o instanceof IntersectionScope)) return false;
@@ -494,6 +513,15 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
     }
 
     @Override
+    public Collection<UnloadedModuleDescription> getUnloadedModulesBelongingToScope() {
+      Set<UnloadedModuleDescription> result = new LinkedHashSet<>();
+      for (GlobalSearchScope scope : myScopes) {
+        result.addAll(scope.getUnloadedModulesBelongingToScope());
+      }
+      return result;
+    }
+
+    @Override
     public int compare(@NotNull final VirtualFile file1, @NotNull final VirtualFile file2) {
       final int[] result = {0};
       ContainerUtil.process(myScopes, scope -> {
index 3f4c6e647d2cae3cc0a3e89233f6a34297b60504..33eea8d6a853c7f38ad0e3588177b1de62a629cc 100644 (file)
@@ -16,6 +16,7 @@
 package com.intellij.core;
 
 import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.UnloadedModuleDescription;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.FileIndexFacade;
 import com.intellij.openapi.vfs.VirtualFile;
@@ -25,6 +26,8 @@ import com.intellij.psi.search.ProjectScopeBuilder;
 import com.intellij.psi.search.ProjectScopeImpl;
 import org.jetbrains.annotations.NotNull;
 
+import java.util.Collection;
+
 /**
  * @author yole
  */
@@ -113,5 +116,10 @@ public class CoreProjectScopeBuilder extends ProjectScopeBuilder {
     public boolean isSearchInLibraries() {
       return false;
     }
+
+    @Override
+    public Collection<UnloadedModuleDescription> getUnloadedModulesBelongingToScope() {
+      return myFileIndexFacade.getUnloadedModuleDescriptions();
+    }
   }
 }
index 6a37ba1819448162386d5184f19f4843f00e0260..5dea36717ddf0977ec9e4619ec4e1e4843ffe8ac 100644 (file)
@@ -16,6 +16,7 @@
 package com.intellij.mock;
 
 import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.UnloadedModuleDescription;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.FileIndexFacade;
 import com.intellij.openapi.util.ModificationTracker;
@@ -23,8 +24,7 @@ import com.intellij.openapi.vfs.VfsUtilCore;
 import com.intellij.openapi.vfs.VirtualFile;
 import org.jetbrains.annotations.NotNull;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
 /**
  * @author yole
@@ -94,6 +94,12 @@ public class MockFileIndexFacade extends FileIndexFacade {
     return ModificationTracker.NEVER_CHANGED;
   }
 
+  @NotNull
+  @Override
+  public Collection<UnloadedModuleDescription> getUnloadedModuleDescriptions() {
+    return Collections.emptySet();
+  }
+
   public void addLibraryRoot(VirtualFile file) {
     myLibraryRoots.add(file);
   }
index f21c241e966a71f6fc717037a34d51a4a090e280..4d487c22ed049248471cc2807487b49854357bd0 100644 (file)
@@ -17,12 +17,15 @@ 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;
 import com.intellij.openapi.roots.FileIndexFacade;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.PsiBundle;
 import org.jetbrains.annotations.NotNull;
 
+import java.util.Collection;
+
 public class ProjectScopeImpl extends GlobalSearchScope {
   private final FileIndexFacade myFileIndex;
 
@@ -66,6 +69,11 @@ public class ProjectScopeImpl extends GlobalSearchScope {
     return getDisplayName();
   }
 
+  @Override
+  public Collection<UnloadedModuleDescription> getUnloadedModulesBelongingToScope() {
+    return myFileIndex.getUnloadedModuleDescriptions();
+  }
+
   @NotNull
   @Override
   public GlobalSearchScope uniteWith(@NotNull GlobalSearchScope scope) {
index 1f3cf14317bb7bacfedea4495d7dbc2051592b85..58a5c91531caf8210fb8156c29507d0d875d280a 100644 (file)
 package com.intellij.psi.search;
 
 import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.ModuleManager;
+import com.intellij.openapi.module.UnloadedModuleDescription;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.*;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.PsiBundle;
 import org.jetbrains.annotations.NotNull;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 public class ProjectAndLibrariesScope extends GlobalSearchScope {
@@ -87,6 +91,12 @@ public class ProjectAndLibrariesScope extends GlobalSearchScope {
     return true;
   }
 
+  @Override
+  public Collection<UnloadedModuleDescription> getUnloadedModulesBelongingToScope() {
+    Project project = getProject();
+    return project != null ? ModuleManager.getInstance(project).getUnloadedModuleDescriptions() : Collections.emptySet();
+  }
+
   @NotNull
   public String getDisplayName() {
     return myDisplayName;
index 46f6f75f8e455378ca212617ed6c4654851537f5..9720e857a935b8d42ffb6d164dbc7916fdfa2f8a 100644 (file)
@@ -17,19 +17,23 @@ package com.intellij.openapi.module.impl.scopes;
 
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.module.ModuleManager;
+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.vfs.VirtualFile;
 import com.intellij.psi.search.GlobalSearchScope;
 import com.intellij.psi.search.ProjectScope;
 import com.intellij.psi.util.CachedValueProvider;
 import com.intellij.psi.util.CachedValuesManager;
+import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.containers.MultiMap;
 import com.intellij.util.containers.Queue;
 import gnu.trove.THashSet;
 import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
 
+import java.util.Collection;
 import java.util.Set;
 
 /**
@@ -127,6 +131,13 @@ class ModuleWithDependentsScope extends GlobalSearchScope {
     return false;
   }
 
+  @Override
+  public Collection<UnloadedModuleDescription> getUnloadedModulesBelongingToScope() {
+    ModuleManager moduleManager = ModuleManager.getInstance(myModule.getProject());
+    return ContainerUtil.mapNotNull(DirectoryIndex.getInstance(myModule.getProject()).getDependentUnloadedModules(myModule),
+                                    moduleManager::getUnloadedModuleDescription);
+  }
+
   @NonNls
   public String toString() {
     return "Module with dependents:" + myModule.getName();
index b586bf60901aa21cb3129a44c68bb3f0fc582890..9b6efe2c4673b8794d50bcc06d5e8c4c614124ce 100644 (file)
@@ -18,6 +18,7 @@ package com.intellij.psi.search;
 import com.intellij.core.CoreProjectScopeBuilder;
 import com.intellij.openapi.extensions.Extensions;
 import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.UnloadedModuleDescription;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.FileIndexFacade;
 import com.intellij.openapi.roots.ProjectRootManager;
@@ -25,6 +26,9 @@ import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.PsiBundle;
 import org.jetbrains.annotations.NotNull;
 
+import java.util.Collection;
+import java.util.Collections;
+
 /**
  * @author yole
  */
@@ -49,6 +53,11 @@ public class ProjectScopeBuilderImpl extends ProjectScopeBuilder {
       public boolean isSearchInModuleContent(@NotNull Module aModule) {
         return false;
       }
+
+      @Override
+      public Collection<UnloadedModuleDescription> getUnloadedModulesBelongingToScope() {
+        return Collections.emptySet();
+      }
     };
     result.setDisplayName(PsiBundle.message("psi.search.scope.libraries"));
     return result;
index ee89d6438ed8df337b5634d40d1938de2cd970f6..a4f3e881ca55543d90779f71b4d28fc9494117f4 100644 (file)
@@ -180,7 +180,11 @@ public abstract class ModuleManager extends SimpleModificationTracker {
   public abstract Collection<ModuleDescription> getAllModuleDescriptions();
 
   @ApiStatus.Experimental
-  public abstract Collection<? extends UnloadedModuleDescription> getUnloadedModuleDescriptions();
+  public abstract Collection<UnloadedModuleDescription> getUnloadedModuleDescriptions();
+
+  @ApiStatus.Experimental
+  @Nullable
+  public abstract UnloadedModuleDescription getUnloadedModuleDescription(@NotNull String moduleName);
 
   /**
    * Specify list of modules which will be unloaded from the project. These modules won't be shown in UI, all of their contents will be excluded
index 45e102b62949bc1441f9993a2f5aa3b2194c8090..a2e67b6bfc739c53485cf8fdf3eae59f0d716fab 100644 (file)
@@ -55,4 +55,6 @@ class EmptyModuleManager(project: Project, messageBus: MessageBus) : ModuleManag
   override fun getAllModuleDescriptions() = emptyList<ModuleDescription>()
 
   override fun getUnloadedModuleDescriptions() = emptyList<UnloadedModuleDescription>()
+
+  override fun getUnloadedModuleDescription(moduleName: String) = null
 }
\ No newline at end of file
index 385d67fcec9ca91d3c1d766b0637ddf810ec64fd..fafd93c175a4464c3990af75ad05ba7860ac4e8a 100644 (file)
@@ -992,8 +992,14 @@ public abstract class ModuleManagerImpl extends ModuleManager implements Disposa
   }
 
   @Override
-  public Collection<? extends UnloadedModuleDescription> getUnloadedModuleDescriptions() {
-    return myUnloadedModules.values();
+  public Collection<UnloadedModuleDescription> getUnloadedModuleDescriptions() {
+    return Collections.unmodifiableCollection(myUnloadedModules.values());
+  }
+
+  @Nullable
+  @Override
+  public UnloadedModuleDescription getUnloadedModuleDescription(@NotNull String moduleName) {
+    return myUnloadedModules.get(moduleName);
   }
 
   @Override
index 91fb421177b41c8458cf0dfd949fcb28b8632c83..d8fcf3b52b60da9c6d463d197c706dcfec84d9e7 100644 (file)
@@ -17,6 +17,8 @@
 package com.intellij.openapi.roots.impl;
 
 import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.ModuleManager;
+import com.intellij.openapi.module.UnloadedModuleDescription;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.FileIndexFacade;
 import com.intellij.openapi.roots.ProjectFileIndex;
@@ -26,6 +28,8 @@ import com.intellij.openapi.vfs.VirtualFile;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import java.util.Collection;
+
 /**
  * @author yole
  */
@@ -98,4 +102,10 @@ public class ProjectFileIndexFacade extends FileIndexFacade {
   public ModificationTracker getRootModificationTracker() {
     return ProjectRootManager.getInstance(myProject);
   }
+
+  @NotNull
+  @Override
+  public Collection<UnloadedModuleDescription> getUnloadedModuleDescriptions() {
+    return ModuleManager.getInstance(myProject).getUnloadedModuleDescriptions();
+  }
 }
index 63a96e76fca98a404893980acd6ce26727633552..90bb29235d60644c86008b4f3337dba1da9b9e9b 100644 (file)
@@ -17,6 +17,7 @@ package com.intellij.execution.testframework;
 
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.module.ModuleManager;
+import com.intellij.openapi.module.UnloadedModuleDescription;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.search.GlobalSearchScope;
@@ -193,6 +194,11 @@ public abstract class SourceScope {
       return true;
     }
 
+    @Override
+    public Collection<UnloadedModuleDescription> getUnloadedModulesBelongingToScope() {
+      return myMainScope.getUnloadedModulesBelongingToScope();
+    }
+
     @Nullable
     private GlobalSearchScope findScopeFor(final VirtualFile file) {
       if (myMainScope.contains(file)) return myMainScope;
index d4063478d373e68ef8345c91afbe1f1b1f346e16..e11cdf239d8eecdf1535c688bb25b49e9e0f48ff 100644 (file)
@@ -16,6 +16,7 @@
 package com.intellij.openapi.vcs.impl;
 
 import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.UnloadedModuleDescription;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.FileIndexFacade;
 import com.intellij.openapi.util.ModificationTracker;
@@ -24,6 +25,9 @@ import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.platform.ProjectBaseDirectory;
 import org.jetbrains.annotations.NotNull;
 
+import java.util.Collection;
+import java.util.Collections;
+
 /**
  * @author yole
  */
@@ -85,6 +89,12 @@ public class DefaultFileIndexFacade extends FileIndexFacade {
     return ModificationTracker.NEVER_CHANGED;
   }
 
+  @NotNull
+  @Override
+  public Collection<UnloadedModuleDescription> getUnloadedModuleDescriptions() {
+    return Collections.emptySet();
+  }
+
   private VirtualFile getBaseDir() {
     return ProjectBaseDirectory.getInstance(myProject).getBaseDir(myBaseDir);
   }