cherry pick directory structure from ic branch, refactor and document model.
diff --git a/kotlin/builder/integrationtests/KotlinBuilderActionTests.java b/kotlin/builder/integrationtests/KotlinBuilderActionTests.java
index 59b1fdb..a26c1a1 100644
--- a/kotlin/builder/integrationtests/KotlinBuilderActionTests.java
+++ b/kotlin/builder/integrationtests/KotlinBuilderActionTests.java
@@ -9,6 +9,6 @@
addSource("AClass.kt", "package something;" + "class AClass{}");
instance(KotlinCompiler.class).compile(builderCommand());
assertFileExists(DirectoryType.CLASSES, "something/AClass.class");
- assertFileDoesNotExist(outputs().getOutput());
+ assertFileDoesNotExist(outputs().getJar());
}
}
diff --git a/kotlin/builder/integrationtests/KotlinBuilderTestCase.java b/kotlin/builder/integrationtests/KotlinBuilderTestCase.java
index 01ed512..f1cc005 100644
--- a/kotlin/builder/integrationtests/KotlinBuilderTestCase.java
+++ b/kotlin/builder/integrationtests/KotlinBuilderTestCase.java
@@ -38,12 +38,16 @@
return builder.getOutputs();
}
+ protected KotlinModel.BuilderCommand.Directories directories() {
+ return builder.getDirectories();
+ }
+
protected String label() {
return Preconditions.checkNotNull(label);
}
private Path classDir() {
- return Paths.get(outputs().getClassDirectory());
+ return Paths.get(directories().getClasses());
}
protected KotlinModel.BuilderCommand builderCommand() {
@@ -55,7 +59,8 @@
}
protected void addSource(String filename, String... lines) {
- Path file = Preconditions.checkNotNull(inputSourceDir, "initialize test context").resolve(filename);
+ Path file =
+ Preconditions.checkNotNull(inputSourceDir, "initialize test context").resolve(filename);
try (BufferedWriter writer = com.google.common.io.Files.newWriter(file.toFile(), UTF_8)) {
writer.write(Joiner.on("\n").join(lines));
String f = file.toString();
@@ -74,10 +79,13 @@
protected void resetTestContext(String label) {
this.label = label;
+ Path prefixPath = Paths.get(label);
+
+ createTestOuputDirectory(prefixPath);
+ inputSourceDir = Paths.get(createTestOuputDirectory(prefixPath.resolve("input_sources")));
+
builder.clear();
- KotlinModel.BuilderCommand.Outputs.Builder testOuputs = setupTestOutputs(label);
- builder.setInfo(
- KotlinModel.BuilderCommand.Info.newBuilder()
+ builder.getInfoBuilder()
.setLabel("//some/bogus:" + label)
.setKotlinModuleName("some_bogus_module")
.setRuleKind("kt_jvm_library")
@@ -88,8 +96,17 @@
.setApiVersion("1.2")
.setCoroutines("enabled")
.setLanguageVersion("1.2"))
- .setJvm(KotlinModel.KotlinToolchainInfo.Jvm.newBuilder().setJvmTarget("1.8"))));
- builder.setOutputs(testOuputs);
+ .setJvm(KotlinModel.KotlinToolchainInfo.Jvm.newBuilder().setJvmTarget("1.8")));
+ builder
+ .getDirectoriesBuilder()
+ .setClasses(prefixPath.resolve("classes").toAbsolutePath().toString())
+ .setGeneratedSources(prefixPath.resolve("sources").toAbsolutePath().toString())
+ .setTemp(prefixPath.resolve("temp").toAbsolutePath().toString())
+ .setGeneratedClasses(prefixPath.resolve("generated_classes").toAbsolutePath().toString());
+ builder
+ .getOutputsBuilder()
+ .setJar(prefixPath.resolve("jar_file.jar").toAbsolutePath().toString())
+ .setJdeps(prefixPath.resolve("jdeps_files.jdeps").toAbsolutePath().toString());
}
private static String createTestOuputDirectory(Path path) {
@@ -108,21 +125,10 @@
}
}
- private KotlinModel.BuilderCommand.Outputs.Builder setupTestOutputs(String label) {
- Path prefixPath = Paths.get(label);
- createTestOuputDirectory(prefixPath);
- inputSourceDir = Paths.get(createTestOuputDirectory(prefixPath.resolve("input_sources")));
- return KotlinModel.BuilderCommand.Outputs.newBuilder()
- .setClassDirectory(prefixPath.resolve("classes").toAbsolutePath().toString())
- .setSourceGenDir(prefixPath.resolve("sources").toAbsolutePath().toString())
- .setTempDirectory(prefixPath.resolve("temp").toAbsolutePath().toString())
- .setOutputJdeps(prefixPath.resolve("jdeps_files.jdeps").toAbsolutePath().toString())
- .setOutput(prefixPath.resolve("jar_file.jar").toAbsolutePath().toString());
- }
-
protected enum DirectoryType {
ROOT,
CLASSES,
+ GENERATED_CLASSES,
TEMP,
SOURCE_GEN;
@@ -130,13 +136,16 @@
Path ret;
switch (type) {
case CLASSES:
- ret = Paths.get(command.getOutputs().getClassDirectory());
+ ret = Paths.get(command.getDirectories().getClasses());
+ break;
+ case GENERATED_CLASSES:
+ ret = Paths.get(command.getDirectories().getGeneratedClasses());
break;
case TEMP:
- ret = Paths.get(command.getOutputs().getTempDirectory());
+ ret = Paths.get(command.getDirectories().getTemp());
break;
case SOURCE_GEN:
- ret = Paths.get(command.getOutputs().getSourceGenDir());
+ ret = Paths.get(command.getDirectories().getGeneratedSources());
break;
default:
throw new RuntimeException("unhandled type: " + type);
diff --git a/kotlin/builder/integrationtests/KotlinBuilderTests.java b/kotlin/builder/integrationtests/KotlinBuilderTests.java
index 0d515e9..cb5aa62 100644
--- a/kotlin/builder/integrationtests/KotlinBuilderTests.java
+++ b/kotlin/builder/integrationtests/KotlinBuilderTests.java
@@ -3,11 +3,13 @@
import com.google.common.truth.Truth;
import com.google.devtools.build.lib.view.proto.Deps;
import io.bazel.kotlin.builder.mode.jvm.KotlinJvmCompilationExecutor;
+import io.bazel.kotlin.model.KotlinModel;
import org.junit.Test;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UncheckedIOException;
+import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
@@ -28,23 +30,33 @@
runCompileTask();
assertFileExists(DirectoryType.CLASSES, "something/AClass.class");
assertFileExists(DirectoryType.CLASSES, "something/AnotherClass.class");
- assertFileExists(outputs().getOutput());
+ assertFileExists(outputs().getJar());
}
private void runCompileTask() {
+ KotlinModel.BuilderCommand command = builderCommand();
+ for (DirectoryType directoryType : DirectoryType.values()) {
+ try {
+ if (directoryType != DirectoryType.ROOT) {
+ Files.createDirectories(DirectoryType.select(directoryType, command));
+ }
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ }
int timeoutSeconds = 10;
KotlinJvmCompilationExecutor executor = instance(KotlinJvmCompilationExecutor.class);
try {
- CompletableFuture.runAsync(() -> executor.compile(builderCommand()))
+ CompletableFuture.runAsync(() -> executor.compile(command))
.get(timeoutSeconds, TimeUnit.SECONDS);
} catch (TimeoutException e) {
throw new AssertionError("did not complete in: " + timeoutSeconds);
} catch (Exception e) {
throw new RuntimeException(e);
}
- assertFileExists(outputs().getOutput());
- assertFileExists(outputs().getOutputJdeps());
- try (FileInputStream fs = new FileInputStream(Paths.get(outputs().getOutputJdeps()).toFile())) {
+ assertFileExists(outputs().getJar());
+ assertFileExists(outputs().getJdeps());
+ try (FileInputStream fs = new FileInputStream(Paths.get(outputs().getJdeps()).toFile())) {
Deps.Dependencies dependencies = Deps.Dependencies.parseFrom(fs);
Truth.assertThat(dependencies.getRuleLabel()).endsWith(label());
} catch (IOException e) {
diff --git a/kotlin/builder/proto/jars/libkotlin_model_proto-speed.jar b/kotlin/builder/proto/jars/libkotlin_model_proto-speed.jar
index d44630c..943c343 100755
--- a/kotlin/builder/proto/jars/libkotlin_model_proto-speed.jar
+++ b/kotlin/builder/proto/jars/libkotlin_model_proto-speed.jar
Binary files differ
diff --git a/kotlin/builder/proto/kotlin_model.proto b/kotlin/builder/proto/kotlin_model.proto
index 8d27cd0..d1e4ced 100644
--- a/kotlin/builder/proto/kotlin_model.proto
+++ b/kotlin/builder/proto/kotlin_model.proto
@@ -17,32 +17,45 @@
option java_package = "io.bazel.kotlin.model";
+// An abstract definition of an annotation processor. This is encoded into a format understood by kapt3.
+// +stable
message AnnotationProcessor {
- // the annotation processor class
+ // The annotation processor class.
string processor_class = 1;
- // bazel `java_plugin` generates_api setting.
+ // The Bazel `java_plugin` `generates_api` attribute.
bool generates_api = 2;
- // the classpath
+ // The full transitive classpath required for annotation processing.
repeated string classpath = 3;
-
+ // The label of the plugin.
string label = 4;
}
+// A container for all of the types of compiler plugins needed by the kotlin compilers.
+// +stable
message CompilerPlugins {
+ // Regular java annotation_processor descriptors.
repeated AnnotationProcessor annotation_processors = 1;
}
+// Toolchain info this contains info to be used to configure the compile tasks as well as configuring certain features
+// in IDE plugins.
+// +stable
message KotlinToolchainInfo {
+ // Common properties that should be common to all platforms.
message Common {
// mandatory
string language_version = 1;
- //mandatory
+ // mandatory
string api_version = 2;
+ // mandatory
// oneof "enable", "warn" or "error"
string coroutines = 3;
}
+ // Properties specific to the JVM.
message Jvm {
+ // The property is additionally to configure the source and target bytecode levels in kapt3, javac and kotlin.
+ // mandatory
// oneof "1.6", or "1.8"
string jvm_target = 1;
}
@@ -51,6 +64,7 @@
Jvm jvm = 2;
}
+// Mested messages not marked with stable could be refactored.
message BuilderCommand {
message Info {
string label = 1;
@@ -67,44 +81,65 @@
CompilerPlugins plugins = 8;
- // derived from plugins
- repeated string encoded_plugin_descriptors=9;
+ // All of the plugin descriptors in the format kotlinc understands.
+ // +derived
+ repeated string encoded_plugin_descriptors = 9;
- // friend jars -- kotlin compiler allows internal visibility access to these jars. Used for tests.
+ // Jars that the kotlin compiler will allow package private access to.
repeated string friend_paths = 10;
}
- message Outputs {
- string class_directory = 1;
- string temp_directory = 2;
- string source_gen_dir = 3;
+ // Directories used by the builder.
+ // +stable
+ message Directories {
+ // The directory the compiler should use for class files.
+ string classes = 1;
+ // The directory to use by annotation processors to produce classes.
+ string generated_classes = 2;
+ // The directory used by annotation processors. The generated sources are currently only java.
+ string generated_sources = 3;
+ // A temp directory that the compiler may use. The source_jars are expanding into here.
+ string temp = 4;
+ }
- string output = 4;
- string output_jdeps = 5;
+ // Outputs produced by the builder.
+ // +stable
+ message Outputs {
+ // The path to the primary output jar.
+ string jar = 1;
+ // The path to the jdeps file.
+ string jdeps = 2;
}
message Inputs {
+ // The full classpath
repeated string classpath = 1;
- // derived from command line classpath
+ // The full joined classpath
+ // +derived
string joined_classpath = 2;
-
+ // Direct dependencies of the target.
map<string, string> direct_dependencies = 3;
+ // Indirect dependencies of the target.
map<string, string> indirect_dependencies = 4;
- // partitioned from builder flags
+ // Partitioned from the builder flags and by expanding the source_jars.
+ // +derived
repeated string kotlin_sources = 5;
- // partitioned from builder flags
+ // Partitioned from the builder flags and by expanding the source_jars.
+ // +derived
repeated string java_sources = 6;
-
- // created during compilation
+ // Created during annotation processing and partitioned from the generated_sources directory.
+ // +dervived
repeated string generated_kotlin_sources = 7;
- // created during compilation
+ // Created during annotation processing and partitioned from the generated_sources directory.
+ // +derived
repeated string generated_java_sources = 8;
-
+ // Jars containing additional sources.
repeated string source_jars = 9;
}
Info info = 1;
- Outputs outputs = 2;
- Inputs inputs = 3;
+ Directories directories = 2;
+ Outputs outputs = 3;
+ Inputs inputs = 4;
}
\ No newline at end of file
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/BuildCommandBuilder.kt b/kotlin/builder/src/io/bazel/kotlin/builder/BuildCommandBuilder.kt
index 9e69452..54302c1 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/BuildCommandBuilder.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/BuildCommandBuilder.kt
@@ -87,11 +87,15 @@
override fun fromInput(argMap: ArgMap): BuilderCommand =
BuilderCommand.newBuilder().let { root ->
with(root.outputsBuilder) {
- classDirectory = argMap.mandatorySingle(JavaBuilderFlags.CLASSDIR.flag)
- tempDirectory = argMap.mandatorySingle(JavaBuilderFlags.TEMPDIR.flag)
- sourceGenDir = argMap.mandatorySingle(JavaBuilderFlags.SOURCEGEN_DIR.flag)
- output = argMap.mandatorySingle(JavaBuilderFlags.OUTPUT.flag)
- outputJdeps = argMap.mandatorySingle("--output_jdeps")
+ jar = argMap.mandatorySingle(JavaBuilderFlags.OUTPUT.flag)
+ jdeps = argMap.mandatorySingle("--output_jdeps")
+ }
+
+ with(root.directoriesBuilder) {
+ classes = argMap.mandatorySingle(JavaBuilderFlags.CLASSDIR.flag)
+ generatedClasses = argMap.mandatorySingle("--kotlin_generated_classdir")
+ temp = argMap.mandatorySingle(JavaBuilderFlags.TEMPDIR.flag)
+ generatedSources = argMap.mandatorySingle(JavaBuilderFlags.SOURCEGEN_DIR.flag)
}
with(root.inputsBuilder) {
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt b/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt
index a5cda42..61431ba 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt
@@ -21,8 +21,8 @@
import io.bazel.kotlin.builder.mode.jvm.KotlinJvmCompilationExecutor
import io.bazel.kotlin.builder.utils.ArgMap
import io.bazel.kotlin.builder.utils.ArgMaps
+import io.bazel.kotlin.builder.utils.ensureDirectories
import io.bazel.kotlin.model.KotlinModel
-import java.nio.file.Files
import java.nio.file.Paths
@Singleton
@@ -39,7 +39,12 @@
commandBuilder.fromInput(args).let { execute(it) }
fun execute(command: KotlinModel.BuilderCommand): Int {
- ensureOutputDirectories(command)
+ ensureDirectories(
+ command.directories.classes,
+ command.directories.temp,
+ command.directories.generatedSources,
+ command.directories.generatedClasses
+ )
val updatedCommand = expandWithSourceJarSources(command)
return try {
compilationExector.compile(updatedCommand)
@@ -49,12 +54,6 @@
}
}
- private fun ensureOutputDirectories(command: KotlinModel.BuilderCommand) {
- Files.createDirectories(Paths.get(command.outputs.classDirectory))
- Files.createDirectories(Paths.get(command.outputs.tempDirectory))
- Files.createDirectories(Paths.get(command.outputs.sourceGenDir))
- }
-
/**
* If any sourcejars were provided expand the jars sources and create a new [KotlinModel.BuilderCommand] with the
* Java and Kotlin sources merged in.
@@ -64,7 +63,7 @@
command
} else {
val sourceUnpackDirectory =
- Paths.get(command.outputs.tempDirectory).let {
+ Paths.get(command.directories.temp).let {
it.resolve("_srcjars").toFile().let {
try {
it.mkdirs(); it
@@ -75,7 +74,8 @@
}
for (sourceJar in command.inputs.sourceJarsList) {
jarToolInvoker.invoke(
- listOf("xf", Paths.get(sourceJar).toAbsolutePath().toString()), sourceUnpackDirectory)
+ listOf("xf", Paths.get(sourceJar).toAbsolutePath().toString()), sourceUnpackDirectory
+ )
}
commandBuilder.withSources(
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/KotlinJvmCompilationExecutor.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/KotlinJvmCompilationExecutor.kt
index 6ce5a15..db1b42d 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/KotlinJvmCompilationExecutor.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/KotlinJvmCompilationExecutor.kt
@@ -21,7 +21,6 @@
import com.google.inject.Singleton
import io.bazel.kotlin.builder.BuildCommandBuilder
import io.bazel.kotlin.builder.CompilationStatusException
-import io.bazel.kotlin.builder.ToolException
import io.bazel.kotlin.builder.mode.jvm.KotlinJvmCompilationExecutor.Result
import io.bazel.kotlin.builder.mode.jvm.actions.JDepsGenerator
import io.bazel.kotlin.builder.mode.jvm.actions.JavaCompiler
@@ -67,7 +66,7 @@
try {
if (command.info.plugins.annotationProcessorsList.isNotEmpty()) {
kotlinCompiler.runAnnotationProcessor(command)
- File(command.outputs.sourceGenDir).walkTopDown()
+ File(command.directories.generatedSources).walkTopDown()
.filter { it.isFile }
.map { it.path }
.iterator()
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JDepsGenerator.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JDepsGenerator.kt
index 4c167a2..0bcc45f 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JDepsGenerator.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JDepsGenerator.kt
@@ -55,7 +55,7 @@
val res = invoker.run(
arrayOf(
"-cp", command.inputs.joinedClasspath,
- command.outputs.output),
+ command.outputs.jdeps),
writer)
out.toByteArray().inputStream().bufferedReader().readLines().let {
if (res != 0) {
@@ -64,7 +64,7 @@
try {
JdepsParser.parse(
command.info.label,
- command.outputs.output,
+ command.outputs.jdeps,
command.inputs.joinedClasspath,
it,
isKotlinImplicit
@@ -76,7 +76,7 @@
}
}
}
- Paths.get(command.outputs.outputJdeps).also {
+ Paths.get(command.outputs.jdeps).also {
Files.deleteIfExists(it)
FileOutputStream(Files.createFile(it).toFile()).use {
jdepsContent.writeTo(it)
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JavaCompiler.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JavaCompiler.kt
index b88f440..ee5df82 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JavaCompiler.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/JavaCompiler.kt
@@ -31,12 +31,12 @@
val javacInvoker: KotlinToolchain.JavacInvoker
) : JavaCompiler {
override fun compile(command: BuilderCommand) {
- val inputs = command.inputs
- val outputs = command.outputs
- if (inputs.javaSourcesList.isNotEmpty() || inputs.generatedJavaSourcesList.isNotEmpty()) {
+ val i = command.inputs
+ val d = command.directories
+ if (i.javaSourcesList.isNotEmpty() || i.generatedJavaSourcesList.isNotEmpty()) {
val args = mutableListOf(
- "-cp", "${outputs.classDirectory}/:${outputs.tempDirectory}/:${inputs.joinedClasspath}",
- "-d", outputs.classDirectory
+ "-cp", "${d.classes}/:${d.temp}/:${i.joinedClasspath}",
+ "-d", d.classes
).let {
it.addAll(
// Kotlin takes care of annotation processing.
@@ -46,8 +46,8 @@
"-source", command.info.toolchainInfo.jvm.jvmTarget,
"-target", command.info.toolchainInfo.jvm.jvmTarget
)
- it.addAll(inputs.javaSourcesList)
- it.addAll(inputs.generatedJavaSourcesList)
+ it.addAll(i.javaSourcesList)
+ it.addAll(i.generatedJavaSourcesList)
it.toTypedArray()
}
javacInvoker.compile(args).takeIf { it != 0 }?.also { throw CompilationStatusException("javac failed",it) }
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/KotlinCompiler.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/KotlinCompiler.kt
index dbff055..ffcf837 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/KotlinCompiler.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/KotlinCompiler.kt
@@ -71,7 +71,7 @@
args
.addAll("-module-name", command.info.kotlinModuleName)
- .addAll("-d", command.outputs.classDirectory)
+ .addAll("-d", command.directories.classes)
command.info.passthroughFlags?.takeIf { it.isNotBlank() }?.also { args.addAll(it.split(" ")) }
return args
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/OutputJarCreator.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/OutputJarCreator.kt
index 19aab9f..e46147b 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/OutputJarCreator.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/actions/OutputJarCreator.kt
@@ -33,9 +33,10 @@
private fun MutableList<String>.addAllFrom(dir: Path) = addAll(arrayOf("-C", dir.toString(), "."))
override fun createOutputJar(command: KotlinModel.BuilderCommand) {
mutableListOf(
- "cf", command.outputs.output
+ "cf", command.outputs.jar
).also { args ->
- args.addAllFrom(Paths.get(command.outputs.classDirectory))
+ args.addAllFrom(Paths.get(command.directories.classes))
+ args.addAllFrom(Paths.get(command.directories.generatedClasses))
}.let { toolInvoker.invoke(it) }
}
}
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/IOUtils.kt b/kotlin/builder/src/io/bazel/kotlin/builder/utils/IOUtils.kt
index 0eb34a3..9e9c70b 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/utils/IOUtils.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/utils/IOUtils.kt
@@ -20,6 +20,7 @@
import java.io.BufferedReader
import java.io.File
import java.io.PrintStream
+import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
import java.util.*
@@ -72,6 +73,11 @@
fun Path.verified(): File = this.toFile().also { check(it.exists()) { "file did not exist: $this" } }
+fun ensureDirectories(vararg directories: String) {
+ for (directory in directories) {
+ Files.createDirectories(Paths.get(directory))
+ }
+}
val Throwable.rootCause: Throwable
get() {
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/KotlinCompilerPluginArgsEncoder.kt b/kotlin/builder/src/io/bazel/kotlin/builder/utils/KotlinCompilerPluginArgsEncoder.kt
index 716107d..1d29c0a 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/utils/KotlinCompilerPluginArgsEncoder.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/utils/KotlinCompilerPluginArgsEncoder.kt
@@ -96,13 +96,13 @@
val javacArgs = mutableMapOf<String, String>(
"-target" to command.info.toolchainInfo.jvm.jvmTarget
)
-
+ val d = command.directories
return command.info.plugins.takeIf { it.annotationProcessorsList.isNotEmpty() }?.let { plugin ->
PluginArgs().let { arg ->
- arg["sources"] = command.outputs.sourceGenDir.toString()
- arg["classes"] = command.outputs.classDirectory.toString()
- arg["stubs"] = command.outputs.tempDirectory.toString()
- arg["incrementalData"] = command.outputs.tempDirectory.toString()
+ arg["sources"] = d.generatedSources.toString()
+ arg["classes"] = d.generatedClasses.toString()
+ arg["stubs"] = d.temp.toString()
+ arg["incrementalData"] = d.temp.toString()
arg["javacArguments"] = javacArgs.let(::encodeMap)
arg["aptMode"] = "stubsAndApt"
arg["correctErrorTypes"] = "true"
diff --git a/kotlin/internal/compile.bzl b/kotlin/internal/compile.bzl
index 9a02835..b444c16 100644
--- a/kotlin/internal/compile.bzl
+++ b/kotlin/internal/compile.bzl
@@ -15,6 +15,9 @@
load("//kotlin/internal:plugins.bzl", "plugins")
load("//kotlin/internal:utils.bzl", "utils")
+def _declare_output_directory(ctx, aspect, dir_name):
+ return ctx.actions.declare_directory("_kotlinc/%s_%s/%s_%s" % (ctx.label.name, aspect, ctx.label.name, dir_name))
+
def _kotlin_do_compile_action(ctx, rule_kind, output_jar, compile_jars, module_name, friend_paths, srcs, src_jars):
"""Internal macro that sets up a Kotlin compile action.
@@ -27,9 +30,11 @@
responsible for preparing the classpath. The stdlib (and jdk7 + jdk8) should generally be added to the classpath
by the caller -- kotlin-reflect could be optional.
"""
- classes_directory=ctx.actions.declare_directory(ctx.label.name + "_classes")
- sourcegen_directory=ctx.actions.declare_directory(ctx.label.name + "_sourcegendir")
- temp_directory=ctx.actions.declare_directory(ctx.label.name + "_tempdir")
+ classes_directory=_declare_output_directory(ctx, "jvm", "classes")
+ generated_classes_directory=_declare_output_directory(ctx, "jvm", "generated_classes")
+ sourcegen_directory=_declare_output_directory(ctx, "jvm", "sourcegenfiles")
+ temp_directory=_declare_output_directory(ctx, "jvm", "temp")
+
tc=ctx.toolchains[kt.defs.TOOLCHAIN_TYPE]
@@ -40,6 +45,7 @@
"--classdir", classes_directory.path,
"--sourcegendir", sourcegen_directory.path,
"--tempdir", temp_directory.path,
+ "--kotlin_generated_classdir", generated_classes_directory.path,
"--output", output_jar.path,
"--output_jdeps", ctx.outputs.jdeps.path,
@@ -83,7 +89,14 @@
ctx.action(
mnemonic = "KotlinCompile",
inputs = compile_inputs,
- outputs = [output_jar, ctx.outputs.jdeps, sourcegen_directory, classes_directory, temp_directory],
+ outputs = [
+ output_jar,
+ ctx.outputs.jdeps,
+ sourcegen_directory,
+ classes_directory,
+ temp_directory,
+ generated_classes_directory
+ ],
executable = ctx.executable._kotlinw,
execution_requirements = {"supports-workers": "1"},
arguments = ["@" + args_file.path],