From 55c1a590997ca5ceccdbb23c878ecb927b6dbadf Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 5 Dec 2013 16:07:26 +0100 Subject: [PATCH] RootIndex: only mark as project-excluded roots that are not under module content --- .../openapi/roots/impl/RootIndex.java | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/RootIndex.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/RootIndex.java index 35c6a474af24..fe850814f868 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/RootIndex.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/RootIndex.java @@ -18,15 +18,14 @@ package com.intellij.openapi.roots.impl; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileTypes.FileTypeManager; -import com.intellij.openapi.fileTypes.FileTypeRegistry; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.*; import com.intellij.openapi.roots.impl.libraries.LibraryEx; import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; @@ -71,15 +70,9 @@ class RootIndex { } for (ContentEntry contentEntry : contentEntries) { - // Init excluded roots - VirtualFile[] excluded = contentEntry.getExcludeFolderFiles(); - for (VirtualFile excludeRoot : excluded) { + for (VirtualFile excludeRoot : contentEntry.getExcludeFolderFiles()) { RootInfo info = getOrCreateRootInfo(excludeRoot); info.excludedFromModule = module; - if (!FileUtil.startsWith(excludeRoot.getUrl(), contentEntry.getUrl())) { - info.excludedFromProject = true; - myProjectExcludedRoots.add(excludeRoot); - } } // Init module sources @@ -150,17 +143,31 @@ class RootIndex { for (DirectoryIndexExcludePolicy policy : Extensions.getExtensions(DirectoryIndexExcludePolicy.EP_NAME, project)) { for (VirtualFile root : policy.getExcludeRootsForProject()) { getOrCreateRootInfo(root).excludedFromProject = true; - myProjectExcludedRoots.add(root); } } for (RootInfo info : myRoots.values()) { - Pair pair = calcDirectoryInfo(info); + List hierarchy = getHierarchy(info); + Pair pair = hierarchy == null ? new Pair(null, null) : calcDirectoryInfo(info, hierarchy); cacheInfos(info.root, info.root, pair.first); myPackagePrefixRoots.putValue(pair.second, info.root); + if (shouldMarkAsProjectExcluded(info, hierarchy)) { + myProjectExcludedRoots.add(info.root); + } } } + private static boolean shouldMarkAsProjectExcluded(RootInfo info, List hierarchy) { + if (hierarchy == null) return false; + if (!(info.excludedFromProject || info.excludedFromModule != null)) return false; + return ContainerUtil.find(hierarchy, new Condition() { + @Override + public boolean value(RootInfo info) { + return info.contentRootOf != null; + } + }) == null; + } + public void checkConsistency() { for (VirtualFile file : myProjectExcludedRoots) { assert file.exists() : file.getPath() + " does not exist"; @@ -368,12 +375,7 @@ class RootIndex { } @NotNull - private Pair calcDirectoryInfo(RootInfo info) { - List hierarchy = getHierarchy(info); - if (hierarchy == null) { - return new Pair(null, null); - } - + private static Pair calcDirectoryInfo(RootInfo info, @NotNull final List hierarchy) { RootInfo moduleContentInfo = findModuleRootInfo(hierarchy); RootInfo libraryClassInfo = findLibraryRootInfo(hierarchy, false); RootInfo librarySourceInfo = findLibraryRootInfo(hierarchy, true);