Print BTAPI compiler errors and diagnostics to stderr stream (#1679)
- compiler errors and warnings were not printed to the stderr as they should
- run BTAPI compiler with '-verbose' flag if tracing is enabled
diff --git a/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/CompilationTask.kt b/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/CompilationTask.kt
index 0a5fb77..743b3d7 100644
--- a/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/CompilationTask.kt
+++ b/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/CompilationTask.kt
@@ -392,7 +392,15 @@
options = inputs.compilerPluginOptionsList,
classpath = inputs.compilerPluginClasspathList,
)
- ).list()
+ ).let { compilationArgs ->
+ // Request '-verbose' execution for BTAPI compiler if tracing is enabled
+ val tracing = context.whenTracing { true } == true
+ if (info.buildToolsApi && tracing && "-verbose" !in compilationArgs.args) {
+ compilationArgs.flag("-verbose")
+ } else {
+ compilationArgs
+ }
+ }.list()
.let {
context.whenTracing {
context.printLines("compileKotlin arguments:\n", it)
diff --git a/src/main/kotlin/io/bazel/kotlin/compiler/BuildToolsAPICompiler.kt b/src/main/kotlin/io/bazel/kotlin/compiler/BuildToolsAPICompiler.kt
index aa14ce7..14afc88 100644
--- a/src/main/kotlin/io/bazel/kotlin/compiler/BuildToolsAPICompiler.kt
+++ b/src/main/kotlin/io/bazel/kotlin/compiler/BuildToolsAPICompiler.kt
@@ -17,6 +17,7 @@
import org.jetbrains.kotlin.buildtools.api.CompilationResult
import org.jetbrains.kotlin.buildtools.api.ExperimentalBuildToolsApi
+import org.jetbrains.kotlin.buildtools.api.KotlinLogger
import org.jetbrains.kotlin.buildtools.api.KotlinToolchains
import org.jetbrains.kotlin.buildtools.api.getToolchain
import org.jetbrains.kotlin.buildtools.api.jvm.JvmPlatformToolchain
@@ -52,7 +53,10 @@
// Execute the compilation
val result =
kotlinToolchains.createBuildSession().use { session ->
- session.executeOperation(operationBuilder.build())
+ session.executeOperation(
+ operationBuilder.build(),
+ logger = createLogger(errStream, verbose = "-verbose" in args),
+ )
}
// BTAPI returns a different type than K2JVMCompiler (CompilationResult vs ExitCode).
@@ -63,4 +67,46 @@
CompilationResult.COMPILER_INTERNAL_ERROR -> ExitCode.INTERNAL_ERROR
}
}
+
+ private fun createLogger(
+ out: PrintStream,
+ verbose: Boolean,
+ ): KotlinLogger =
+ object : KotlinLogger {
+ override val isDebugEnabled: Boolean = verbose
+
+ override fun error(
+ msg: String,
+ throwable: Throwable?,
+ ) {
+ out.println(msg)
+ throwable?.printStackTrace(out)
+ }
+
+ override fun warn(
+ msg: String,
+ throwable: Throwable?,
+ ) {
+ out.println(msg)
+ throwable?.printStackTrace(out)
+ }
+
+ override fun info(msg: String) {
+ if (verbose) {
+ out.println(msg)
+ }
+ }
+
+ override fun debug(msg: String) {
+ if (verbose) {
+ out.println(msg)
+ }
+ }
+
+ override fun lifecycle(msg: String) {
+ if (verbose) {
+ out.println(msg)
+ }
+ }
+ }
}
diff --git a/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmBtaTest.java b/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmBtaTest.java
index 0953e31..e664188 100644
--- a/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmBtaTest.java
+++ b/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmBtaTest.java
@@ -21,6 +21,8 @@
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
+import static com.google.common.truth.Truth.assertThat;
+
/** Compiles through the Build Tools API path ({@code --build_tools_api=true}). */
@RunWith(JUnit4.class)
public class KotlinBuilderJvmBtaTest {
@@ -59,4 +61,37 @@
});
ctx.assertFilesExist(DirectoryType.CLASSES, "something/AClass.class");
}
+
+ @Test
+ public void testVerboseOutputIsReported() {
+ // The tracing mode enabled by 'compileKotlin()' is mapped to compiler's -verbose flag, which enables task output to stderr
+ ctx.runCompileTask(
+ c -> {
+ c.useBuildToolsApi();
+ c.compileKotlin();
+ c.addSource("AClass.kt", "package something;" + "class AClass{}");
+ c.outputJar();
+ c.outputJdeps();
+ });
+ assertThat(String.join("\n", ctx.outLines())).contains("Loading modules");
+ }
+
+ @Test
+ public void testCompilerDiagnosticsAreReported() {
+ // Compiler diagnostics must be printed to stderr
+ ctx.runFailingCompileTaskAndValidateOutput(
+ () -> ctx.runCompileTask(
+ c -> {
+ c.useBuildToolsApi();
+ c.compileKotlin();
+ c.addSource(
+ "Broken.kt",
+ "package something;",
+ "",
+ "val broken = DoesNotExist()");
+ c.outputJar();
+ c.outputJdeps();
+ }),
+ lines -> assertThat(String.join("\n", lines)).contains("DoesNotExist"));
+ }
}