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"));
+    }
 }