From 2d94131d238f0ccf631df88cc270c92ea8703602 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Mon, 7 Jun 2010 14:35:16 +0400 Subject: [PATCH] Optimization of VfsUtil.processFilesRecursively(...) --- .../src/com/intellij/openapi/vfs/VfsUtil.java | 51 +++++++++++++------ 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/vfs/VfsUtil.java b/platform/platform-api/src/com/intellij/openapi/vfs/VfsUtil.java index 65a83aad84d2..4d73cd893814 100644 --- a/platform/platform-api/src/com/intellij/openapi/vfs/VfsUtil.java +++ b/platform/platform-api/src/com/intellij/openapi/vfs/VfsUtil.java @@ -680,27 +680,46 @@ public class VfsUtil { public static void processFilesRecursively(@NotNull VirtualFile root, @NotNull Processor processor, @NotNull Convertor directoryFilter) { - final LinkedList queue = new LinkedList(); - queue.add(root); - while (!queue.isEmpty()) { - final VirtualFile file = queue.removeFirst(); - if (!processor.process(file)) return; - if (file.isDirectory() && directoryFilter.convert(file)) { - queue.addAll(Arrays.asList(file.getChildren())); - } + if (!processor.process(root)) return; + + if (root.isDirectory() && directoryFilter.convert(root)) { + final LinkedList queue = new LinkedList(); + + queue.add(root.getChildren()); + + do { + final VirtualFile[] files = queue.removeFirst(); + + for (VirtualFile file : files) { + if (!processor.process(file)) return; + if (file.isDirectory() && directoryFilter.convert(file)) { + queue.add(file.getChildren()); + } + } + } while (!queue.isEmpty()); } } public static boolean processFilesRecursively(@NotNull VirtualFile root, @NotNull Processor processor) { - final LinkedList queue = new LinkedList(); - queue.add(root); - while (!queue.isEmpty()) { - final VirtualFile file = queue.removeFirst(); - if (!processor.process(file)) return false; - if (file.isDirectory()) { - queue.addAll(Arrays.asList(file.getChildren())); - } + if (!processor.process(root)) return false; + + if (root.isDirectory()) { + final LinkedList queue = new LinkedList(); + + queue.add(root.getChildren()); + + do { + final VirtualFile[] files = queue.removeFirst(); + + for (VirtualFile file : files) { + if (!processor.process(file)) return false; + if (file.isDirectory()) { + queue.add(file.getChildren()); + } + } + } while (!queue.isEmpty()); } + return true; }