K2 Scripting: fix order of arguments processing

and base class handling:
Since in K2 we do not distinguish between script arguments taken from
the base class and provided properties, we need this extra functionality
to preserve the argument order of K1 scripts.
This is a temporary measure, since we're going to deprecate base class
usage at some point (KT-60449), so the relevant constructor arguments
should disappear too.
This commit is contained in:
Ilya Chernikov
2023-04-27 17:53:33 +02:00
committed by Space Team
parent 96bde033e1
commit 020a590df7
10 changed files with 46 additions and 8 deletions
@@ -8,6 +8,7 @@ package kotlin.script.experimental.jvm
import java.lang.reflect.InvocationTargetException
import kotlin.reflect.KClass
import kotlin.script.experimental.api.*
import kotlin.script.experimental.impl._languageVersion
open class BasicJvmScriptEvaluator : ScriptEvaluator {
@@ -71,6 +72,13 @@ open class BasicJvmScriptEvaluator : ScriptEvaluator {
refinedEvalConfiguration: ScriptEvaluationConfiguration,
importedScriptsEvalResults: List<EvaluationResult>
): Any {
val isCompiledWithK2 =
refinedEvalConfiguration[ScriptEvaluationConfiguration.compilationConfiguration]
?.get(ScriptCompilationConfiguration._languageVersion)
?.let {
it.substringBefore('.').toIntOrNull()?.let { it >= 2 }
} == true
val args = ArrayList<Any?>()
refinedEvalConfiguration[ScriptEvaluationConfiguration.previousSnippets]?.let {
@@ -81,6 +89,12 @@ open class BasicJvmScriptEvaluator : ScriptEvaluator {
args.addAll(it)
}
if (isCompiledWithK2) {
refinedEvalConfiguration[ScriptEvaluationConfiguration.providedProperties]?.forEach {
args.add(it.value)
}
}
importedScriptsEvalResults.forEach {
args.add(it.returnValue.scriptInstance)
}
@@ -88,8 +102,11 @@ open class BasicJvmScriptEvaluator : ScriptEvaluator {
refinedEvalConfiguration[ScriptEvaluationConfiguration.implicitReceivers]?.let {
args.addAll(it)
}
refinedEvalConfiguration[ScriptEvaluationConfiguration.providedProperties]?.forEach {
args.add(it.value)
if (!isCompiledWithK2) {
refinedEvalConfiguration[ScriptEvaluationConfiguration.providedProperties]?.forEach {
args.add(it.value)
}
}
val ctor = java.constructors.single()