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 }