diff --git a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java index 1a51783ac080..f4c5d7f5d837 100644 --- a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java +++ b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java @@ -25,6 +25,8 @@ import com.intellij.util.*; import com.intellij.util.concurrency.FixedFuture; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.Convertor; +import com.intellij.util.containers.JBIterable; +import com.intellij.util.containers.JBTreeTraverser; import com.intellij.util.io.URLUtil; import com.intellij.util.text.FilePathHashingStrategy; import com.intellij.util.text.StringFactory; @@ -1291,10 +1293,26 @@ public class FileUtil extends FileUtilRt { } } - public static boolean processFilesRecursively(@NotNull File root, @NotNull Processor processor) { - return processFilesRecursively(root, processor, null); + @NotNull + public static JBTreeTraverser fileTraverser(@Nullable File root) { + return new JBTreeTraverser(FILE_CHILDREN).withRoot(root); } + private static final Function> FILE_CHILDREN = new Function>() { + @Override + public Iterable fun(File file) { + return file != null && file.isDirectory() ? JBIterable.of(file.listFiles()) : JBIterable.empty(); + } + }; + + public static boolean processFilesRecursively(@NotNull File root, @NotNull Processor processor) { + return fileTraverser(root).bfsTraversal().processEach(processor); + } + + /** + * @see FileUtil#fileTraverser(File) + */ + @Deprecated public static boolean processFilesRecursively(@NotNull File root, @NotNull Processor processor, @Nullable final Processor directoryFilter) { final LinkedList queue = new LinkedList();