diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexExcludePolicy.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexExcludePolicy.java index a9eee660c7e2..122a576d8a2e 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexExcludePolicy.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexExcludePolicy.java @@ -33,6 +33,11 @@ public interface DirectoryIndexExcludePolicy { @NotNull VirtualFile[] getExcludeRootsForProject(); + @NotNull + default VirtualFile[] getExcludeRootsForProjectSdk() { + return VirtualFile.EMPTY_ARRAY; + } + @NotNull VirtualFilePointer[] getExcludeRootsForModule(@NotNull ModuleRootModel rootModel); diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java index f7bca6a13fc8..9d63ceb45765 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java @@ -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 classOfLibraries = MultiMap.createSmart(); @NotNull final MultiMap sourceOfLibraries = MultiMap.createSmart(); @NotNull final Set excludedFromProject = ContainerUtil.newHashSet(); + @NotNull final Set excludedFromProjectSdk = ContainerUtil.newHashSet(); @NotNull final Map excludedFromModule = ContainerUtil.newHashMap(); @NotNull final Map> excludeFromContentRootTables = ContainerUtil.newHashMap(); @NotNull final Map 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> 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; diff --git a/python/ide/src/com/jetbrains/python/PyDirectoryIndexExcludePolicy.java b/python/ide/src/com/jetbrains/python/PyDirectoryIndexExcludePolicy.java index 6b75c5fb9107..f8449e67ed31 100644 --- a/python/ide/src/com/jetbrains/python/PyDirectoryIndexExcludePolicy.java +++ b/python/ide/src/com/jetbrains/python/PyDirectoryIndexExcludePolicy.java @@ -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 result = Lists.newArrayList(); + for (Module m : ModuleManager.getInstance(myProject).getModules()) { Sdk sdk = PythonSdkType.findPythonSdk(m); if (sdk != null) { + Set 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; } }