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
@@ -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
}