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.
This commit is contained in:
@@ -36,7 +36,17 @@ import java.util.function.Predicate
|
||||
|
||||
abstract class CLITool<A : CommonToolArguments> {
|
||||
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(
|
||||
|
||||
+39
@@ -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"
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -57,4 +57,9 @@ public class XmlMessageRenderer implements MessageRenderer {
|
||||
public String renderConclusion() {
|
||||
return "</MESSAGES>";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "XML";
|
||||
}
|
||||
}
|
||||
|
||||
+2
@@ -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"
|
||||
)
|
||||
|
||||
|
||||
+8
-17
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user