@NotNull private DirectoryInfo cacheInfos( VirtualFile dir, @Nullable VirtualFile stopAt, @NotNull DirectoryInfo info) { while (dir != null) { myInfoCache.cacheInfo(dir, info); if (dir.equals(stopAt)) { break; } dir = dir.getParent(); } return info; }
@NotNull 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(); } else { dir = file; } int count = 0; for (VirtualFile root = dir; root != null; root = root.getParent()) { if (++count > 1000) { throw new IllegalStateException("Possible loop in tree, started at " + dir.getName()); } DirectoryInfo info = myInfoCache.getCachedInfo(root); if (info != null) { if (!dir.equals(root)) { cacheInfos(dir, root, info); } return info; } if (isIgnored(root)) { return cacheInfos(dir, root, NonProjectDirectoryInfo.IGNORED); } } return cacheInfos(dir, null, NonProjectDirectoryInfo.NOT_UNDER_PROJECT_ROOTS); }