minor: avoid double reporting of scripting diagnostics

also fix arror reporting for scripts with location
This commit is contained in:
Ilya Chernikov
2022-05-31 14:56:15 +02:00
committed by teamcity
parent 855059b93c
commit f5950ac8f3
3 changed files with 22 additions and 12 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.cli.common.extensions.ScriptEvaluationExtension
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
@@ -133,8 +134,21 @@ abstract class AbstractScriptEvaluationExtension : ScriptEvaluationExtension {
@Suppress("DEPRECATION_ERROR")
return internalScriptingRunSuspend {
val compiledScript = scriptCompiler.compile(script, scriptCompilationConfiguration).valueOr {
val lines = if (it.reports.isEmpty()) null else script.text.lines()
for (report in it.reports) {
messageCollector.report(report.severity.toCompilerMessageSeverity(), report.render(withSeverity = false))
val location = report.location
val sourcePath = report.sourcePath
messageCollector.report(
report.severity.toCompilerMessageSeverity(),
report.render(withSeverity = false, withLocation = location == null || sourcePath == null),
if (location != null && sourcePath != null) {
CompilerMessageLocation.create(
sourcePath,
location.start.line, location.start.col,
lines?.getOrNull(location.start.line - 1)
)
} else null
)
}
return@internalScriptingRunSuspend ExitCode.COMPILATION_ERROR
}
@@ -61,9 +61,8 @@ class ScriptJvmCompilerFromEnvironment(val environment: KotlinCoreEnvironment) :
override fun compile(
script: SourceCode,
scriptCompilationConfiguration: ScriptCompilationConfiguration
): ResultWithDiagnostics<CompiledScript> {
val parentMessageCollector = environment.configuration[CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY]
return withMessageCollector(script = script, parentMessageCollector = parentMessageCollector) { messageCollector ->
): ResultWithDiagnostics<CompiledScript> =
withMessageCollector(script = script) { messageCollector ->
withScriptCompilationCache(script, scriptCompilationConfiguration, messageCollector) {
val initialConfiguration = scriptCompilationConfiguration.refineBeforeParsing(script).valueOr {
@@ -72,17 +71,17 @@ class ScriptJvmCompilerFromEnvironment(val environment: KotlinCoreEnvironment) :
val context = createCompilationContextFromEnvironment(initialConfiguration, environment, messageCollector)
val previousMessageCollector = environment.configuration[CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY]
try {
environment.configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector)
compileImpl(script, context, initialConfiguration, messageCollector)
} finally {
if (parentMessageCollector != null)
environment.configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, parentMessageCollector)
if (previousMessageCollector != null)
environment.configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, previousMessageCollector)
}
}
}
}
}
private fun withScriptCompilationCache(