IDEA-87710: Cannot build artifact with "module production output" if module doesn't have production code

This commit is contained in:
nik
2012-06-22 14:06:40 +04:00
parent bb0555402e
commit ee0b0d2157
4 changed files with 27 additions and 33 deletions
@@ -23,6 +23,7 @@ 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.roots.ui.configuration.ModulesProvider;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
@@ -30,6 +31,8 @@ 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.packaging.impl.elements.ProductionModuleOutputElementType;
import com.intellij.packaging.impl.elements.TestModuleOutputElementType;
import com.intellij.util.CommonProcessors;
import com.intellij.util.PathUtil;
import com.intellij.util.Processor;
@@ -101,13 +104,16 @@ public class JarFromModulesTemplate extends ArtifactTemplate {
if (!includeTests) {
orderEnumerator = orderEnumerator.productionOnly();
}
final OrderEnumerator enumerator = orderEnumerator.using(myContext.getModulesProvider()).withoutSdk().runtimeOnly().recursively();
final ModulesProvider modulesProvider = myContext.getModulesProvider();
final OrderEnumerator enumerator = orderEnumerator.using(modulesProvider).withoutSdk().runtimeOnly().recursively();
enumerator.forEachLibrary(new CommonProcessors.CollectProcessor<Library>(libraries));
enumerator.forEachModule(new Processor<Module>() {
@Override
public boolean process(Module module) {
archive.addOrFindChild(factory.createModuleOutput(module));
if (includeTests) {
if (ProductionModuleOutputElementType.ELEMENT_TYPE.isSuitableModule(modulesProvider, module)) {
archive.addOrFindChild(factory.createModuleOutput(module));
}
if (includeTests && TestModuleOutputElementType.ELEMENT_TYPE.isSuitableModule(modulesProvider, module)) {
archive.addOrFindChild(factory.createTestModuleOutput(module));
}
return true;
@@ -20,6 +20,7 @@ import com.intellij.openapi.module.ModulePointer;
import com.intellij.openapi.module.ModulePointerManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectBundle;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.elements.CompositePackagingElement;
import com.intellij.packaging.elements.PackagingElement;
@@ -59,5 +60,16 @@ public abstract class ModuleOutputElementTypeBase<E extends ModuleOutputPackagin
protected abstract ModuleOutputPackagingElementBase createElement(@NotNull Project project, @NotNull ModulePointer pointer);
protected abstract List<Module> getSuitableModules(ArtifactEditorContext context);
private List<Module> getSuitableModules(ArtifactEditorContext context) {
ModulesProvider modulesProvider = context.getModulesProvider();
ArrayList<Module> modules = new ArrayList<Module>();
for (Module module : modulesProvider.getModules()) {
if (isSuitableModule(modulesProvider, module)) {
modules.add(module);
}
}
return modules;
}
public abstract boolean isSuitableModule(ModulesProvider modulesProvider, Module module);
}
@@ -21,12 +21,9 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModulePointer;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.packaging.ui.ArtifactEditorContext;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author nik
@@ -52,14 +49,8 @@ public class ProductionModuleOutputElementType extends ModuleOutputElementTypeBa
return AllIcons.Nodes.ModuleOpen;
}
protected List<Module> getSuitableModules(ArtifactEditorContext context) {
ArrayList<Module> modules = new ArrayList<Module>();
ModulesProvider modulesProvider = context.getModulesProvider();
for (Module module : modulesProvider.getModules()) {
if (modulesProvider.getRootModel(module).getSourceRootUrls(false).length > 0) {
modules.add(module);
}
}
return modules;
@Override
public boolean isSuitableModule(ModulesProvider modulesProvider, Module module) {
return modulesProvider.getRootModel(module).getSourceRootUrls(false).length > 0;
}
}
@@ -20,16 +20,12 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModulePointer;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ModuleRootModel;
import com.intellij.openapi.roots.SourceFolder;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.packaging.ui.ArtifactEditorContext;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author nik
@@ -56,19 +52,8 @@ public class TestModuleOutputElementType extends ModuleOutputElementTypeBase<Tes
return PlatformIcons.TEST_SOURCE_FOLDER;
}
protected List<Module> getSuitableModules(ArtifactEditorContext context) {
ModulesProvider modulesProvider = context.getModulesProvider();
ArrayList<Module> modules = new ArrayList<Module>();
for (Module module : modulesProvider.getModules()) {
if (hasTestSourceRoots(modulesProvider.getRootModel(module))) {
modules.add(module);
}
}
return modules;
}
private static boolean hasTestSourceRoots(final ModuleRootModel rootModel) {
for (ContentEntry entry : rootModel.getContentEntries()) {
public boolean isSuitableModule(ModulesProvider modulesProvider, Module module) {
for (ContentEntry entry : modulesProvider.getRootModel(module).getContentEntries()) {
for (SourceFolder folder : entry.getSourceFolders()) {
if (folder.isTestSource()) return true;
}