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 0807bea915c8..73e475e22242 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 @@ -44,12 +44,12 @@ class RootIndex { private final Set myProjectExcludedRoots = ContainerUtil.newHashSet(); private final Set myLibraryExcludedRoots = ContainerUtil.newHashSet(); - private final Map myRoots = ContainerUtil.newHashMap(); + private final Map myRoots = ContainerUtil.newTroveMap(); private final Map> myPackagePrefixRoots = ContainerUtil.newHashMap(); private final Map> myDirectoriesByPackageNameCache = ContainerUtil.newConcurrentMap(); private final Map> myDirectoriesByPackageNameCacheWithLibSrc = ContainerUtil.newConcurrentMap(); - private final Map myIgnoredCache = ContainerUtil.newConcurrentMap(); + private final Map myInfoCache = ContainerUtil.newConcurrentMap(); private final List> myRootTypes = ContainerUtil.newArrayList(); private final TObjectIntHashMap> myRootTypeId = new TObjectIntHashMap>(); @@ -320,15 +320,19 @@ class RootIndex { if (++count > 1000) { throw new IllegalStateException("Possible loop in tree, started at " + dir.getName()); } - final DirectoryInfo info = myRoots.get(root); + DirectoryInfo info = myInfoCache.get(root); if (info != null) { + return info == DirectoryInfo.EMPTY ? null : info; + } + + info = myRoots.get(root); + if (info != null) { + myInfoCache.put(dir, info); return info; } - Boolean ignored = myIgnoredCache.get(root); - if (ignored == null) { - myIgnoredCache.put(root, ignored = isAnyExcludeRoot(root) || FileTypeManager.getInstance().isFileIgnored(root)); - } - if (ignored.booleanValue()) { + + if (isAnyExcludeRoot(root) || FileTypeManager.getInstance().isFileIgnored(root)) { + myInfoCache.put(dir, DirectoryInfo.EMPTY); return null; } } diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java index 25b4192261fe..cbabea19466e 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java @@ -36,6 +36,7 @@ import java.util.Comparator; import java.util.List; public final class DirectoryInfo { + static final DirectoryInfo EMPTY = createNew(); public static final int MAX_ROOT_TYPE_ID = (1 << (Byte.SIZE - 2)) - 1; private final Module module; // module to which content it belongs or null private final VirtualFile libraryClassRoot; // class root in library