From efdb3f0ddf0317e64f7daa6e17a5e9813868ee45 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Mon, 27 Dec 2010 18:06:18 +0300 Subject: [PATCH] order enumerator fixes and tests (+hot swap fixed) --- .../debugger/impl/HotSwapManager.java | 2 +- .../intellij/roots/OrderEnumeratorTest.java | 64 +++++++++++++++---- .../openapi/roots/OrderEnumerator.java | 4 ++ .../roots/impl/ModuleOrderEnumerator.java | 2 +- .../roots/impl/ModulesOrderEnumerator.java | 6 ++ .../roots/impl/OrderEnumeratorBase.java | 16 +++-- .../roots/impl/OrderRootsEnumeratorImpl.java | 4 +- .../roots/impl/ProjectOrderEnumerator.java | 6 ++ 8 files changed, 82 insertions(+), 22 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java b/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java index 74568514b9d9..82f11ba51276 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java @@ -77,7 +77,7 @@ public class HotSwapManager extends AbstractProjectComponent { ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { - final List allClasses = OrderEnumerator.orderEntries(myProject).getPathsList().getRootDirs(); + final List allClasses = OrderEnumerator.orderEntries(myProject).withoutSdk().getPathsList().getRootDirs(); final VirtualFile[] allDirs = VfsUtil.toVirtualFileArray(allClasses); final FileTypeManager fileTypeManager = FileTypeManager.getInstance(); diff --git a/java/java-tests/testSrc/com/intellij/roots/OrderEnumeratorTest.java b/java/java-tests/testSrc/com/intellij/roots/OrderEnumeratorTest.java index dd1aa2d6c6c8..fe7aaf2b1c05 100644 --- a/java/java-tests/testSrc/com/intellij/roots/OrderEnumeratorTest.java +++ b/java/java-tests/testSrc/com/intellij/roots/OrderEnumeratorTest.java @@ -9,10 +9,12 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import static com.intellij.openapi.roots.OrderEnumerator.orderEntries; + /** * @author nik */ @@ -53,18 +55,31 @@ public class OrderEnumeratorTest extends ModuleRootManagerTestCase { public void testModuleDependency() throws Exception { final Module dep = createModule("dep"); - final VirtualFile srcRoot = addSourceRoot(dep, false); - final VirtualFile testRoot = addSourceRoot(dep, true); - final VirtualFile output = setModuleOutput(dep, false); - final VirtualFile testOutput = setModuleOutput(dep, true); + final VirtualFile depSrcRoot = addSourceRoot(dep, false); + final VirtualFile depTestRoot = addSourceRoot(dep, true); + final VirtualFile depOutput = setModuleOutput(dep, false); + final VirtualFile depTestOutput = setModuleOutput(dep, true); addLibraryDependency(dep, createJDomLibrary(), DependencyScope.COMPILE, true); addModuleDependency(myModule, dep, DependencyScope.COMPILE, true); - assertClassRoots(orderEntries(myModule).withoutSdk(), testOutput, output); - assertClassRoots(orderEntries(myModule).withoutSdk().recursively(), testOutput, output, getJDomJar()); - assertSourceRoots(orderEntries(myModule), srcRoot, testRoot); - assertSourceRoots(orderEntries(myModule).recursively(), srcRoot, testRoot, getJDomSources()); - assertEnumeratorRoots(orderEntries(myModule).withoutSdk().recursively().classes().withoutSelfModuleOutput(), testOutput, output, getJDomJar()); + final VirtualFile srcRoot = addSourceRoot(myModule, false); + final VirtualFile testRoot = addSourceRoot(myModule, true); + final VirtualFile output = setModuleOutput(myModule, false); + final VirtualFile testOutput = setModuleOutput(myModule, true); + + assertClassRoots(orderEntries(myModule).withoutSdk(), testOutput, output, depTestOutput, depOutput); + assertClassRoots(orderEntries(myModule).withoutSdk().recursively(), testOutput, output, depTestOutput, depOutput, getJDomJar()); + assertSourceRoots(orderEntries(myModule), srcRoot, testRoot, depSrcRoot, depTestRoot); + assertSourceRoots(orderEntries(myModule).recursively(), srcRoot, testRoot, depSrcRoot, depTestRoot, getJDomSources()); + assertEnumeratorRoots(orderEntries(myModule).withoutSdk().recursively().classes().withoutSelfModuleOutput(), + output, depTestOutput, depOutput, getJDomJar()); + assertEnumeratorRoots(orderEntries(myModule).productionOnly().withoutSdk().recursively().classes().withoutSelfModuleOutput(), + depOutput, getJDomJar()); + + assertClassRoots(orderEntries(myModule).withoutSdk().withoutModuleSourceEntries().recursively(), + depTestOutput, depOutput, getJDomJar()); + assertSourceRoots(orderEntries(myModule).withoutSdk().withoutModuleSourceEntries().recursively(), + depSrcRoot, depTestRoot, getJDomSources()); } public void testModuleDependencyScope() throws Exception { @@ -80,7 +95,7 @@ public class OrderEnumeratorTest extends ModuleRootManagerTestCase { assertClassRoots(ProjectRootManager.getInstance(myProject).orderEntries().withoutSdk(), getJDomJar()); assertClassRoots(ProjectRootManager.getInstance(myProject).orderEntries().withoutSdk().productionOnly(), getJDomJar()); } - + public void testNotExportedLibrary() throws Exception { final Module dep = createModule("dep"); addLibraryDependency(dep, createJDomLibrary(), DependencyScope.COMPILE, false); @@ -111,7 +126,7 @@ public class OrderEnumeratorTest extends ModuleRootManagerTestCase { assertRoots(orderEntries(myModule).classes().usingCache().getPathsList(), getRtJar(), getJDomJar()); assertRoots(orderEntries(myModule).withoutSdk().classes().usingCache().getPathsList(), getJDomJar()); } - + public void testCachingUrls() throws Exception { final String[] urls = orderEntries(myModule).classes().usingCache().getUrls(); assertOrderedEquals(urls, getRtJar().getUrl()); @@ -127,6 +142,32 @@ public class OrderEnumeratorTest extends ModuleRootManagerTestCase { assertOrderedEquals(orderEntries(myModule).sources().usingCache().getUrls(), getJDomSources().getUrl()); } + public void testProject() throws Exception { + addLibraryDependency(myModule, createJDomLibrary()); + + final VirtualFile srcRoot = addSourceRoot(myModule, false); + final VirtualFile testRoot = addSourceRoot(myModule, true); + final VirtualFile output = setModuleOutput(myModule, false); + final VirtualFile testOutput = setModuleOutput(myModule, true); + + assertClassRoots(orderEntries(myProject).withoutSdk(), testOutput, output, getJDomJar()); + assertSourceRoots(orderEntries(myProject).withoutSdk(), srcRoot, testRoot, getJDomSources()); + } + + public void testModules() throws Exception { + addLibraryDependency(myModule, createJDomLibrary()); + + final VirtualFile srcRoot = addSourceRoot(myModule, false); + final VirtualFile testRoot = addSourceRoot(myModule, true); + final VirtualFile output = setModuleOutput(myModule, false); + final VirtualFile testOutput = setModuleOutput(myModule, true); + + assertClassRoots(ProjectRootManager.getInstance(myProject).orderEntries(Arrays.asList(myModule)).withoutSdk(), + testOutput, output, getJDomJar()); + assertSourceRoots(ProjectRootManager.getInstance(myProject).orderEntries(Arrays.asList(myModule)).withoutSdk(), + srcRoot, testRoot, getJDomSources()); + } + private static void assertClassRoots(final OrderEnumerator enumerator, VirtualFile... files) { assertEnumeratorRoots(enumerator.classes(), files); } @@ -143,5 +184,4 @@ public class OrderEnumeratorTest extends ModuleRootManagerTestCase { } assertOrderedEquals(rootsEnumerator.getUrls(), ArrayUtil.toStringArray(expectedUrls)); } - } diff --git a/platform/lang-api/src/com/intellij/openapi/roots/OrderEnumerator.java b/platform/lang-api/src/com/intellij/openapi/roots/OrderEnumerator.java index 03c4405eb725..fd76cff6707f 100644 --- a/platform/lang-api/src/com/intellij/openapi/roots/OrderEnumerator.java +++ b/platform/lang-api/src/com/intellij/openapi/roots/OrderEnumerator.java @@ -66,6 +66,10 @@ public abstract class OrderEnumerator { public abstract OrderEnumerator withoutDepModules(); + /** + * Skip root module's entries + * @return this + */ public abstract OrderEnumerator withoutModuleSourceEntries(); public OrderEnumerator librariesOnly() { diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ModuleOrderEnumerator.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ModuleOrderEnumerator.java index ae8b79ea225f..4129b5aa54fd 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ModuleOrderEnumerator.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ModuleOrderEnumerator.java @@ -44,7 +44,7 @@ public class ModuleOrderEnumerator extends OrderEnumeratorBase { } @Override - public boolean isMainModuleModel(@NotNull ModuleRootModel rootModel) { + public boolean isRootModuleModel(@NotNull ModuleRootModel rootModel) { return rootModel.equals(myRootModel); } } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ModulesOrderEnumerator.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ModulesOrderEnumerator.java index 256218ca2e54..f5aa628e3d88 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ModulesOrderEnumerator.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ModulesOrderEnumerator.java @@ -17,6 +17,7 @@ package com.intellij.openapi.roots.impl; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ModuleRootModel; import com.intellij.openapi.roots.OrderEntry; import com.intellij.util.Processor; import gnu.trove.THashSet; @@ -50,4 +51,9 @@ public class ModulesOrderEnumerator extends OrderEnumeratorBase { processEntries(getRootModel(module), processor, processed, true); } } + + @Override + public boolean isRootModuleModel(@NotNull ModuleRootModel rootModel) { + return myModules.contains(rootModel.getModule()); + } } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderEnumeratorBase.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderEnumeratorBase.java index 3e7633f815ff..4d96b2fbfd7d 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderEnumeratorBase.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderEnumeratorBase.java @@ -44,7 +44,7 @@ abstract class OrderEnumeratorBase extends OrderEnumerator { private boolean myWithoutJdk; private boolean myWithoutLibraries; protected boolean myWithoutDepModules; - private boolean myWithoutThisModuleContent; + private boolean myWithoutRootModuleContent; protected boolean myRecursively; protected boolean myRecursivelyExportedOnly; private boolean myExportedOnly; @@ -105,7 +105,7 @@ abstract class OrderEnumeratorBase extends OrderEnumerator { @Override public OrderEnumerator withoutModuleSourceEntries() { - myWithoutThisModuleContent = true; + myWithoutRootModuleContent = true; return this; } @@ -186,7 +186,7 @@ abstract class OrderEnumeratorBase extends OrderEnumerator { flags <<= 1; if (myWithoutDepModules) flags |= 1; flags <<= 1; - if (myWithoutThisModuleContent) flags |= 1; + if (myWithoutRootModuleContent) flags |= 1; flags <<= 1; if (myRecursively) flags |= 1; flags <<= 1; @@ -206,9 +206,13 @@ abstract class OrderEnumeratorBase extends OrderEnumerator { if (myWithoutLibraries && entry instanceof LibraryOrderEntry) continue; if (myWithoutDepModules) { if (!myRecursively && entry instanceof ModuleOrderEntry) continue; - if (entry instanceof ModuleSourceOrderEntry && !isMainModuleModel(((ModuleSourceOrderEntry)entry).getRootModel())) continue; + if (entry instanceof ModuleSourceOrderEntry && !isRootModuleModel(((ModuleSourceOrderEntry)entry).getRootModel())) continue; + } + if (myWithoutRootModuleContent + && entry instanceof ModuleSourceOrderEntry + && isRootModuleModel(((ModuleSourceOrderEntry)entry).getRootModel())) { + continue; } - if (myWithoutThisModuleContent && entry instanceof ModuleSourceOrderEntry) continue; OrderEnumerationHandler.AddDependencyType shouldAdd = OrderEnumerationHandler.AddDependencyType.DEFAULT; for (OrderEnumerationHandler handler : myCustomHandlers) { @@ -348,7 +352,7 @@ abstract class OrderEnumeratorBase extends OrderEnumerator { } } - public boolean isMainModuleModel(@NotNull ModuleRootModel rootModel) { + public boolean isRootModuleModel(@NotNull ModuleRootModel rootModel) { return false; } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderRootsEnumeratorImpl.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderRootsEnumeratorImpl.java index 9fea5cbe55aa..c1f2dce222aa 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderRootsEnumeratorImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/OrderRootsEnumeratorImpl.java @@ -215,7 +215,7 @@ public class OrderRootsEnumeratorImpl implements OrderRootsEnumerator { else if (type.equals(OrderRootType.CLASSES)) { final CompilerModuleExtension extension = rootModel.getModuleExtension(CompilerModuleExtension.class); if (extension != null) { - if (myWithoutSelfModuleOutput && myOrderEnumerator.isMainModuleModel(rootModel)) { + if (myWithoutSelfModuleOutput && myOrderEnumerator.isRootModuleModel(rootModel)) { if (!productionOnly) { Collections.addAll(result, extension.getOutputRoots(false)); } @@ -235,7 +235,7 @@ public class OrderRootsEnumeratorImpl implements OrderRootsEnumerator { else if (type.equals(OrderRootType.CLASSES)) { final CompilerModuleExtension extension = rootModel.getModuleExtension(CompilerModuleExtension.class); if (extension != null) { - if (myWithoutSelfModuleOutput && myOrderEnumerator.isMainModuleModel(rootModel)) { + if (myWithoutSelfModuleOutput && myOrderEnumerator.isRootModuleModel(rootModel)) { if (!productionOnly) { Collections.addAll(result, extension.getOutputRootUrls(false)); } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectOrderEnumerator.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectOrderEnumerator.java index abe102f0a667..05fc05413a96 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectOrderEnumerator.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectOrderEnumerator.java @@ -18,6 +18,7 @@ package com.intellij.openapi.roots.impl; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ModuleRootModel; import com.intellij.openapi.roots.OrderEntry; import com.intellij.util.Processor; import gnu.trove.THashSet; @@ -55,4 +56,9 @@ public class ProjectOrderEnumerator extends OrderEnumeratorBase { } }); } + + @Override + public boolean isRootModuleModel(@NotNull ModuleRootModel rootModel) { + return true; + } }