From d8d3be6b13499f151a9d184c0064d0911bac7627 Mon Sep 17 00:00:00 2001 From: Sergey Patrikeev Date: Mon, 27 Jan 2020 17:12:06 +0300 Subject: [PATCH] Implement "FileBasedIndex.iterateRecursively" using "VfsUtilCore.iterateChildrenRecursively" with proper file filtering. GitOrigin-RevId: 72a8c46c9d5efae6a5c8b38d0df32063b22ebe54 --- .../util/indexing/FileBasedIndex.java | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/platform/indexing-api/src/com/intellij/util/indexing/FileBasedIndex.java b/platform/indexing-api/src/com/intellij/util/indexing/FileBasedIndex.java index 3b8d937dcd0c..a61b03ee2b56 100644 --- a/platform/indexing-api/src/com/intellij/util/indexing/FileBasedIndex.java +++ b/platform/indexing-api/src/com/intellij/util/indexing/FileBasedIndex.java @@ -157,39 +157,38 @@ public abstract class FileBasedIndex { @NotNull public abstract Map getFileData(@NotNull ID id, @NotNull VirtualFile virtualFile, @NotNull Project project); - public static void iterateRecursively(@Nullable final VirtualFile root, + public static void iterateRecursively(@NotNull final VirtualFile root, @NotNull final ContentIterator processor, @Nullable final ProgressIndicator indicator, @Nullable final Set visitedRoots, @Nullable final ProjectFileIndex projectFileIndex) { - if (root == null) { - return; - } + VirtualFileFilter acceptFilter = (file) -> { + if (indicator != null) { + indicator.checkCanceled(); + } + if (visitedRoots != null && !root.equals(file) && file.isDirectory() && !visitedRoots.add(file)) { + return false; + } + return projectFileIndex == null || !ReadAction.compute(() -> projectFileIndex.isExcluded(file)); + }; - VfsUtilCore.visitChildrenRecursively(root, new VirtualFileVisitor() { - @Override - public boolean visitFile(@NotNull VirtualFile file) { - if (!acceptsFile(file)) return false; + VirtualFileFilter symlinkFilter = (file) -> { + if (acceptFilter.accept(file)) { if (file.is(VFileProperty.SYMLINK)) { - if(!Registry.is("indexer.follows.symlinks")) return false; + if (!Registry.is("indexer.follows.symlinks")) { + return false; + } VirtualFile canonicalFile = file.getCanonicalFile(); - if (canonicalFile != null) { - if(!acceptsFile(canonicalFile)) return false; + return acceptFilter.accept(canonicalFile); } } - - processor.processFile(file); return true; } + return false; + }; - private boolean acceptsFile(@NotNull VirtualFile file) { - if (visitedRoots != null && !root.equals(file) && file.isDirectory() && !visitedRoots.add(file)) { - return false; - } - return projectFileIndex == null || !ReadAction.compute(() -> projectFileIndex.isExcluded(file)); - } - }); + VfsUtilCore.iterateChildrenRecursively(root, symlinkFilter, processor); } public void invalidateCaches() {