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:
kirill.shmakov
2019-02-07 11:27:42 +03:00
parent 2518ddd87d
commit 4b1e5e8005
6 changed files with 86 additions and 18 deletions
@@ -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(
@@ -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";
}
}
@@ -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,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
}