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.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");
|
||||
|
||||
+20
-4
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user