Extend evaluation API for easier passing of evaluation configuration

refactor helpers accordingly
This commit is contained in:
Ilya Chernikov
2019-04-03 15:09:21 +02:00
parent fa58b41e43
commit 90444502a6
8 changed files with 123 additions and 62 deletions
@@ -5,19 +5,30 @@
package kotlin.script.experimental.jvmhost
import kotlin.script.experimental.api.KotlinType
import kotlin.script.experimental.api.ScriptCompilationConfiguration
import kotlin.script.experimental.api.ScriptEvaluator
import kotlin.script.experimental.api.*
import kotlin.script.experimental.host.ScriptingHostConfiguration
import kotlin.script.experimental.host.createCompilationConfigurationFromTemplate
import kotlin.script.experimental.host.BasicScriptingHost
import kotlin.script.experimental.host.createEvaluationConfigurationFromTemplate
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
open class BasicJvmScriptingHost(
hostConfiguration: ScriptingHostConfiguration = defaultJvmScriptingHostConfiguration,
val hostConfiguration: ScriptingHostConfiguration = defaultJvmScriptingHostConfiguration,
compiler: JvmScriptCompiler = JvmScriptCompiler(hostConfiguration),
evaluator: ScriptEvaluator = BasicJvmScriptEvaluator()
) : BasicScriptingHost(compiler, evaluator)
) : BasicScriptingHost(compiler, evaluator) {
inline fun <reified T : Any> evalWithTemplate(
script: SourceCode,
noinline compilation: ScriptCompilationConfiguration.Builder.() -> Unit = {},
noinline evaluation: ScriptEvaluationConfiguration.Builder.() -> Unit = {}
): ResultWithDiagnostics<EvaluationResult> =
eval(
script,
createJvmCompilationConfigurationFromTemplate<T>(hostConfiguration, compilation),
createJvmEvaluationConfigurationFromTemplate<T>(hostConfiguration, evaluation)
)
}
inline fun <reified T : Any> createJvmCompilationConfigurationFromTemplate(
@@ -29,3 +40,13 @@ inline fun <reified T : Any> createJvmCompilationConfigurationFromTemplate(
ScriptCompilationConfiguration::class,
body
)
inline fun <reified T : Any> createJvmEvaluationConfigurationFromTemplate(
hostConfiguration: ScriptingHostConfiguration = defaultJvmScriptingHostConfiguration,
noinline body: ScriptEvaluationConfiguration.Builder.() -> Unit = {}
): ScriptEvaluationConfiguration = createEvaluationConfigurationFromTemplate(
KotlinType(T::class),
hostConfiguration,
ScriptCompilationConfiguration::class,
body
)
@@ -28,11 +28,10 @@ open class BasicJvmScriptEvaluator : ScriptEvaluator {
override suspend operator fun invoke(
compiledScript: CompiledScript<*>,
scriptEvaluationConfiguration: ScriptEvaluationConfiguration?
scriptEvaluationConfiguration: ScriptEvaluationConfiguration
): ResultWithDiagnostics<EvaluationResult> =
try {
val actualEvalConfiguration = scriptEvaluationConfiguration ?: ScriptEvaluationConfiguration()
compiledScript.getClass(actualEvalConfiguration).onSuccess { scriptClass ->
compiledScript.getClass(scriptEvaluationConfiguration).onSuccess { scriptClass ->
// in the future, when (if) we'll stop to compile everything into constructor
// run as SAM
// return res
@@ -40,14 +39,14 @@ open class BasicJvmScriptEvaluator : ScriptEvaluator {
// for other scripts we need evaluation configuration with actualClassloader set,
// so they are loaded in the same classloader as the "main" script
val updatedEvalConfiguration =
if (actualEvalConfiguration.containsKey(ScriptEvaluationConfiguration.jvm.actualClassLoader))
actualEvalConfiguration
if (scriptEvaluationConfiguration.containsKey(ScriptEvaluationConfiguration.jvm.actualClassLoader))
scriptEvaluationConfiguration
else
ScriptEvaluationConfiguration(actualEvalConfiguration) {
ScriptEvaluationConfiguration(scriptEvaluationConfiguration) {
ScriptEvaluationConfiguration.jvm.actualClassLoader(scriptClass.java.classLoader)
}
val sharedScripts = actualEvalConfiguration[ScriptEvaluationConfiguration.scriptsInstancesSharingMap]
val sharedScripts = scriptEvaluationConfiguration[ScriptEvaluationConfiguration.scriptsInstancesSharingMap]
sharedScripts?.get(scriptClass)?.asSuccess()
?: compiledScript.otherScripts.mapSuccess {
@@ -20,7 +20,7 @@ open class BasicJvmScriptClassFilesGenerator(val outputDir: File) : ScriptEvalua
override suspend operator fun invoke(
compiledScript: CompiledScript<*>,
scriptEvaluationConfiguration: ScriptEvaluationConfiguration?
scriptEvaluationConfiguration: ScriptEvaluationConfiguration
): ResultWithDiagnostics<EvaluationResult> {
try {
if (compiledScript !is KJvmCompiledScript<*>)
@@ -48,7 +48,7 @@ open class BasicJvmScriptJarGenerator(val outputJar: File) : ScriptEvaluator {
override suspend operator fun invoke(
compiledScript: CompiledScript<*>,
scriptEvaluationConfiguration: ScriptEvaluationConfiguration?
scriptEvaluationConfiguration: ScriptEvaluationConfiguration
): ResultWithDiagnostics<EvaluationResult> {
try {
if (compiledScript !is KJvmCompiledScript<*>)