diff --git a/java/java-impl/src/com/intellij/openapi/roots/impl/CompilerModuleExtensionImpl.java b/java/java-impl/src/com/intellij/openapi/roots/impl/CompilerModuleExtensionImpl.java index c2942aefeae0..07493a68eeba 100644 --- a/java/java-impl/src/com/intellij/openapi/roots/impl/CompilerModuleExtensionImpl.java +++ b/java/java-impl/src/com/intellij/openapi/roots/impl/CompilerModuleExtensionImpl.java @@ -300,13 +300,15 @@ public class CompilerModuleExtensionImpl extends CompilerModuleExtension { OrderRootType.COMPILATION_CLASSES.equals(type) || OrderRootType.PRODUCTION_COMPILATION_CLASSES.equals(type)) { final ArrayList result = new ArrayList(); + + final VirtualFile outputPathForTests = OrderRootType.PRODUCTION_COMPILATION_CLASSES.equals(type) ? null : getCompilerOutputPathForTests(); + if (outputPathForTests != null) { + result.add(outputPathForTests); + } + VirtualFile outputRoot = getCompilerOutputPath(); - if (outputRoot != null) result.add(outputRoot); - if (!OrderRootType.PRODUCTION_COMPILATION_CLASSES.equals(type)) { - final VirtualFile outputPathForTests = getCompilerOutputPathForTests(); - if (outputPathForTests != null && !outputPathForTests.equals(outputRoot)) { - result.add(outputPathForTests); - } + if (outputRoot != null && !outputRoot.equals(outputPathForTests)) { + result.add(outputRoot); } return VfsUtil.toVirtualFileArray(result); } @@ -319,13 +321,15 @@ public class CompilerModuleExtensionImpl extends CompilerModuleExtension { OrderRootType.COMPILATION_CLASSES.equals(type) || OrderRootType.PRODUCTION_COMPILATION_CLASSES.equals(type)) { final List result = new ArrayList(); + + final String outputPathForTests = OrderRootType.PRODUCTION_COMPILATION_CLASSES.equals(type) ? null : getCompilerOutputUrlForTests(); + if (outputPathForTests != null) { + result.add(outputPathForTests); + } + String outputRoot = getCompilerOutputUrl(); - if (outputRoot != null) result.add(outputRoot); - if (!OrderRootType.PRODUCTION_COMPILATION_CLASSES.equals(type)) { - final String outputPathForTests = getCompilerOutputUrlForTests(); - if (outputPathForTests != null && !outputPathForTests.equals(outputRoot)) { - result.add(outputPathForTests); - } + if (outputRoot != null && !outputRoot.equals(outputPathForTests)) { + result.add(outputRoot); } return ArrayUtil.toStringArray(result); } diff --git a/java/java-tests/testSrc/com/intellij/roots/OrderEntriesTest.java b/java/java-tests/testSrc/com/intellij/roots/OrderEntriesTest.java index 97c57ddf1c2f..bb36326f98f8 100644 --- a/java/java-tests/testSrc/com/intellij/roots/OrderEntriesTest.java +++ b/java/java-tests/testSrc/com/intellij/roots/OrderEntriesTest.java @@ -3,9 +3,10 @@ package com.intellij.roots; import com.intellij.openapi.module.Module; import com.intellij.openapi.roots.DependencyScope; import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.OrderEnumerator; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.roots.ModuleRootManagerTestCase; +import com.intellij.util.PathsList; /** * @author nik @@ -28,8 +29,8 @@ public class OrderEntriesTest extends ModuleRootManagerTestCase { assertOrderFiles(OrderRootType.CLASSES, getRtJar()); assertOrderFiles(OrderRootType.SOURCES, srcRoot, testRoot); - assertOrderFiles(OrderRootType.CLASSES_AND_OUTPUT, getRtJar(), output, testOutput); - assertOrderFiles(OrderRootType.COMPILATION_CLASSES, getRtJar(), output, testOutput); + assertOrderFiles(OrderRootType.CLASSES_AND_OUTPUT, getRtJar(), testOutput, output); + assertOrderFiles(OrderRootType.COMPILATION_CLASSES, getRtJar(), testOutput, output); assertOrderFiles(OrderRootType.PRODUCTION_COMPILATION_CLASSES, getRtJar(), output); } @@ -54,8 +55,8 @@ public class OrderEntriesTest extends ModuleRootManagerTestCase { assertOrderFiles(OrderRootType.CLASSES, getRtJar(), getJDomJar()); assertOrderFiles(OrderRootType.SOURCES, srcRoot, testRoot, getJDomSources()); - assertOrderFiles(OrderRootType.CLASSES_AND_OUTPUT, getRtJar(), output, testOutput, getJDomJar()); - assertOrderFiles(OrderRootType.COMPILATION_CLASSES, getRtJar(), output, testOutput, getJDomJar()); + assertOrderFiles(OrderRootType.CLASSES_AND_OUTPUT, getRtJar(), testOutput, output, getJDomJar()); + assertOrderFiles(OrderRootType.COMPILATION_CLASSES, getRtJar(), testOutput, output, getJDomJar()); assertOrderFiles(OrderRootType.PRODUCTION_COMPILATION_CLASSES, getRtJar(), output, getJDomJar()); } @@ -85,6 +86,27 @@ public class OrderEntriesTest extends ModuleRootManagerTestCase { private void assertOrderFiles(final OrderRootType type, VirtualFile... files) { assertOrderedEquals(ModuleRootManager.getInstance(myModule).getFiles(type), files); + assertRoots(collectByOrderEnumerator(type), files); + } + + private PathsList collectByOrderEnumerator(OrderRootType type) { + final OrderEnumerator base = OrderEnumerator.orderEntries(myModule); + if (type == OrderRootType.CLASSES_AND_OUTPUT) { + return base.recursively().getPathsList(); + } + if (type == OrderRootType.COMPILATION_CLASSES) { + return base.recursively().exportedOnly().getPathsList(); + } + if (type == OrderRootType.PRODUCTION_COMPILATION_CLASSES) { + return base.productionOnly().recursively().exportedOnly().getPathsList(); + } + if (type == OrderRootType.CLASSES) { + return base.withoutModuleSourceEntries().recursively().exportedOnly().getPathsList(); + } + if (type == OrderRootType.SOURCES) { + return base.recursively().exportedOnly().getSourcePathsList(); + } + throw new AssertionError(type); } } diff --git a/platform/lang-api/src/com/intellij/openapi/roots/OrderRootType.java b/platform/lang-api/src/com/intellij/openapi/roots/OrderRootType.java index a73508064e04..0d6eeeb1759a 100644 --- a/platform/lang-api/src/com/intellij/openapi/roots/OrderRootType.java +++ b/platform/lang-api/src/com/intellij/openapi/roots/OrderRootType.java @@ -42,7 +42,7 @@ public class OrderRootType { * Runtime classpath. * Includes: *
  • production and test output for modules - *
  • classes roots for libraries unless scope is 'provided' + *
  • classes roots for libraries and jdk unless scope is 'provided' *
  • recursively for module dependencies with scope != 'provided' */ public static final OrderRootType CLASSES_AND_OUTPUT = new OrderRootType("CLASSES_AND_OUTPUT"); @@ -51,7 +51,7 @@ public class OrderRootType { * Classpath for compilation. * Includes: *
  • production and test output for modules - *
  • classes roots for libraries + *
  • classes roots for libraries and jdk *
  • recursively for module dependencies: only exported items */ public static final OrderRootType COMPILATION_CLASSES = new OrderRootType("COMPILATION_CLASSES"); @@ -60,7 +60,7 @@ public class OrderRootType { * Classpath for compilation without tests. * Includes: *
  • production output for modules - *
  • classes roots for libraries with scope suitable for production compile + *
  • classes roots for libraries and jdk with scope suitable for production compile *
  • recursively for module dependencies with scope suitable for production compile: only exported items */ public static final OrderRootType PRODUCTION_COMPILATION_CLASSES = new OrderRootType("PRODUCTION_COMPILATION_CLASSES"); @@ -68,7 +68,7 @@ public class OrderRootType { /** * Classpath without output directories for this module. * Includes: - *
  • classes roots for libraries + *
  • classes roots for libraries and jdk *
  • recursively for module dependencies: only exported items */ public static final OrderRootType CLASSES = new PersistentOrderRootType("CLASSES", "classPath", null, "classPathEntry"); @@ -77,6 +77,7 @@ public class OrderRootType { * Sources. * Includes: *
  • production and test source roots for modules + *
  • source roots for libraries and jdk *
  • recursively for module dependencies: only exported items */ public static final OrderRootType SOURCES = new PersistentOrderRootType("SOURCES", "sourcePath", null, "sourcePathEntry");