From c84c33cbd6d691c52d7713f7993d4889cff73ca1 Mon Sep 17 00:00:00 2001 From: Caleb Brinkman Date: Tue, 9 Apr 2019 10:22:03 -0500 Subject: [PATCH] KT-30816 BasicJvmScriptEvaluator incorrect arg order https://youtrack.jetbrains.com/issue/KT-30816 Change BasicJvmScriptEvaluator to pass constructor parameters in the correct order, include tests for scripts w/ provided properties, and implicit receiver, and both. --- .../jvmhost/jvmScriptEvaluation.kt | 6 +- .../test/ConstructorArgumentOrderTest.kt | 52 ++++++++++++++++ .../jvmhost/test/TestScriptDefinitions.kt | 61 +++++++++++++++++++ 3 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 libraries/scripting/jvm-host/test/kotlin/script/experimental/jvmhost/test/ConstructorArgumentOrderTest.kt create mode 100644 libraries/scripting/jvm-host/test/kotlin/script/experimental/jvmhost/test/TestScriptDefinitions.kt diff --git a/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jvmScriptEvaluation.kt b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jvmScriptEvaluation.kt index e47858972ea..9be530aaa04 100644 --- a/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jvmScriptEvaluation.kt +++ b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jvmScriptEvaluation.kt @@ -59,12 +59,12 @@ open class BasicJvmScriptEvaluator : ScriptEvaluator { updatedEvalConfiguration[ScriptEvaluationConfiguration.constructorArgs]?.let { args.addAll(it) } - actualEvaluationConfiguration[ScriptEvaluationConfiguration.providedProperties]?.forEach { - args.add(it.value) - } actualEvaluationConfiguration[ScriptEvaluationConfiguration.implicitReceivers]?.let { args.addAll(it) } + actualEvaluationConfiguration[ScriptEvaluationConfiguration.providedProperties]?.forEach { + args.add(it.value) + } compiledScript.otherScripts.mapSuccess { invoke(it, updatedEvalConfiguration) diff --git a/libraries/scripting/jvm-host/test/kotlin/script/experimental/jvmhost/test/ConstructorArgumentOrderTest.kt b/libraries/scripting/jvm-host/test/kotlin/script/experimental/jvmhost/test/ConstructorArgumentOrderTest.kt new file mode 100644 index 00000000000..d26e2ed8e79 --- /dev/null +++ b/libraries/scripting/jvm-host/test/kotlin/script/experimental/jvmhost/test/ConstructorArgumentOrderTest.kt @@ -0,0 +1,52 @@ +/* + * 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 kotlin.script.experimental.jvmhost.test + +import org.junit.Test +import kotlin.script.experimental.api.ResultWithDiagnostics +import kotlin.script.experimental.api.implicitReceivers +import kotlin.script.experimental.api.providedProperties +import kotlin.test.assertTrue + +class ConstructorArgumentsOrderTest { + + @Test + fun testScriptWithProvidedProperties() { + val res = evalString("""println(providedString)""") { + providedProperties("providedString" to "Hello Provided!") + } + + assertTrue( + res is ResultWithDiagnostics.Success, + "test failed:\n ${res.reports.joinToString("\n ") { it.message + if (it.exception == null) "" else ": ${it.exception}" }}" + ) + } + + @Test + fun testScriptWithImplicitReceiver() { + val res = evalString("""println(receiverString)""") { + implicitReceivers(ImplicitReceiverClass("Hello Receiver!")) + } + + assertTrue( + res is ResultWithDiagnostics.Success, + "test failed:\n ${res.reports.joinToString("\n ") { it.message + if (it.exception == null) "" else ": ${it.exception}" }}" + ) + } + + @Test + fun testScriptWithBoth() { + val res = evalString("""println(providedString + receiverString)""") { + providedProperties("providedString" to "Hello") + implicitReceivers(ImplicitReceiverClass(" Both!")) + } + + assertTrue( + res is ResultWithDiagnostics.Success, + "test failed:\n ${res.reports.joinToString("\n ") { it.message + if (it.exception == null) "" else ": ${it.exception}" }}" + ) + } +} diff --git a/libraries/scripting/jvm-host/test/kotlin/script/experimental/jvmhost/test/TestScriptDefinitions.kt b/libraries/scripting/jvm-host/test/kotlin/script/experimental/jvmhost/test/TestScriptDefinitions.kt new file mode 100644 index 00000000000..2eee41fe23f --- /dev/null +++ b/libraries/scripting/jvm-host/test/kotlin/script/experimental/jvmhost/test/TestScriptDefinitions.kt @@ -0,0 +1,61 @@ +/* + * 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 kotlin.script.experimental.jvmhost.test + +import kotlin.script.experimental.annotations.KotlinScript +import kotlin.script.experimental.api.* +import kotlin.script.experimental.host.toScriptSource +import kotlin.script.experimental.jvm.dependenciesFromCurrentContext +import kotlin.script.experimental.jvm.jvm +import kotlin.script.experimental.jvmhost.BasicJvmScriptingHost +import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate + +@KotlinScript(fileExtension = "withboth.kts", compilationConfiguration = ReceiverAndPropertiesConfiguration::class) +abstract class ScriptWithBoth + +@KotlinScript(fileExtension = "withproperties.kts", compilationConfiguration = ProvidedPropertiesConfiguration::class) +abstract class ScriptWithProvidedProperties + +@KotlinScript(fileExtension = "withreceiver.kts", compilationConfiguration = ImplicitReceiverConfiguration::class) +abstract class ScriptWithImplicitReceiver + +object ReceiverAndPropertiesConfiguration : ScriptCompilationConfiguration( + { + jvm { dependenciesFromCurrentContext(wholeClasspath = true) } + + providedProperties("providedString" to String::class) + + implicitReceivers(ImplicitReceiverClass::class) + } +) + +object ProvidedPropertiesConfiguration : ScriptCompilationConfiguration( + { + jvm { dependenciesFromCurrentContext(wholeClasspath = true) } + + providedProperties("providedString" to String::class) + } +) + +object ImplicitReceiverConfiguration : ScriptCompilationConfiguration( + { + jvm { dependenciesFromCurrentContext(wholeClasspath = true) } + + implicitReceivers(ImplicitReceiverClass::class) + } +) + +class ImplicitReceiverClass(val receiverString: String) + +inline fun evalString( + source: String, + noinline configure: ScriptEvaluationConfiguration.Builder.() -> Unit +): ResultWithDiagnostics { + val actualConfiguration = createJvmCompilationConfigurationFromTemplate() + return BasicJvmScriptingHost() + .eval(source.toScriptSource(), actualConfiguration, ScriptEvaluationConfiguration(configure)) +} +