summaryrefslogtreecommitdiff
path: root/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java')
-rw-r--r--platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java102
1 files changed, 56 insertions, 46 deletions
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 ad3b851cf2f6..ca68cee3d061 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
@@ -43,16 +43,8 @@ import java.util.*;
public class RootIndex extends DirectoryIndex {
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.roots.impl.RootIndex");
- private static final DirectoryInfo NULL_INFO = new DirectoryInfo(null, null, null, null, (byte)0) {
- @NotNull
- @Override
- public OrderEntry[] getOrderEntries() {
- throw new UnsupportedOperationException("Not implemented");
- }
- };
private final Set<VirtualFile> myProjectExcludedRoots = ContainerUtil.newHashSet();
- private final Set<VirtualFile> myModuleExcludedRoots;
private final MultiMap<String, VirtualFile> myPackagePrefixRoots = new MultiMap<String, VirtualFile>() {
@NotNull
@Override
@@ -77,15 +69,15 @@ public class RootIndex extends DirectoryIndex {
Set<VirtualFile> allRoots = info.getAllRoots();
for (VirtualFile root : allRoots) {
List<VirtualFile> hierarchy = getHierarchy(root, allRoots, info);
- Pair<DirectoryInfo, String> pair = hierarchy == null ? new Pair<DirectoryInfo, String>(null, null) : calcDirectoryInfo(root, hierarchy, info);
+ Pair<DirectoryInfo, String> pair = hierarchy != null
+ ? calcDirectoryInfo(root, hierarchy, info)
+ : new Pair<DirectoryInfo, String>(NonProjectDirectoryInfo.IGNORED, null);
cacheInfos(root, root, pair.first);
myPackagePrefixRoots.putValue(pair.second, root);
if (info.shouldMarkAsProjectExcluded(root, hierarchy)) {
myProjectExcludedRoots.add(root);
}
}
-
- myModuleExcludedRoots = info.excludedFromModule.keySet();
}
@NotNull
@@ -232,7 +224,7 @@ public class RootIndex extends DirectoryIndex {
}
OrderEntry[] array = orderEntries.toArray(new OrderEntry[orderEntries.size()]);
- Arrays.sort(array, DirectoryInfo.BY_OWNER_MODULE);
+ Arrays.sort(array, DirectoryInfoImpl.BY_OWNER_MODULE);
return array;
}
@@ -254,7 +246,7 @@ public class RootIndex extends DirectoryIndex {
}
int id = myRootTypes.size();
- if (id > DirectoryInfo.MAX_ROOT_TYPE_ID) {
+ if (id > DirectoryInfoImpl.MAX_ROOT_TYPE_ID) {
LOG.error("Too many different types of module source roots (" + id + ") registered: " + myRootTypes);
}
myRootTypes.add(rootType);
@@ -263,14 +255,30 @@ public class RootIndex extends DirectoryIndex {
}
@Override
- @Nullable
- public DirectoryInfo getInfoForDirectory(@NotNull final VirtualFile dir) {
- if (!dir.isValid()) {
- return null;
+ public DirectoryInfo getInfoForDirectory(@NotNull VirtualFile dir) {
+ DirectoryInfo info = getInfoForFile(dir);
+ return info.isInProject() ? info : null;
+ }
+
+ @NotNull
+ @Override
+ public DirectoryInfo getInfoForFile(@NotNull VirtualFile file) {
+ if (!file.isValid()) {
+ return NonProjectDirectoryInfo.INVALID;
+ }
+ VirtualFile dir;
+ if (!file.isDirectory()) {
+ DirectoryInfo info = myInfoCache.getCachedInfo(file);
+ if (info != null) {
+ return info;
+ }
+ if (isIgnored(file)) {
+ return NonProjectDirectoryInfo.IGNORED;
+ }
+ dir = file.getParent();
}
- if (!dir.isDirectory()) {
- DirectoryInfo info = myInfoCache.getCachedInfo(dir);
- return info == NULL_INFO ? null : info;
+ else {
+ dir = file;
}
int count = 0;
@@ -283,21 +291,21 @@ public class RootIndex extends DirectoryIndex {
if (!dir.equals(root)) {
cacheInfos(dir, root, info);
}
- return info == NULL_INFO ? null : info;
+ return info;
}
if (isIgnored(root)) {
- return cacheInfos(dir, root, null);
+ return cacheInfos(dir, root, NonProjectDirectoryInfo.IGNORED);
}
}
- return cacheInfos(dir, null, null);
+ return cacheInfos(dir, null, NonProjectDirectoryInfo.NOT_UNDER_PROJECT_ROOTS);
}
- @Nullable
- private DirectoryInfo cacheInfos(VirtualFile dir, @Nullable VirtualFile stopAt, @Nullable DirectoryInfo info) {
+ @NotNull
+ private DirectoryInfo cacheInfos(VirtualFile dir, @Nullable VirtualFile stopAt, @NotNull DirectoryInfo info) {
while (dir != null) {
- myInfoCache.cacheInfo(dir, info == null ? NULL_INFO : info);
+ myInfoCache.cacheInfo(dir, info);
if (dir.equals(stopAt)) {
break;
}
@@ -307,16 +315,6 @@ public class RootIndex extends DirectoryIndex {
}
@Override
- public boolean isProjectExcludeRoot(@NotNull final VirtualFile dir) {
- return myProjectExcludedRoots.contains(dir);
- }
-
- @Override
- public boolean isModuleExcludeRoot(@NotNull final VirtualFile dir) {
- return myModuleExcludedRoots.contains(dir);
- }
-
- @Override
@NotNull
public Query<VirtualFile> getDirectoriesByPackageName(@NotNull final String packageName, final boolean includeLibrarySources) {
List<VirtualFile> result = myDirectoriesByPackageNameCache.get(packageName);
@@ -327,7 +325,8 @@ public class RootIndex extends DirectoryIndex {
String shortName = StringUtil.getShortName(packageName);
for (VirtualFile parentDir : getDirectoriesByPackageName(StringUtil.getPackageName(packageName), true)) {
VirtualFile child = parentDir.findChild(shortName);
- if (child != null && child.isDirectory() && getInfoForDirectory(child) != null && packageName.equals(getPackageName(child))) {
+ if (child != null && child.isDirectory() && getInfoForFile(child).isInProject()
+ && packageName.equals(getPackageName(child))) {
result.add(child);
}
}
@@ -344,8 +343,8 @@ public class RootIndex extends DirectoryIndex {
result = ContainerUtil.filter(result, new Condition<VirtualFile>() {
@Override
public boolean value(VirtualFile file) {
- DirectoryInfo info = getInfoForDirectory(file);
- return info != null && (!info.isInLibrarySource() || info.isInModuleSource() || info.hasLibraryClassRoot());
+ DirectoryInfo info = getInfoForFile(file);
+ return info.isInProject() && (!info.isInLibrarySource() || info.isInModuleSource() || info.hasLibraryClassRoot());
}
});
}
@@ -397,7 +396,7 @@ public class RootIndex extends DirectoryIndex {
return false;
}
- @Nullable
+ @Nullable("returns null only if dir is under ignored folder")
private static List<VirtualFile> getHierarchy(VirtualFile dir, @NotNull Set<VirtualFile> allRoots, @NotNull RootInfo info) {
List<VirtualFile> hierarchy = ContainerUtil.newArrayList();
boolean hasContentRoots = false;
@@ -472,6 +471,15 @@ public class RootIndex extends DirectoryIndex {
}
@Nullable
+ private Module findParentModuleForExcluded(@NotNull List<VirtualFile> hierarchy) {
+ for (VirtualFile root : hierarchy) {
+ Module module = contentRootOf.get(root);
+ if (module != null) return module;
+ }
+ return null;
+ }
+
+ @Nullable
private VirtualFile findLibraryRootInfo(@NotNull List<VirtualFile> hierarchy, boolean source) {
Set<Library> librariesToIgnore = ContainerUtil.newHashSet();
for (VirtualFile root : hierarchy) {
@@ -566,8 +574,12 @@ public class RootIndex extends DirectoryIndex {
VirtualFile moduleContentRoot = info.findModuleRootInfo(hierarchy);
VirtualFile libraryClassRoot = info.findLibraryRootInfo(hierarchy, false);
VirtualFile librarySourceRoot = info.findLibraryRootInfo(hierarchy, true);
+ Module parentModuleForExcluded = null;
if (moduleContentRoot == null && libraryClassRoot == null && librarySourceRoot == null) {
- return new Pair<DirectoryInfo, String>(null, null);
+ parentModuleForExcluded = info.findParentModuleForExcluded(hierarchy);
+ if (parentModuleForExcluded == null) {
+ return new Pair<DirectoryInfo, String>(NonProjectDirectoryInfo.EXCLUDED, null);
+ }
}
VirtualFile sourceRoot = info.findPackageRootInfo(hierarchy, moduleContentRoot, null, librarySourceRoot);
@@ -577,11 +589,9 @@ public class RootIndex extends DirectoryIndex {
boolean inLibrarySource = librarySourceRoot != null;
int typeId = moduleSourceRoot != null ? info.rootTypeId.get(moduleSourceRoot) : 0;
- DirectoryInfo directoryInfo = new DirectoryInfo(info.contentRootOf.get(moduleContentRoot),
- moduleContentRoot,
- sourceRoot,
- libraryClassRoot,
- (byte)DirectoryInfo.createSourceRootTypeData(inModuleSources, inLibrarySource, typeId)) {
+ Module module = parentModuleForExcluded != null ? parentModuleForExcluded : info.contentRootOf.get(moduleContentRoot);
+ DirectoryInfo directoryInfo = new DirectoryInfoImpl(module, moduleContentRoot, sourceRoot, libraryClassRoot, inModuleSources, inLibrarySource,
+ parentModuleForExcluded != null, typeId) {
@NotNull
@Override
public OrderEntry[] getOrderEntries() {