added GlobalSearchScope.getUnloadedModulesBelongingToScope method

It is needed to determine that some occurrences may be missing from a scope because containing modules are currently unloaded.
This commit is contained in:
nik
2017-06-09 14:06:35 +02:00
parent fdbb57ff4d
commit 21abbef59c
17 changed files with 155 additions and 5 deletions
@@ -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() {
@@ -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();
}
@@ -16,11 +16,13 @@
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() {
@@ -20,10 +20,15 @@
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) {
@@ -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() {
@@ -429,6 +443,11 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
return myScope1.isSearchOutsideRootModel() && myScope2.isSearchOutsideRootModel();
}
@Override
public Collection<UnloadedModuleDescription> getUnloadedModulesBelongingToScope() {
return ContainerUtil.intersection(myScope1.getUnloadedModulesBelongingToScope(), myScope2.getUnloadedModulesBelongingToScope());
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -493,6 +512,15 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
return ContainerUtil.find(myScopes, scope -> scope.isSearchOutsideRootModel()) != null;
}
@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};
@@ -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();
}
}
}
@@ -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);
}
@@ -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) {
@@ -17,12 +17,16 @@
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;
@@ -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();
@@ -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;
@@ -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
@@ -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
}
@@ -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
@@ -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();
}
}
@@ -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;
@@ -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);
}