Ability to direct output of different modules to different directories
This commit is contained in:
@@ -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");
|
||||||
|
|||||||
+20
-4
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user