Fix legacy definitions error propagation

also fixes script-util test with resolving errors
This commit is contained in:
Ilya Chernikov
2019-07-09 16:55:33 +02:00
parent 10e19bccb1
commit 382e55284c
4 changed files with 36 additions and 26 deletions
@@ -364,20 +364,22 @@ class ScriptTemplateTest : KtUsefulTestCase() {
val environment = KotlinCoreEnvironment.createForTests(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) val environment = KotlinCoreEnvironment.createForTests(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES)
try { return try {
return KotlinToJVMBytecodeCompiler.compileScript(environment, this::class.java.classLoader.takeUnless { runIsolated }) KotlinToJVMBytecodeCompiler.compileScript(environment, this::class.java.classLoader.takeUnless { runIsolated })
} } catch (e: CompilationException) {
catch (e: CompilationException) { messageCollector.report(
messageCollector.report(CompilerMessageSeverity.EXCEPTION, OutputMessageUtil.renderException(e), CompilerMessageSeverity.EXCEPTION, OutputMessageUtil.renderException(e),
MessageUtil.psiElementToMessageLocation(e.element)) MessageUtil.psiElementToMessageLocation(e.element)
return null )
} null
catch (t: Throwable) { } catch (e: IllegalStateException) {
messageCollector.report(CompilerMessageSeverity.EXCEPTION, OutputMessageUtil.renderException(e))
null
} catch (t: Throwable) {
MessageCollectorUtil.reportException(messageCollector, t) MessageCollectorUtil.reportException(messageCollector, t)
throw t throw t
} }
} } finally {
finally {
Disposer.dispose(rootDisposable) Disposer.dispose(rootDisposable)
} }
} }
@@ -170,21 +170,23 @@ done
val environment = KotlinCoreEnvironment.createForTests(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) val environment = KotlinCoreEnvironment.createForTests(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES)
try { return try {
return KotlinToJVMBytecodeCompiler.compileScript(environment) KotlinToJVMBytecodeCompiler.compileScript(environment)
} } catch (e: CompilationException) {
catch (e: CompilationException) { messageCollector.report(
messageCollector.report(CompilerMessageSeverity.EXCEPTION, OutputMessageUtil.renderException(e), CompilerMessageSeverity.EXCEPTION, OutputMessageUtil.renderException(e),
MessageUtil.psiElementToMessageLocation(e.element)) MessageUtil.psiElementToMessageLocation(e.element)
return null )
} null
catch (t: Throwable) { } catch (e: IllegalStateException) {
messageCollector.report(CompilerMessageSeverity.EXCEPTION, OutputMessageUtil.renderException(e))
null
} catch (t: Throwable) {
MessageCollectorUtil.reportException(messageCollector, t) MessageCollectorUtil.reportException(messageCollector, t)
throw t throw t
} }
} } finally {
finally {
Disposer.dispose(rootDisposable) Disposer.dispose(rootDisposable)
} }
} }
@@ -11,6 +11,7 @@ import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationResult import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationResult
import kotlin.script.experimental.api.ScriptCompilationConfiguration import kotlin.script.experimental.api.ScriptCompilationConfiguration
import kotlin.script.experimental.api.ScriptDiagnostic
import kotlin.script.experimental.api.valueOr import kotlin.script.experimental.api.valueOr
fun PsiFile.findScriptCompilationConfiguration(): ScriptCompilationConfiguration? { fun PsiFile.findScriptCompilationConfiguration(): ScriptCompilationConfiguration? {
@@ -35,8 +36,12 @@ fun VirtualFile.findScriptCompilationConfiguration(project: Project): ScriptComp
} }
private fun ScriptCompilationConfigurationResult.valueOrError() = valueOr { failure -> private fun ScriptCompilationConfigurationResult.valueOrError() = valueOr { failure ->
throw IllegalArgumentException( val singleCause = failure.reports.singleOrNull { it.severity == ScriptDiagnostic.Severity.ERROR }
"Error retrieving script compilation configuration: ${failure.reports.joinToString { it.message }}", if (singleCause != null)
failure.reports.find { it.exception != null }?.exception throw IllegalStateException(singleCause.message, singleCause.exception)
) else
throw IllegalStateException(
"Error retrieving script compilation configuration: ${failure.reports.joinToString { it.message }}",
failure.reports.find { it.exception != null }?.exception
)
} }
@@ -219,6 +219,7 @@ fun refineScriptCompilationConfiguration(
definition: ScriptDefinition, definition: ScriptDefinition,
project: Project project: Project
): ScriptCompilationConfigurationResult { ): ScriptCompilationConfigurationResult {
// TODO: add location information on refinement errors
val ktFileSource = script.toKtFileSource(definition, project) val ktFileSource = script.toKtFileSource(definition, project)
val legacyDefinition = definition.asLegacyOrNull<KotlinScriptDefinition>() val legacyDefinition = definition.asLegacyOrNull<KotlinScriptDefinition>()
if (legacyDefinition == null) { if (legacyDefinition == null) {