From 930bb0b07098cdc1b78226da939a3daf05917f5a Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 20 Aug 2012 22:34:55 +0400 Subject: [PATCH] Use VFS visitor in place of recursion (test framework) --- .../testFramework/ModuleTestCase.java | 34 +++++++++++-------- .../testFramework/LightPlatformTestCase.java | 20 +++++------ .../src/com/intellij/openapi/util/Ref.java | 8 +++++ 3 files changed, 36 insertions(+), 26 deletions(-) diff --git a/java/testFramework/src/com/intellij/testFramework/ModuleTestCase.java b/java/testFramework/src/com/intellij/testFramework/ModuleTestCase.java index 478b922ffe5a..e91b5ff5ec1d 100644 --- a/java/testFramework/src/com/intellij/testFramework/ModuleTestCase.java +++ b/java/testFramework/src/com/intellij/testFramework/ModuleTestCase.java @@ -27,9 +27,13 @@ import com.intellij.openapi.project.impl.ProjectImpl; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.impl.ModuleRootManagerImpl; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileVisitor; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; @@ -115,23 +119,23 @@ public abstract class ModuleTestCase extends IdeaTestCase { return loadModule(new File(modulePath)); } - @Nullable - protected ModuleImpl loadAllModulesUnder(VirtualFile rootDir) throws Exception { - ModuleImpl module = null; - final VirtualFile[] children = rootDir.getChildren(); - for (VirtualFile child : children) { - if (child.isDirectory()) { - final ModuleImpl childModule = loadAllModulesUnder(child); - if (module == null) module = childModule; + protected Module loadAllModulesUnder(@NotNull VirtualFile rootDir) throws Exception { + final Ref result = Ref.create(); + + VfsUtilCore.visitChildrenRecursively(rootDir, new VirtualFileVisitor() { + @Override + public boolean visitFile(@NotNull VirtualFile file) { + if (!file.isDirectory() && file.getName().endsWith(ModuleFileType.DOT_DEFAULT_EXTENSION)) { + ModuleImpl module = (ModuleImpl)loadModule(new File(file.getPath())); + readJdomExternalizables(module); + result.setIfNull(module); + } + return true; } - else if (child.getName().endsWith(ModuleFileType.DOT_DEFAULT_EXTENSION)) { - String modulePath = child.getPath(); - module = (ModuleImpl)loadModule(new File(modulePath)); - readJdomExternalizables(module); - } - } - return module; + }); + + return result.get(); } protected void readJdomExternalizables(final ModuleImpl module) { diff --git a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java index d4a52247d35e..fb48375fccf1 100644 --- a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java @@ -68,10 +68,7 @@ import com.intellij.openapi.util.EmptyRunnable; import com.intellij.openapi.util.ShutDownTracker; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.VfsUtilCore; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.openapi.vfs.*; import com.intellij.openapi.vfs.encoding.EncodingManager; import com.intellij.openapi.vfs.encoding.EncodingManagerImpl; import com.intellij.openapi.vfs.impl.VirtualFilePointerManagerImpl; @@ -245,14 +242,15 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da @Override public void iterateIndexableFilesIn(@NotNull final VirtualFile file, @NotNull final ContentIterator iterator) { - if (file.isDirectory()) { - for (VirtualFile child : file.getChildren()) { - iterateIndexableFilesIn(child, iterator); + VfsUtilCore.visitChildrenRecursively(file, new VirtualFileVisitor() { + @Override + public boolean visitFile(@NotNull VirtualFile file) { + if (!file.isDirectory()) { + iterator.processFile(file); + } + return true; } - } - else { - iterator.processFile(file); - } + }); } }, null); diff --git a/platform/util/src/com/intellij/openapi/util/Ref.java b/platform/util/src/com/intellij/openapi/util/Ref.java index f1f4265292c6..d35b39de264b 100644 --- a/platform/util/src/com/intellij/openapi/util/Ref.java +++ b/platform/util/src/com/intellij/openapi/util/Ref.java @@ -41,6 +41,14 @@ public class Ref { myValue = value; } + public boolean setIfNull(@Nullable T value) { + if (myValue == null) { + myValue = value; + return true; + } + return false; + } + public static Ref create() { return new Ref(); }