From d5b08d4f1c43a01fd2715d0fa18507d085978701 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 9 Oct 2013 21:46:45 +0400 Subject: [PATCH] Support building many modules "as one": merging all the paths etc This is for a workaround implementation of support for mutually dependent modules --- .../jet/cli/jvm/compiler/ChunkAsOneModule.kt | 17 +++++++++++++++++ .../compiler/KotlinToJVMBytecodeCompiler.java | 18 +++++++++++++----- compiler/util/util.iml | 1 + 3 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/ChunkAsOneModule.kt diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/ChunkAsOneModule.kt b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/ChunkAsOneModule.kt new file mode 100644 index 00000000000..5640d20f3bc --- /dev/null +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/ChunkAsOneModule.kt @@ -0,0 +1,17 @@ +package org.jetbrains.jet.cli.jvm.compiler + +import jet.modules.Module + +class ChunkAsOneModule(private val chunk: ModuleChunk) : Module { + override fun getModuleName(): String = "chunk" + chunk.getModules().map { it.getModuleName() }.toString() + + override fun getOutputDirectory(): String { + throw UnsupportedOperationException("Each module in a chunk has its own output directory") + } + override fun getSourceFiles(): List = chunk.getModules().flatMap { it.getSourceFiles() } + + override fun getClasspathRoots(): List = chunk.getModules().flatMap { it.getClasspathRoots() } + + override fun getAnnotationsRoots(): List = chunk.getModules().flatMap { it.getAnnotationsRoots() } + +} \ No newline at end of file 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 524dc3872dc..efa6e3ccd65 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 @@ -63,17 +63,20 @@ import java.util.List; public class KotlinToJVMBytecodeCompiler { + private static final boolean COMPILE_CHUNK_AS_ONE_MODULE = true; + private KotlinToJVMBytecodeCompiler() { } @Nullable public static ClassFileFactory compileModule(CompilerConfiguration configuration, Module module, File directory) { - if (module.getSourceFiles().isEmpty()) { + List sourceFiles = module.getSourceFiles(); + if (sourceFiles.isEmpty()) { throw new CompileEnvironmentException("No source files where defined in module " + module.getModuleName()); } CompilerConfiguration compilerConfiguration = configuration.copy(); - for (String sourceFile : module.getSourceFiles()) { + for (String sourceFile : sourceFiles) { File source = new File(sourceFile); if (!source.isAbsolute()) { source = new File(directory, sourceFile); @@ -126,12 +129,16 @@ public class KotlinToJVMBytecodeCompiler { public static boolean compileModules( CompilerConfiguration configuration, - @NotNull final ModuleChunk modules, + @NotNull final ModuleChunk chunk, @NotNull File directory, @Nullable File jarPath, boolean jarRuntime ) { - for (Module module : modules.getModules()) { + List modules = chunk.getModules(); + if (COMPILE_CHUNK_AS_ONE_MODULE && modules.size() > 1) { + modules = Collections.singletonList(new ChunkAsOneModule(chunk)); + } + for (Module module : modules) { ClassFileFactory moduleFactory = compileModule(configuration, module, directory); if (moduleFactory == null) { return false; @@ -141,7 +148,8 @@ public class KotlinToJVMBytecodeCompiler { @Override public File getOutputDirectory(@NotNull Collection sourceFiles) { for (File sourceFile : sourceFiles) { - Module module = modules.findModuleBySourceFile(sourceFile); + // Note that here we track original modules: + Module module = chunk.findModuleBySourceFile(sourceFile); if (module != null) { return new File(module.getOutputDirectory()); } diff --git a/compiler/util/util.iml b/compiler/util/util.iml index e0712740581..fbfb9b47dd1 100644 --- a/compiler/util/util.iml +++ b/compiler/util/util.iml @@ -10,6 +10,7 @@ +