Ability to direct output of different modules to different directories

This commit is contained in:
Andrey Breslav
2013-10-09 21:29:54 +04:00
parent 2a8ebc7dbe
commit 68e2e9b4fc
3 changed files with 60 additions and 8 deletions
@@ -48,6 +48,7 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.jar.*;
@@ -245,10 +246,26 @@ public class CompileEnvironmentUtil {
}
}
public static void writeToOutputDirectory(ClassFileFactory factory, @NotNull File outputDir) {
public interface OutputDirector {
@NotNull
File getOutputDirectory(@NotNull Collection<File> sourceFiles);
}
public static OutputDirector singleDirectory(@Nullable final File file) {
if (file == null) return null;
return new OutputDirector() {
@NotNull
@Override
public File getOutputDirectory(@NotNull Collection<File> sourceFiles) {
return file;
}
};
}
public static void writeToOutputWithDirector(ClassFileFactory factory, @NotNull OutputDirector outputDirector) {
List<String> files = factory.files();
for (String file : files) {
File target = new File(outputDir, file);
File target = new File(outputDirector.getOutputDirectory(factory.getSourceFiles(file)), file);
try {
FileUtil.writeToFile(target, factory.asBytes(file));
}
@@ -258,6 +275,10 @@ public class CompileEnvironmentUtil {
}
}
public static void writeToOutputDirectory(ClassFileFactory factory, @NotNull File outputDir) {
writeToOutputWithDirector(factory, singleDirectory(outputDir));
}
// Used for debug output only
private static String loadModuleScriptText(String moduleScriptFile) {
String moduleScriptText;
@@ -272,7 +293,7 @@ public class CompileEnvironmentUtil {
static void writeOutputToDirOrJar(
@Nullable File jar,
@Nullable File outputDir,
@Nullable OutputDirector outputDir,
boolean includeRuntime,
@Nullable FqName mainClass,
@NotNull ClassFileFactory factory,
@@ -283,7 +304,7 @@ public class CompileEnvironmentUtil {
}
else if (outputDir != null) {
reportOutputs(factory, messageCollector);
writeToOutputDirectory(factory, outputDir);
writeToOutputWithDirector(factory, outputDir);
}
else {
throw new CompileEnvironmentException("Output directory or jar file is not specified - no files will be saved to the disk");
@@ -114,7 +114,9 @@ public class KotlinToJVMBytecodeCompiler {
private static void writeOutput(
CompilerConfiguration configuration,
ClassFileFactory moduleFactory, File outputDir, File jarPath,
ClassFileFactory moduleFactory,
CompileEnvironmentUtil.OutputDirector outputDir,
File jarPath,
boolean jarRuntime,
FqName mainClass
) {
@@ -124,7 +126,7 @@ public class KotlinToJVMBytecodeCompiler {
public static boolean compileModules(
CompilerConfiguration configuration,
@NotNull ModuleChunk modules,
@NotNull final ModuleChunk modules,
@NotNull File directory,
@Nullable File jarPath,
boolean jarRuntime
@@ -134,7 +136,20 @@ public class KotlinToJVMBytecodeCompiler {
if (moduleFactory == null) {
return false;
}
File outputDir = new File(moduleBuilder.getOutputDirectory());
CompileEnvironmentUtil.OutputDirector outputDir = new CompileEnvironmentUtil.OutputDirector() {
@NotNull
@Override
public File getOutputDirectory(@NotNull Collection<File> sourceFiles) {
for (File sourceFile : sourceFiles) {
Module module = modules.findModuleBySourceFile(sourceFile);
if (module != null) {
return new File(module.getOutputDirectory());
}
}
throw new IllegalStateException("No module found for source files: " + sourceFiles);
}
};
writeOutput(configuration, moduleFactory, outputDir, jarPath, jarRuntime, null);
}
return true;
@@ -171,7 +186,8 @@ public class KotlinToJVMBytecodeCompiler {
}
try {
writeOutput(environment.getConfiguration(), generationState.getFactory(), outputDir, jar, includeRuntime, mainClass);
CompileEnvironmentUtil.OutputDirector outputDirector = CompileEnvironmentUtil.singleDirectory(outputDir);
writeOutput(environment.getConfiguration(), generationState.getFactory(), outputDirector, jar, includeRuntime, mainClass);
return true;
}
finally {
@@ -16,24 +16,39 @@
package org.jetbrains.jet.cli.jvm.compiler;
import com.google.common.collect.Maps;
import jet.modules.Module;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class ModuleChunk {
public static final ModuleChunk EMPTY = new ModuleChunk(Collections.<Module>emptyList());
private final List<Module> modules;
private final Map<File, Module> sourceFileToModule = Maps.newHashMap();
public ModuleChunk(@NotNull List<Module> modules) {
this.modules = modules;
for (Module module : modules) {
for (String file : module.getSourceFiles()) {
sourceFileToModule.put(new File(file).getAbsoluteFile(), module);
}
}
}
@NotNull
public List<Module> getModules() {
return modules;
}
@Nullable
public Module findModuleBySourceFile(@NotNull File sourceFile) {
return sourceFileToModule.get(sourceFile.getAbsoluteFile());
}
}