fix error rendering to console
diff --git a/kotlin/builder/integrationtests/KotlinBuilderTestCase.java b/kotlin/builder/integrationtests/KotlinBuilderTestCase.java
index 8e4b25d..01ed512 100644
--- a/kotlin/builder/integrationtests/KotlinBuilderTestCase.java
+++ b/kotlin/builder/integrationtests/KotlinBuilderTestCase.java
@@ -25,7 +25,7 @@
private final KotlinModel.BuilderCommand.Builder builder =
KotlinModel.BuilderCommand.newBuilder();
- private final Injector injector = KotlinToolchain.createInjector(System.out, null);
+ private final Injector injector = KotlinToolchain.createInjector(() -> System.out, null);
private String label = null;
private Path inputSourceDir = null;
diff --git a/kotlin/builder/integrationtests/KotlinBuilderTests.java b/kotlin/builder/integrationtests/KotlinBuilderTests.java
index f3d0b23..0d515e9 100644
--- a/kotlin/builder/integrationtests/KotlinBuilderTests.java
+++ b/kotlin/builder/integrationtests/KotlinBuilderTests.java
@@ -33,7 +33,7 @@
private void runCompileTask() {
int timeoutSeconds = 10;
- KotlinJvmCompilationExecutor executor= instance(KotlinJvmCompilationExecutor.class);
+ KotlinJvmCompilationExecutor executor = instance(KotlinJvmCompilationExecutor.class);
try {
CompletableFuture.runAsync(() -> executor.compile(builderCommand()))
.get(timeoutSeconds, TimeUnit.SECONDS);
@@ -44,7 +44,7 @@
}
assertFileExists(outputs().getOutput());
assertFileExists(outputs().getOutputJdeps());
- try(FileInputStream fs = new FileInputStream(Paths.get(outputs().getOutputJdeps()).toFile())) {
+ try (FileInputStream fs = new FileInputStream(Paths.get(outputs().getOutputJdeps()).toFile())) {
Deps.Dependencies dependencies = Deps.Dependencies.parseFrom(fs);
Truth.assertThat(dependencies.getRuleLabel()).endsWith(label());
} catch (IOException e) {
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/BazelWorker.kt b/kotlin/builder/src/io/bazel/kotlin/builder/BazelWorker.kt
index d839009..c2895fd 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/BazelWorker.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/BazelWorker.kt
@@ -26,25 +26,17 @@
sealed class ToolException(
msg: String,
- val category: Category,
ex: Throwable? = null
-) : RuntimeException(msg, ex) {
- enum class Category(val code: Int) {
- COMPILER_ERROR(1), // 1 is a standard compilation error
- INTERNAL(2),// 2 is an internal error
- SCRIPT(3)// 3 is the script execution error
- }
-}
+) : RuntimeException(msg, ex)
-class CompilationException(msg: String, cause: Throwable? = null, category: Category = Category.INTERNAL) :
- ToolException(msg, category, cause)
+class CompilationException(msg: String, cause: Throwable? = null) :
+ ToolException(msg, cause)
class CompilationStatusException(
msg: String,
val status: Int,
- val lines: List<String> = emptyList(),
- category: Category = Category.COMPILER_ERROR
-) : ToolException("$msg:${lines.joinToString("\n", "\n")}", category)
+ val lines: List<String> = emptyList()
+) : ToolException("$msg:${lines.joinToString("\n", "\n")}")
/**
@@ -85,9 +77,6 @@
companion object {
private const val INTERUPTED_STATUS = 0
private const val ERROR_STATUS = 1
-
- @JvmStatic
- val IS_DEBUG: Boolean = System.getProperty("bazel.kotlin.worker.debug") != null
}
override fun apply(args: List<String>): Int {
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt b/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt
index 7830d46..c610c2f 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt
@@ -17,6 +17,7 @@
import com.google.common.collect.ImmutableList
import com.google.inject.Inject
+import com.google.inject.Provider
import com.google.inject.Singleton
import io.bazel.kotlin.builder.mode.jvm.KotlinJvmCompilationExecutor
import io.bazel.kotlin.builder.utils.ArgMap
@@ -47,12 +48,9 @@
private fun doExecute(command: KotlinModel.BuilderCommand): Int {
return try {
compilationExector.compile(command)
- // gets basic timings on the tasks - create a better interface for this. and remove the line.
- // println(res.command.info.label + "\n" + res.timings.joinToString("\n"))
0
} catch (ex: CompilationStatusException) {
- ex.lines.forEach { println(it) }
- return ex.status
+ ex.status
}
}
@@ -101,7 +99,7 @@
companion object {
@JvmStatic
fun main(args: Array<String>) {
- val worker = KotlinToolchain.createInjector(System.err).getInstance(BazelWorker::class.java)
+ val worker = KotlinToolchain.createInjector(Provider { System.err }).getInstance(BazelWorker::class.java)
System.exit(worker.apply(args.toList()))
}
}
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinToolchain.kt b/kotlin/builder/src/io/bazel/kotlin/builder/KotlinToolchain.kt
index 9220c38..197810e 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinToolchain.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/KotlinToolchain.kt
@@ -39,12 +39,16 @@
companion object {
internal val NO_ARGS = arrayOf<Any>()
+ /**
+ * @param outputProvider A provider for the output stream to write to. A provider is used here as the System.err
+ * gets rebound when the worker is executing.
+ */
@JvmStatic
- fun createInjector(output: PrintStream, overrides: Module? = null): Injector =
+ fun createInjector(outputProvider: Provider<PrintStream>, overrides: Module? = null): Injector =
Guice.createInjector(
object : AbstractModule() {
override fun configure() {
- bind(PrintStream::class.java).toInstance(output)
+ bind(PrintStream::class.java).toProvider(outputProvider)
install(
KotlinToolchain.TCModule(
javaHome = Paths.get("external", "local_jdk"),
@@ -52,7 +56,7 @@
)
)
}
- }.let { module -> overrides?.let { Modules.override(module).with(it) }?: module }
+ }.let { module -> overrides?.let { Modules.override(module).with(it) } ?: module }
)
}
@@ -84,7 +88,7 @@
javaHome: Path,
kotlinHome: Path,
kotlinLibraryDirectory: Path = kotlinHome.resolveVerified("lib").toPath(),
- kapt3Jar: File= kotlinLibraryDirectory.resolveVerified("kotlin-annotation-processing.jar"),
+ kapt3Jar: File = kotlinLibraryDirectory.resolveVerified("kotlin-annotation-processing.jar"),
classloader: ClassLoader = ClassPreloadingUtils.preloadClasses(
mutableListOf<File>().let {
it.addAll(kotlinLibraryDirectory.verifiedRelativeFiles(Paths.get("kotlin-compiler.jar")))
@@ -95,7 +99,7 @@
Thread.currentThread().contextClassLoader,
null
)
- ): AbstractModule() {
+ ) : AbstractModule() {
private val toolchain = KotlinToolchain(kotlinHome)
private val kapt3 = CompilerPlugin(kapt3Jar.toString(), "org.jetbrains.kotlin.kapt3")
@@ -134,13 +138,8 @@
override fun compile(args: Array<String>, out: PrintStream): Int {
- val exitCodeInstance: Any
- try {
- exitCodeInstance = execMethod.invoke(compiler, out, args)
- return getCodeMethod.invoke(exitCodeInstance, *NO_ARGS) as Int
- } catch (e: Exception) {
- throw RuntimeException(e)
- }
+ val exitCodeInstance = execMethod.invoke(compiler, out, args)
+ return getCodeMethod.invoke(exitCodeInstance, *NO_ARGS) as Int
}
}
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 7887a2a..096ce49 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
@@ -20,6 +20,8 @@
import com.google.inject.Inject
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
@@ -74,15 +76,23 @@
}
private fun compileClasses(context: Context, command: BuilderCommand) {
- val result = context.execute("kotlinc") {
- kotlinCompiler.compile(command)
+ var kotlinError: CompilationStatusException? = null
+ var result: List<String>? = null
+ context.execute("kotlinc") {
+ result = try {
+ kotlinCompiler.compile(command)
+ } catch (ex: CompilationStatusException) {
+ kotlinError = ex
+ ex.lines
+ }
}
try {
context.execute("javac") {
javaCompiler.compile(command)
}
} finally {
- result.forEach(outputSink::deliver)
+ checkNotNull(result).also(outputSink::deliver)
+ kotlinError?.also { throw it }
}
}
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/utils/KotlinCompilerOutputSink.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/utils/KotlinCompilerOutputSink.kt
index 0958724..42ddf53 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/utils/KotlinCompilerOutputSink.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/utils/KotlinCompilerOutputSink.kt
@@ -17,6 +17,7 @@
import com.google.inject.ImplementedBy
import com.google.inject.Inject
+import com.google.inject.Provider
import java.io.File
import java.io.PrintStream
import java.nio.file.Paths
@@ -24,21 +25,26 @@
@ImplementedBy(DefaultOutputProcessorFactory::class)
interface KotlinCompilerOutputSink {
fun deliver(line: String)
+ fun deliver(lines: List<String>)
}
private class DefaultOutputProcessorFactory @Inject constructor(
- val stream: PrintStream
+ val streamProvider: Provider<PrintStream>
) : KotlinCompilerOutputSink {
private val executionRoot: String = Paths.get("").toAbsolutePath().toString() + File.separator
override fun deliver(line: String) {
- stream.println(trimExecutionRootPrefix(line))
+ streamProvider.get().println(trimExecutionRootPrefix(line))
+ }
+
+ override fun deliver(lines: List<String>) {
+ streamProvider.get().also { stream -> lines.map(::trimExecutionRootPrefix).forEach(stream::println) }
}
private fun trimExecutionRootPrefix(toPrint: String): String {
// trim off the workspace component
return if (toPrint.startsWith(executionRoot)) {
- toPrint.replaceFirst(executionRoot.toRegex(), "")
+ toPrint.replaceFirst(executionRoot, "")
} else toPrint
}
}