diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/JarFromModulesTemplate.java b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/JarFromModulesTemplate.java index b0fcd6390b24..bfce865fdd4a 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/JarFromModulesTemplate.java +++ b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/JarFromModulesTemplate.java @@ -19,7 +19,9 @@ import com.intellij.CommonBundle; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.*; +import com.intellij.openapi.roots.OrderEnumerator; +import com.intellij.openapi.roots.OrderRootType; +import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.io.FileUtil; @@ -29,9 +31,9 @@ import com.intellij.packaging.artifacts.ArtifactTemplate; import com.intellij.packaging.elements.*; import com.intellij.packaging.impl.elements.LibraryPackagingElement; import com.intellij.packaging.impl.elements.ManifestFileUtil; +import com.intellij.util.CommonProcessors; import com.intellij.util.PathUtil; import com.intellij.util.Processor; -import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; import org.jetbrains.annotations.Nullable; @@ -100,18 +102,14 @@ public class JarFromModulesTemplate extends ArtifactTemplate { if (!includeTests) { orderEnumerator = orderEnumerator.productionOnly(); } - orderEnumerator.using(myContext.getModulesProvider()).withoutSdk().runtimeOnly().recursively().forEach(new Processor() { + final OrderEnumerator enumerator = orderEnumerator.using(myContext.getModulesProvider()).withoutSdk().runtimeOnly().recursively(); + enumerator.forEachLibrary(new CommonProcessors.CollectProcessor(libraries)); + enumerator.forEachModule(new Processor() { @Override - public boolean process(OrderEntry orderEntry) { - if (orderEntry instanceof ModuleSourceOrderEntry) { - Module module = orderEntry.getOwnerModule(); - archive.addOrFindChild(factory.createModuleOutput(module)); - if (includeTests) { - archive.addOrFindChild(factory.createTestModuleOutput(module)); - } - } - else if (orderEntry instanceof LibraryOrderEntry) { - ContainerUtil.addIfNotNull(((LibraryOrderEntry)orderEntry).getLibrary(), libraries); + public boolean process(Module module) { + archive.addOrFindChild(factory.createModuleOutput(module)); + if (includeTests) { + archive.addOrFindChild(factory.createTestModuleOutput(module)); } return true; } 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 56c54f109960..50c2854ebff3 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 @@ -245,19 +245,9 @@ abstract class OrderEnumeratorBase extends OrderEnumerator implements OrderEnume if (myRecursively && entry instanceof ModuleOrderEntry) { ModuleOrderEntry moduleOrderEntry = (ModuleOrderEntry)entry; final Module module = moduleOrderEntry.getModule(); - if (module != null) { - boolean processRecursively = true; - for (OrderEnumerationHandler handler : myCustomHandlers) { - if (!handler.shouldProcessRecursively(moduleOrderEntry)) { - processRecursively = false; - break; - } - } - - if (processRecursively) { - processEntries(getRootModel(module), processor, processed, false); - continue; - } + if (module != null && shouldProcessRecursively(moduleOrderEntry)) { + processEntries(getRootModel(module), processor, processed, false); + continue; } } @@ -268,6 +258,17 @@ abstract class OrderEnumeratorBase extends OrderEnumerator implements OrderEnume } } + private boolean shouldProcessRecursively(ModuleOrderEntry moduleOrderEntry) { + boolean processRecursively = true; + for (OrderEnumerationHandler handler : myCustomHandlers) { + if (!handler.shouldProcessRecursively(moduleOrderEntry)) { + processRecursively = false; + break; + } + } + return processRecursively; + } + @Override public void forEachLibrary(@NotNull final Processor processor) { forEach(new Processor() { @@ -293,7 +294,7 @@ abstract class OrderEnumeratorBase extends OrderEnumerator implements OrderEnume final Module module = ((ModuleSourceOrderEntry)orderEntry).getRootModel().getModule(); return processor.process(module); } - else if (!myRecursively && orderEntry instanceof ModuleOrderEntry) { + else if (orderEntry instanceof ModuleOrderEntry && (!myRecursively || !shouldProcessRecursively((ModuleOrderEntry)orderEntry))) { final Module module = ((ModuleOrderEntry)orderEntry).getModule(); if (module != null) { return processor.process(module);