From 4b1e5e8005ed663a2f2b1347d0050c51d863cfc0 Mon Sep 17 00:00:00 2001 From: "kirill.shmakov" Date: Thu, 7 Feb 2019 11:27:42 +0300 Subject: [PATCH] Resolve #KT-26865 and related issues CLITool.exec is used in konanc to perform compilation of native project. Due to some internal limitation, this function runs in separate process. After this change, there will be a possibility to choose MessageRenderer used in CLITool.exec via system property org.jetbrains.kotlin.cliMessageRenderer. Reviewed at KOTLIN-CR-2698. --- .../jetbrains/kotlin/cli/common/CLITool.kt | 12 +++++- .../messages/GradleStyleMessagerRenderer.kt | 39 +++++++++++++++++++ .../cli/common/messages/MessageRenderer.java | 21 ++++++++++ .../common/messages/XmlMessageRenderer.java | 5 +++ .../compilerRunner/KotlinNativeToolRunner.kt | 2 + .../logging/GradlePrintingMessageCollector.kt | 25 ++++-------- 6 files changed, 86 insertions(+), 18 deletions(-) create mode 100644 compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/GradleStyleMessagerRenderer.kt diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLITool.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLITool.kt index a1d412da3f5..c41c184e9a2 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLITool.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLITool.kt @@ -36,7 +36,17 @@ import java.util.function.Predicate abstract class CLITool { fun exec(errStream: PrintStream, vararg args: String): ExitCode { - return exec(errStream, Services.EMPTY, MessageRenderer.PLAIN_RELATIVE_PATHS, args) + val rendererType = System.getProperty(MessageRenderer.PROPERTY_KEY) + + val messageRenderer = when (rendererType) { + MessageRenderer.XML.name -> MessageRenderer.XML + MessageRenderer.GRADLE_STYLE.name -> MessageRenderer.GRADLE_STYLE + MessageRenderer.WITHOUT_PATHS.name -> MessageRenderer.WITHOUT_PATHS + MessageRenderer.PLAIN_FULL_PATHS.name -> MessageRenderer.PLAIN_FULL_PATHS + else -> MessageRenderer.PLAIN_RELATIVE_PATHS + } + + return exec(errStream, Services.EMPTY, messageRenderer, args) } protected fun exec( diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/GradleStyleMessagerRenderer.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/GradleStyleMessagerRenderer.kt new file mode 100644 index 00000000000..544928a6ac5 --- /dev/null +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/GradleStyleMessagerRenderer.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.cli.common.messages + +class GradleStyleMessageRenderer : MessageRenderer { + + override fun render(severity: CompilerMessageSeverity, message: String, location: CompilerMessageLocation?): String { + val prefix = when (severity) { + CompilerMessageSeverity.WARNING, CompilerMessageSeverity.STRONG_WARNING -> "w" + CompilerMessageSeverity.ERROR, CompilerMessageSeverity.EXCEPTION -> "e" + CompilerMessageSeverity.LOGGING, CompilerMessageSeverity.OUTPUT -> "v" + CompilerMessageSeverity.INFO -> "i" + } + + return buildString { + append("$prefix: ") + + location?.apply { + append("$path: ") + if (line > 0 && column > 0) { + append("($line, $column): ") + } + } + + append(message) + } + } + + override fun renderPreamble() = "" + + override fun renderUsage(usage: String) = usage + + override fun renderConclusion() = "" + + override fun getName() = "GradleStyle" +} \ No newline at end of file diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/MessageRenderer.java b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/MessageRenderer.java index d10664f8f6b..3a6fe302202 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/MessageRenderer.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/MessageRenderer.java @@ -24,6 +24,8 @@ import java.io.File; public interface MessageRenderer { + String PROPERTY_KEY = "org.jetbrains.kotlin.cliMessageRenderer"; + MessageRenderer XML = new XmlMessageRenderer(); MessageRenderer WITHOUT_PATHS = new PlainTextMessageRenderer() { @@ -32,6 +34,11 @@ public interface MessageRenderer { protected String getPath(@NotNull CompilerMessageLocation location) { return null; } + + @Override + public String getName() { + return "Pathless"; + } }; MessageRenderer PLAIN_FULL_PATHS = new PlainTextMessageRenderer() { @@ -40,6 +47,11 @@ public interface MessageRenderer { protected String getPath(@NotNull CompilerMessageLocation location) { return location.getPath(); } + + @Override + public String getName() { + return "FullPath"; + } }; MessageRenderer PLAIN_RELATIVE_PATHS = new PlainTextMessageRenderer() { @@ -50,8 +62,15 @@ public interface MessageRenderer { protected String getPath(@NotNull CompilerMessageLocation location) { return FileUtilsKt.descendantRelativeTo(new File(location.getPath()), cwd).getPath(); } + + @Override + public String getName() { + return "RelativePath"; + } }; + MessageRenderer GRADLE_STYLE = new GradleStyleMessageRenderer(); + String renderPreamble(); String render(@NotNull CompilerMessageSeverity severity, @NotNull String message, @Nullable CompilerMessageLocation location); @@ -59,4 +78,6 @@ public interface MessageRenderer { String renderUsage(@NotNull String usage); String renderConclusion(); + + String getName(); } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/XmlMessageRenderer.java b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/XmlMessageRenderer.java index b5702fce182..a4633f55d38 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/XmlMessageRenderer.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/XmlMessageRenderer.java @@ -57,4 +57,9 @@ public class XmlMessageRenderer implements MessageRenderer { public String renderConclusion() { return ""; } + + @Override + public String getName() { + return "XML"; + } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeToolRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeToolRunner.kt index 99576e270d8..4b5b9eb90f8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeToolRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeToolRunner.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.compilerRunner import org.gradle.api.Named import org.gradle.api.Project import org.gradle.api.file.FileCollection +import org.jetbrains.kotlin.cli.common.messages.MessageRenderer import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader import org.jetbrains.kotlin.konan.KonanVersion import org.jetbrains.kotlin.konan.target.HostManager @@ -103,6 +104,7 @@ internal abstract class KonanCliRunner( override val additionalSystemProperties = mutableMapOf( "konan.home" to project.konanHome, + MessageRenderer.PROPERTY_KEY to MessageRenderer.GRADLE_STYLE.name, "java.library.path" to "${project.konanHome}/konan/nativelib" ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/logging/GradlePrintingMessageCollector.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/logging/GradlePrintingMessageCollector.kt index 513e107f325..ae071561289 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/logging/GradlePrintingMessageCollector.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/logging/GradlePrintingMessageCollector.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.logging import org.gradle.api.logging.Logger import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity +import org.jetbrains.kotlin.cli.common.messages.GradleStyleMessageRenderer import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.compilerRunner.KotlinLogger @@ -17,6 +18,8 @@ internal class GradlePrintingMessageCollector(val logger: KotlinLogger) : private var hasErrors = false + private val messageRenderer = GradleStyleMessageRenderer() + override fun hasErrors() = hasErrors override fun clear() { @@ -24,37 +27,25 @@ internal class GradlePrintingMessageCollector(val logger: KotlinLogger) : } override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageLocation?) { - fun formatMsg(prefix: String) = - buildString { - append("$prefix: ") - - location?.apply { - append("$path: ") - if (line > 0 && column > 0) { - append("($line, $column): ") - } - } - - append(message) - } + val renderedMessage = messageRenderer.render(severity, message, location) when (severity) { CompilerMessageSeverity.ERROR, CompilerMessageSeverity.EXCEPTION -> { hasErrors = true - logger.error(formatMsg("e")) + logger.error(renderedMessage) } CompilerMessageSeverity.WARNING, CompilerMessageSeverity.STRONG_WARNING -> { - logger.warn(formatMsg("w")) + logger.warn(renderedMessage) } CompilerMessageSeverity.INFO -> { - logger.info(formatMsg("i")) + logger.info(renderedMessage) } CompilerMessageSeverity.LOGGING, CompilerMessageSeverity.OUTPUT -> { - logger.debug(formatMsg("v")) + logger.debug(renderedMessage) } }!! // !! is used to force compile-time exhaustiveness }