From 382e55284cd9cec496ea6e19a471100b4c12e08d Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Tue, 9 Jul 2019 16:55:33 +0200 Subject: [PATCH] Fix legacy definitions error propagation also fixes script-util test with resolving errors --- .../kotlin/scripts/ScriptTemplateTest.kt | 24 ++++++++++--------- .../kotlin/script/util/ScriptUtilIT.kt | 24 ++++++++++--------- .../definitions/dynamicConfigurations.kt | 13 ++++++---- .../resolve/refineCompilationConfiguration.kt | 1 + 4 files changed, 36 insertions(+), 26 deletions(-) diff --git a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTemplateTest.kt b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTemplateTest.kt index f6c145a02be..288da5fa5f0 100644 --- a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTemplateTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTemplateTest.kt @@ -364,20 +364,22 @@ class ScriptTemplateTest : KtUsefulTestCase() { val environment = KotlinCoreEnvironment.createForTests(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) - try { - return KotlinToJVMBytecodeCompiler.compileScript(environment, this::class.java.classLoader.takeUnless { runIsolated }) - } - catch (e: CompilationException) { - messageCollector.report(CompilerMessageSeverity.EXCEPTION, OutputMessageUtil.renderException(e), - MessageUtil.psiElementToMessageLocation(e.element)) - return null - } - catch (t: Throwable) { + return try { + KotlinToJVMBytecodeCompiler.compileScript(environment, this::class.java.classLoader.takeUnless { runIsolated }) + } catch (e: CompilationException) { + messageCollector.report( + CompilerMessageSeverity.EXCEPTION, OutputMessageUtil.renderException(e), + MessageUtil.psiElementToMessageLocation(e.element) + ) + null + } catch (e: IllegalStateException) { + messageCollector.report(CompilerMessageSeverity.EXCEPTION, OutputMessageUtil.renderException(e)) + null + } catch (t: Throwable) { MessageCollectorUtil.reportException(messageCollector, t) throw t } - } - finally { + } finally { Disposer.dispose(rootDisposable) } } diff --git a/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt b/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt index 50a24c2a329..85aaa87ea7c 100644 --- a/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt +++ b/libraries/tools/kotlin-script-util/src/test/kotlin/org/jetbrains/kotlin/script/util/ScriptUtilIT.kt @@ -170,21 +170,23 @@ done val environment = KotlinCoreEnvironment.createForTests(rootDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) - try { - return KotlinToJVMBytecodeCompiler.compileScript(environment) - } - catch (e: CompilationException) { - messageCollector.report(CompilerMessageSeverity.EXCEPTION, OutputMessageUtil.renderException(e), - MessageUtil.psiElementToMessageLocation(e.element)) - return null - } - catch (t: Throwable) { + return try { + KotlinToJVMBytecodeCompiler.compileScript(environment) + } catch (e: CompilationException) { + messageCollector.report( + CompilerMessageSeverity.EXCEPTION, OutputMessageUtil.renderException(e), + MessageUtil.psiElementToMessageLocation(e.element) + ) + null + } catch (e: IllegalStateException) { + messageCollector.report(CompilerMessageSeverity.EXCEPTION, OutputMessageUtil.renderException(e)) + null + } catch (t: Throwable) { MessageCollectorUtil.reportException(messageCollector, t) throw t } - } - finally { + } finally { Disposer.dispose(rootDisposable) } } diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/dynamicConfigurations.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/dynamicConfigurations.kt index 5a827025cf0..79649436065 100644 --- a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/dynamicConfigurations.kt +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/definitions/dynamicConfigurations.kt @@ -11,6 +11,7 @@ import com.intellij.psi.PsiFile import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationResult import kotlin.script.experimental.api.ScriptCompilationConfiguration +import kotlin.script.experimental.api.ScriptDiagnostic import kotlin.script.experimental.api.valueOr fun PsiFile.findScriptCompilationConfiguration(): ScriptCompilationConfiguration? { @@ -35,8 +36,12 @@ fun VirtualFile.findScriptCompilationConfiguration(project: Project): ScriptComp } private fun ScriptCompilationConfigurationResult.valueOrError() = valueOr { failure -> - throw IllegalArgumentException( - "Error retrieving script compilation configuration: ${failure.reports.joinToString { it.message }}", - failure.reports.find { it.exception != null }?.exception - ) + val singleCause = failure.reports.singleOrNull { it.severity == ScriptDiagnostic.Severity.ERROR } + if (singleCause != null) + 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 + ) } diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt index ef149c8b59e..917a19bb4dc 100644 --- a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/refineCompilationConfiguration.kt @@ -219,6 +219,7 @@ fun refineScriptCompilationConfiguration( definition: ScriptDefinition, project: Project ): ScriptCompilationConfigurationResult { + // TODO: add location information on refinement errors val ktFileSource = script.toKtFileSource(definition, project) val legacyDefinition = definition.asLegacyOrNull() if (legacyDefinition == null) {