From 145559f58ce3ba69d1b5ed44445681ebbfad297f Mon Sep 17 00:00:00 2001 From: nik Date: Thu, 1 Jul 2010 11:39:10 +0400 Subject: [PATCH] java compiler migrated to new OrderEnumerator api, wrong OrderRootType constants deprecated --- .../impl/javaCompiler/ModuleChunk.java | 104 +++++++----------- .../com/intellij/util/JarClasspathHelper.java | 23 ++-- .../com/intellij/roots/OrderEntriesTest.java | 3 +- .../openapi/roots/OrderEnumerator.java | 4 + .../intellij/openapi/roots/OrderRootType.java | 21 ++++ .../src/com/intellij/util/PathsList.java | 21 ++-- 6 files changed, 98 insertions(+), 78 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/ModuleChunk.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/ModuleChunk.java index 4faa3870e213..af0956d66e1e 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/ModuleChunk.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/ModuleChunk.java @@ -25,13 +25,11 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.*; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.java.LanguageLevel; -import com.intellij.util.Chunk; -import com.intellij.util.JarClasspathHelper; -import com.intellij.util.PathUtil; -import com.intellij.util.StringBuilderSpinAllocator; +import com.intellij.util.*; import com.intellij.util.containers.OrderedSet; import gnu.trove.THashMap; import gnu.trove.TObjectHashingStrategy; @@ -194,28 +192,16 @@ public class ModuleChunk extends Chunk { public OrderedSet getCompilationClasspathFiles() { final Set modules = getNodes(); - final OrderedSet cpFiles = new OrderedSet(TObjectHashingStrategy.CANONICAL); + OrderedSet cpFiles = new OrderedSet(TObjectHashingStrategy.CANONICAL); for (final Module module : modules) { - - final OrderEntry[] orderEntries = ModuleRootManager.getInstance(module).getOrderEntries(); - boolean skip = true; - for (OrderEntry orderEntry : orderEntries) { - if (orderEntry instanceof JdkOrderEntry) { - skip = false; - continue; - } - if (skip) { - continue; - } - - VirtualFile[] files = orderEntry.getFiles((mySourcesFilter & TEST_SOURCES) == 0 ? OrderRootType.PRODUCTION_COMPILATION_CLASSES : OrderRootType.COMPILATION_CLASSES); - if (orderEntry instanceof ModuleOrderEntry) { - Project project = module.getProject(); - JarClasspathHelper.patchFiles(files, project); - } - cpFiles.addAll(Arrays.asList(files)); + OrderEnumerator enumerator = OrderEnumerator.orderEntries(module).compileOnly().satisfying(new AfterJdkOrderEntryCondition()); + if ((mySourcesFilter & TEST_SOURCES) == 0) { + enumerator = enumerator.productionOnly(); } + cpFiles.addAll(enumerator.recursively().exportedOnly().getClassesRoots()); } + cpFiles = JarClasspathHelper.patchFiles(cpFiles, myContext.getProject()); + return cpFiles; } @@ -228,52 +214,21 @@ public class ModuleChunk extends Chunk { final OrderedSet cpFiles = new OrderedSet(TObjectHashingStrategy.CANONICAL); final OrderedSet jdkFiles = new OrderedSet(TObjectHashingStrategy.CANONICAL); for (final Module module : modules) { - final OrderEntry[] orderEntries = ModuleRootManager.getInstance(module).getOrderEntries(); - for (OrderEntry orderEntry : orderEntries) { - if (orderEntry instanceof JdkOrderEntry) { - jdkFiles.addAll(Arrays.asList(orderEntry.getFiles(OrderRootType.CLASSES))); - break; - } - else { - if ((mySourcesFilter & TEST_SOURCES) == 0) { - cpFiles.addAll(Arrays.asList(orderEntry.getFiles(OrderRootType.PRODUCTION_COMPILATION_CLASSES))); - } - else { - cpFiles.addAll(Arrays.asList(orderEntry.getFiles(OrderRootType.COMPILATION_CLASSES))); - } - } + OrderEnumerator enumerator = OrderEnumerator.orderEntries(module).compileOnly().satisfying(new BeforeJdkOrderEntryCondition()); + if ((mySourcesFilter & TEST_SOURCES) == 0) { + enumerator = enumerator.productionOnly(); } + cpFiles.addAll(enumerator.recursively().exportedOnly().getClassesRoots()); + jdkFiles.addAll(OrderEnumerator.orderEntries(module).sdkOnly().getClassesRoots()); } cpFiles.addAll(jdkFiles); return cpFiles; } private static String convertToStringPath(final OrderedSet cpFiles) { - final StringBuilder classpathBuffer = StringBuilderSpinAllocator.alloc(); - try { - for (final VirtualFile file : cpFiles) { - final String path = PathUtil.getLocalPath(file); - //if (file.getFileSystem() instanceof LocalFileSystem && file.isDirectory()) { - // path = tryZipFor(file.getPath()); - //} - //else { - // path = PathUtil.getLocalPath(file); - //} - - if (path == null) { - continue; - } - if (classpathBuffer.length() > 0) { - classpathBuffer.append(File.pathSeparatorChar); - } - classpathBuffer.append(path); - } - - return classpathBuffer.toString(); - } - finally { - StringBuilderSpinAllocator.dispose(classpathBuffer); - } + PathsList classpath = new PathsList(); + classpath.addVirtualFiles(cpFiles); + return classpath.getPathsString(); } //private String tryZipFor(String outputDir) { @@ -327,4 +282,29 @@ public class ModuleChunk extends Chunk { public LanguageLevel getLanguageLevel() { return LanguageLevelUtil.getEffectiveLanguageLevel(getModules()[0]); } + + private static class BeforeJdkOrderEntryCondition implements Condition { + private boolean myJdkFound; + + @Override + public boolean value(OrderEntry orderEntry) { + if (orderEntry instanceof JdkOrderEntry) { + myJdkFound = true; + } + return !myJdkFound; + } + } + + private static class AfterJdkOrderEntryCondition implements Condition { + private boolean myJdkFound; + + @Override + public boolean value(OrderEntry orderEntry) { + if (orderEntry instanceof JdkOrderEntry) { + myJdkFound = true; + return false; + } + return myJdkFound; + } + } } diff --git a/java/java-impl/src/com/intellij/util/JarClasspathHelper.java b/java/java-impl/src/com/intellij/util/JarClasspathHelper.java index 41d0daff27b5..11d0ba91531a 100644 --- a/java/java-impl/src/com/intellij/util/JarClasspathHelper.java +++ b/java/java-impl/src/com/intellij/util/JarClasspathHelper.java @@ -17,29 +17,38 @@ package com.intellij.util; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.CompilerProjectExtension; +import com.intellij.openapi.roots.OrderEnumerator; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.containers.OrderedSet; +import gnu.trove.TObjectHashingStrategy; import org.jetbrains.annotations.Nullable; +import java.util.Collection; + /** * @author Dmitry Avdeev */ public class JarClasspathHelper { - public static void patchFiles(VirtualFile[] files, Project project) { + public static OrderedSet patchFiles(OrderedSet files, Project project) { if (!Registry.is("jar.build")) { - return; + return files; } String path = getJarsPath(project); - for (int i = 0, filesLength = files.length; i < filesLength; i++) { - VirtualFile file = files[i]; - + final OrderedSet result = new OrderedSet(TObjectHashingStrategy.CANONICAL); + final Collection modulesOutputs = OrderEnumerator.orderEntries(project).withoutLibraries().withoutSdk().getClassesRoots(); + for (VirtualFile file : files) { VirtualFile jar = getJarFile(path, file.getName()); - if (jar != null) { - files[i] = jar; + if (modulesOutputs.contains(file) && jar != null) { + result.add(jar); + } + else { + result.add(file); } } + return result; } @Nullable diff --git a/java/java-tests/testSrc/com/intellij/roots/OrderEntriesTest.java b/java/java-tests/testSrc/com/intellij/roots/OrderEntriesTest.java index f9412ed323ec..09bbd3a86726 100644 --- a/java/java-tests/testSrc/com/intellij/roots/OrderEntriesTest.java +++ b/java/java-tests/testSrc/com/intellij/roots/OrderEntriesTest.java @@ -11,6 +11,7 @@ import com.intellij.util.PathsList; /** * @author nik */ +@SuppressWarnings({"deprecation"}) public class OrderEntriesTest extends ModuleRootManagerTestCase { public void testLibrary() throws Exception { addLibraryDependency(myModule, createJDomLibrary()); @@ -92,7 +93,7 @@ public class OrderEntriesTest extends ModuleRootManagerTestCase { private PathsList collectByOrderEnumerator(OrderRootType type) { final OrderEnumerator base = OrderEnumerator.orderEntries(myModule); if (type == OrderRootType.CLASSES_AND_OUTPUT) { - return base.recursively().getPathsList(); + return base.compileOnly().recursively().getPathsList(); } if (type == OrderRootType.COMPILATION_CLASSES) { return base.recursively().exportedOnly().getPathsList(); 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 c2e661cfe31a..d8d31261e9de 100644 --- a/platform/lang-api/src/com/intellij/openapi/roots/OrderEnumerator.java +++ b/platform/lang-api/src/com/intellij/openapi/roots/OrderEnumerator.java @@ -69,6 +69,10 @@ public abstract class OrderEnumerator { return withoutSdk().withoutDepModules().withoutModuleSourceEntries(); } + public OrderEnumerator sdkOnly() { + return withoutDepModules().withoutLibraries().withoutModuleSourceEntries(); + } + /** * Recursively process modules on which the module depends * @return this instance 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 0d6eeeb1759a..89ba5963de88 100644 --- a/platform/lang-api/src/com/intellij/openapi/roots/OrderRootType.java +++ b/platform/lang-api/src/com/intellij/openapi/roots/OrderRootType.java @@ -44,6 +44,13 @@ public class OrderRootType { *
  • production and test output for modules *
  • classes roots for libraries and jdk unless scope is 'provided' *
  • recursively for module dependencies with scope != 'provided' + * + * @deprecated + *
      + *
    • for libraries and jdk use {@link #CLASSES} + *
    • to get module output roots use {@link CompilerModuleExtension#getOutputRoots}(true) + *
    • to recursively process module dependencies use OrderEnumerator.orderEntries(module).compileOnly().recursively() + *
    */ public static final OrderRootType CLASSES_AND_OUTPUT = new OrderRootType("CLASSES_AND_OUTPUT"); @@ -53,6 +60,13 @@ public class OrderRootType { *
  • production and test output for modules *
  • classes roots for libraries and jdk *
  • recursively for module dependencies: only exported items + + * @deprecated + *
      + *
    • for libraries and jdk use {@link #CLASSES} + *
    • to get module output roots use {@link CompilerModuleExtension#getOutputRoots}(true) + *
    • to recursively process module dependencies use OrderEnumerator.orderEntries(module).recursively().exportedOnly() + *
    */ public static final OrderRootType COMPILATION_CLASSES = new OrderRootType("COMPILATION_CLASSES"); @@ -62,6 +76,13 @@ public class OrderRootType { *
  • production output for modules *
  • 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 + + * @deprecated + *
      + *
    • for libraries and jdk use {@link #CLASSES} + *
    • to get module output root use {@link CompilerModuleExtension#getCompilerOutputPath()} + *
    • to recursively process module dependencies use OrderEnumerator.orderEntries(module).compileOnly().productionOnly().recursively().exportedOnly() + *
    */ public static final OrderRootType PRODUCTION_COMPILATION_CLASSES = new OrderRootType("PRODUCTION_COMPILATION_CLASSES"); diff --git a/platform/lang-api/src/com/intellij/util/PathsList.java b/platform/lang-api/src/com/intellij/util/PathsList.java index d82293fc7747..f7db0388fefe 100644 --- a/platform/lang-api/src/com/intellij/util/PathsList.java +++ b/platform/lang-api/src/com/intellij/util/PathsList.java @@ -123,15 +123,20 @@ public class PathsList { } public String getPathsString() { - final StringBuffer buffer = new StringBuffer(); - String separator = ""; - final List classPath = getPathList(); - for (final String path : classPath) { - buffer.append(separator); - buffer.append(path); - separator = File.pathSeparator; + final StringBuilder buffer = StringBuilderSpinAllocator.alloc(); + try { + String separator = ""; + final List classPath = getPathList(); + for (final String path : classPath) { + buffer.append(separator); + buffer.append(path); + separator = File.pathSeparator; + } + return buffer.toString(); + } + finally { + StringBuilderSpinAllocator.dispose(buffer); } - return buffer.toString(); } public List getPathList() {