From 68e2e9b4fc6b880c1defca7702bd95708412357f Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 9 Oct 2013 21:29:54 +0400 Subject: [PATCH] Ability to direct output of different modules to different directories --- .../jvm/compiler/CompileEnvironmentUtil.java | 29 ++++++++++++++++--- .../compiler/KotlinToJVMBytecodeCompiler.java | 24 ++++++++++++--- .../jet/cli/jvm/compiler/ModuleChunk.java | 15 ++++++++++ 3 files changed, 60 insertions(+), 8 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java index 2fa4f1c6dae..30ae6ccd1a0 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java @@ -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 sourceFiles); + } + + public static OutputDirector singleDirectory(@Nullable final File file) { + if (file == null) return null; + return new OutputDirector() { + @NotNull + @Override + public File getOutputDirectory(@NotNull Collection sourceFiles) { + return file; + } + }; + } + + public static void writeToOutputWithDirector(ClassFileFactory factory, @NotNull OutputDirector outputDirector) { List 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"); diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java index 2f89e48af9a..fbb51f8f45a 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java @@ -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 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 { diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/ModuleChunk.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/ModuleChunk.java index 27a4931ba0b..b7aee97b5b3 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/ModuleChunk.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/ModuleChunk.java @@ -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.emptyList()); private final List modules; + private final Map sourceFileToModule = Maps.newHashMap(); public ModuleChunk(@NotNull List modules) { this.modules = modules; + for (Module module : modules) { + for (String file : module.getSourceFiles()) { + sourceFileToModule.put(new File(file).getAbsoluteFile(), module); + } + } } @NotNull public List getModules() { return modules; } + + @Nullable + public Module findModuleBySourceFile(@NotNull File sourceFile) { + return sourceFileToModule.get(sourceFile.getAbsoluteFile()); + } }