Provide a way to exclude directories under project sdk roots

This commit is contained in:
Dmitry Trofimov
2017-07-04 00:21:55 +03:00
parent cfab738541
commit 7e459335ed
3 changed files with 30 additions and 6 deletions
@@ -33,6 +33,11 @@ public interface DirectoryIndexExcludePolicy {
@NotNull
VirtualFile[] getExcludeRootsForProject();
@NotNull
default VirtualFile[] getExcludeRootsForProjectSdk() {
return VirtualFile.EMPTY_ARRAY;
}
@NotNull
VirtualFilePointer[] getExcludeRootsForModule(@NotNull ModuleRootModel rootModel);
@@ -204,6 +204,7 @@ public class RootIndex {
}
for (DirectoryIndexExcludePolicy policy : Extensions.getExtensions(DirectoryIndexExcludePolicy.EP_NAME, project)) {
info.excludedFromProject.addAll(ContainerUtil.filter(policy.getExcludeRootsForProject(), file -> ensureValid(file, policy)));
info.excludedFromProjectSdk.addAll(ContainerUtil.filter(policy.getExcludeRootsForProjectSdk(), file -> ensureValid(file, policy)));
}
for (UnloadedModuleDescription description : moduleManager.getUnloadedModuleDescriptions()) {
for (VirtualFilePointer pointer : description.getContentRoots()) {
@@ -641,6 +642,7 @@ public class RootIndex {
@NotNull final MultiMap<VirtualFile, Library> classOfLibraries = MultiMap.createSmart();
@NotNull final MultiMap<VirtualFile, /*Library|SyntheticLibrary*/ Object> sourceOfLibraries = MultiMap.createSmart();
@NotNull final Set<VirtualFile> excludedFromProject = ContainerUtil.newHashSet();
@NotNull final Set<VirtualFile> excludedFromProjectSdk = ContainerUtil.newHashSet();
@NotNull final Map<VirtualFile, Module> excludedFromModule = ContainerUtil.newHashMap();
@NotNull final Map<VirtualFile, FileTypeAssocTable<Boolean>> excludeFromContentRootTables = ContainerUtil.newHashMap();
@NotNull final Map<VirtualFile, String> packagePrefix = ContainerUtil.newHashMap();
@@ -654,6 +656,7 @@ public class RootIndex {
result.addAll(excludedFromLibraries.keySet());
result.addAll(excludedFromModule.keySet());
result.addAll(excludedFromProject);
result.addAll(excludedFromProjectSdk);
return result;
}
@@ -862,7 +865,9 @@ public class RootIndex {
Pair<VirtualFile, Collection<Object>> libraryClassRootInfo = info.findLibraryRootInfo(hierarchy, false);
VirtualFile libraryClassRoot = libraryClassRootInfo != null ? libraryClassRootInfo.first : null;
boolean inProject = moduleContentRoot != null || libraryClassRoot != null || librarySourceRoot != null;
boolean inProject = moduleContentRoot != null ||
( (libraryClassRoot != null || librarySourceRoot != null) && !info.excludedFromProjectSdk.contains(root));
VirtualFile nearestContentRoot;
if (inProject) {
nearestContentRoot = moduleContentRoot;
@@ -16,6 +16,7 @@
package com.jetbrains.python;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
@@ -30,11 +31,13 @@ import com.jetbrains.python.sdk.PythonSdkType;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.Set;
/**
* @author traff
*/
public class PyDirectoryIndexExcludePolicy implements DirectoryIndexExcludePolicy {
private final static String[] SITE_PACKAGES = new String[]{"site-packages", "dist-packages"};
private final Project myProject;
@@ -53,13 +56,24 @@ public class PyDirectoryIndexExcludePolicy implements DirectoryIndexExcludePolic
}
}
return result.toArray(new VirtualFile[result.size()]);
}
@NotNull
@Override
public VirtualFile[] getExcludeRootsForProjectSdk() {
List<VirtualFile> result = Lists.newArrayList();
for (Module m : ModuleManager.getInstance(myProject).getModules()) {
Sdk sdk = PythonSdkType.findPythonSdk(m);
if (sdk != null) {
Set<VirtualFile> roots = Sets.newHashSet(sdk.getRootProvider().getFiles(OrderRootType.CLASSES));
for (VirtualFile dir : sdk.getRootProvider().getFiles(OrderRootType.CLASSES)) {
VirtualFile sitePackages = dir.findChild("site-packages");
if (sitePackages != null) {
result.add(sitePackages);
for (String name : SITE_PACKAGES) {
VirtualFile sitePackages = dir.findChild(name);
if (sitePackages != null && !roots.contains(sitePackages)) {
result.add(sitePackages);
}
}
}
}
@@ -71,8 +85,8 @@ public class PyDirectoryIndexExcludePolicy implements DirectoryIndexExcludePolic
@NotNull
@Override
public VirtualFilePointer[] getExcludeRootsForModule(@NotNull ModuleRootModel rootModel) {
return VirtualFilePointer.EMPTY_ARRAY;
}
}