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.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.jar.*; 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(); List<String> files = factory.files();
for (String file : files) { for (String file : files) {
File target = new File(outputDir, file); File target = new File(outputDirector.getOutputDirectory(factory.getSourceFiles(file)), file);
try { try {
FileUtil.writeToFile(target, factory.asBytes(file)); 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 // Used for debug output only
private static String loadModuleScriptText(String moduleScriptFile) { private static String loadModuleScriptText(String moduleScriptFile) {
String moduleScriptText; String moduleScriptText;
@@ -272,7 +293,7 @@ public class CompileEnvironmentUtil {
static void writeOutputToDirOrJar( static void writeOutputToDirOrJar(
@Nullable File jar, @Nullable File jar,
@Nullable File outputDir, @Nullable OutputDirector outputDir,
boolean includeRuntime, boolean includeRuntime,
@Nullable FqName mainClass, @Nullable FqName mainClass,
@NotNull ClassFileFactory factory, @NotNull ClassFileFactory factory,
@@ -283,7 +304,7 @@ public class CompileEnvironmentUtil {
} }
else if (outputDir != null) { else if (outputDir != null) {
reportOutputs(factory, messageCollector); reportOutputs(factory, messageCollector);
writeToOutputDirectory(factory, outputDir); writeToOutputWithDirector(factory, outputDir);
} }
else { else {
throw new CompileEnvironmentException("Output directory or jar file is not specified - no files will be saved to the disk"); 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( private static void writeOutput(
CompilerConfiguration configuration, CompilerConfiguration configuration,
ClassFileFactory moduleFactory, File outputDir, File jarPath, ClassFileFactory moduleFactory,
CompileEnvironmentUtil.OutputDirector outputDir,
File jarPath,
boolean jarRuntime, boolean jarRuntime,
FqName mainClass FqName mainClass
) { ) {
@@ -124,7 +126,7 @@ public class KotlinToJVMBytecodeCompiler {
public static boolean compileModules( public static boolean compileModules(
CompilerConfiguration configuration, CompilerConfiguration configuration,
@NotNull ModuleChunk modules, @NotNull final ModuleChunk modules,
@NotNull File directory, @NotNull File directory,
@Nullable File jarPath, @Nullable File jarPath,
boolean jarRuntime boolean jarRuntime
@@ -134,7 +136,20 @@ public class KotlinToJVMBytecodeCompiler {
if (moduleFactory == null) { if (moduleFactory == null) {
return false; 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); writeOutput(configuration, moduleFactory, outputDir, jarPath, jarRuntime, null);
} }
return true; return true;
@@ -171,7 +186,8 @@ public class KotlinToJVMBytecodeCompiler {
} }
try { 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; return true;
} }
finally { finally {
@@ -16,24 +16,39 @@
package org.jetbrains.jet.cli.jvm.compiler; package org.jetbrains.jet.cli.jvm.compiler;
import com.google.common.collect.Maps;
import jet.modules.Module; import jet.modules.Module;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map;
public class ModuleChunk { public class ModuleChunk {
public static final ModuleChunk EMPTY = new ModuleChunk(Collections.<Module>emptyList()); public static final ModuleChunk EMPTY = new ModuleChunk(Collections.<Module>emptyList());
private final List<Module> modules; private final List<Module> modules;
private final Map<File, Module> sourceFileToModule = Maps.newHashMap();
public ModuleChunk(@NotNull List<Module> modules) { public ModuleChunk(@NotNull List<Module> modules) {
this.modules = modules; this.modules = modules;
for (Module module : modules) {
for (String file : module.getSourceFiles()) {
sourceFileToModule.put(new File(file).getAbsoluteFile(), module);
}
}
} }
@NotNull @NotNull
public List<Module> getModules() { public List<Module> getModules() {
return modules; return modules;
} }
@Nullable
public Module findModuleBySourceFile(@NotNull File sourceFile) {
return sourceFileToModule.get(sourceFile.getAbsoluteFile());
}
} }