Remove evaluator from script definition, simplify interface

This commit is contained in:
Ilya Chernikov
2018-07-15 20:54:20 +02:00
parent e61ba1fd70
commit 91e6c0b77c
13 changed files with 31 additions and 62 deletions
@@ -14,19 +14,21 @@ import kotlin.script.experimental.jvm.DummyCompiledJvmScriptCache
import kotlin.script.experimental.jvm.JvmBasicScriptingHost
import kotlin.script.experimental.jvm.JvmGetScriptingClass
import kotlin.script.experimental.jvm.JvmScriptCompiler
import kotlin.script.experimental.jvm.runners.BasicJvmScriptEvaluator
import kotlin.script.experimental.jvmhost.impl.KJVMCompilerImpl
import kotlin.script.experimental.misc.invoke
fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
val scriptCompiler = JvmScriptCompiler(KJVMCompilerImpl(), DummyCompiledJvmScriptCache())
val environment = ScriptingEnvironment(
ScriptingEnvironmentProperties.getScriptingClass(JvmGetScriptingClass())
)
val scriptDefinition = ScriptDefinitionFromAnnotatedBaseClass(
KotlinType(MyScriptWithMavenDeps::class),
ScriptingEnvironment(
ScriptingEnvironmentProperties.getScriptingClass(JvmGetScriptingClass())
)
environment
)
val host = JvmBasicScriptingHost(scriptCompiler, scriptDefinition.evaluator)
val host = JvmBasicScriptingHost(scriptCompiler, BasicJvmScriptEvaluator())
return host.eval(
scriptFile.toScriptSource(), scriptDefinition, ScriptCompileConfiguration(), ScriptEvaluationEnvironment()
@@ -14,18 +14,18 @@ import kotlin.script.dependencies.ScriptContents
import kotlin.script.dependencies.ScriptDependenciesResolver
import kotlin.script.experimental.annotations.KotlinScript
import kotlin.script.experimental.annotations.KotlinScriptDefaultCompilationConfiguration
import kotlin.script.experimental.annotations.KotlinScriptEvaluator
import kotlin.script.experimental.annotations.KotlinScriptFileExtension
import kotlin.script.experimental.api.*
import kotlin.script.experimental.jvm.*
import kotlin.script.experimental.jvm.runners.BasicJvmScriptEvaluator
import kotlin.script.experimental.misc.*
import kotlin.script.experimental.jvm.JvmDependency
import kotlin.script.experimental.jvm.jvmJavaHomeParams
import kotlin.script.experimental.jvm.mapLegacyDiagnosticSeverity
import kotlin.script.experimental.jvm.mapLegacyScriptPosition
import kotlin.script.experimental.misc.invoke
import kotlin.script.experimental.util.TypedKey
@KotlinScript
@KotlinScriptFileExtension("scriptwithdeps.kts")
@KotlinScriptDefaultCompilationConfiguration(MyConfiguration::class)
@KotlinScriptEvaluator(BasicJvmScriptEvaluator::class)
abstract class MyScriptWithMavenDeps {
// abstract fun body(vararg args: String): Int
}
@@ -12,6 +12,7 @@ import kotlin.script.experimental.api.*
import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass
import kotlin.script.experimental.host.toScriptSource
import kotlin.script.experimental.jvm.*
import kotlin.script.experimental.jvm.runners.BasicJvmScriptEvaluator
import kotlin.script.experimental.jvmhost.impl.KJVMCompilerImpl
import kotlin.script.experimental.misc.*
@@ -24,14 +25,15 @@ val myJvmConfigParams = jvmJavaHomeParams + with(ScriptCompileConfigurationPrope
fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
val scriptCompiler = JvmScriptCompiler(KJVMCompilerImpl(), DummyCompiledJvmScriptCache())
val environment = ScriptingEnvironment(
ScriptingEnvironmentProperties.getScriptingClass(JvmGetScriptingClass())
)
val scriptDefinition = ScriptDefinitionFromAnnotatedBaseClass(
KotlinType(MyScript::class),
ScriptingEnvironment(
ScriptingEnvironmentProperties.getScriptingClass(JvmGetScriptingClass())
)
environment
)
val host = JvmBasicScriptingHost(scriptCompiler, scriptDefinition.evaluator)
val host = JvmBasicScriptingHost(scriptCompiler, BasicJvmScriptEvaluator())
return host.eval(
scriptFile.toScriptSource(), scriptDefinition, ScriptCompileConfiguration(myJvmConfigParams), ScriptEvaluationEnvironment()
@@ -6,12 +6,9 @@
package org.jetbrains.kotlin.script.examples.jvm.simple
import kotlin.script.experimental.annotations.KotlinScript
import kotlin.script.experimental.annotations.KotlinScriptEvaluator
import kotlin.script.experimental.annotations.KotlinScriptFileExtension
import kotlin.script.experimental.jvm.runners.BasicJvmScriptEvaluator
@KotlinScript
@KotlinScriptEvaluator(BasicJvmScriptEvaluator::class)
@KotlinScriptFileExtension("simplescript.kts")
abstract class MyScript {
// abstract fun body(vararg args: String): Int
@@ -14,7 +14,6 @@ package kotlin.script.experimental.annotations
import kotlin.reflect.KClass
import kotlin.script.experimental.api.ScriptDefinition
import kotlin.script.experimental.api.ScriptEvaluator
import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass
@Target(AnnotationTarget.CLASS)
@@ -35,12 +34,6 @@ annotation class KotlinScriptFileExtension(
val extension: String
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class KotlinScriptEvaluator(
val evaluator: KClass<out ScriptEvaluator<*>>
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class KotlinScriptDefaultCompilationConfiguration(
@@ -18,8 +18,6 @@ interface ScriptDefinition {
// constructor(environment: ScriptingEnvironment) // the constructor is expected from implementations
val properties: ScriptDefinitionPropertiesBag
val evaluator: ScriptEvaluator<*>?
}
object ScriptDefinitionProperties {
@@ -24,13 +24,12 @@ typealias ScriptEvaluationEnvironment = ChainedPropertyBag
data class EvaluationResult(val returnValue: Any?, val environment: ScriptEvaluationEnvironment)
// NOTE: name inconsistency: run vs evaluate
interface ScriptEvaluator<in ScriptBase : Any> {
interface ScriptEvaluator {
// constructor(properties: ScriptDefinitionPropertiesBag) // the constructor is expected from implementations
suspend fun eval(
compiledScript: CompiledScript<ScriptBase>,
compiledScript: CompiledScript<*>,
scriptEvaluationEnvironment: ScriptEvaluationEnvironment
): ResultWithDiagnostics<EvaluationResult>
}
@@ -1,17 +0,0 @@
/*
* Copyright 2000-2018 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.basic
import kotlin.script.experimental.api.*
class DummyEvaluator<ScriptBase : Any>(val environment: ScriptingEnvironment) : ScriptEvaluator<ScriptBase> {
override suspend fun eval(
compiledScript: CompiledScript<ScriptBase>,
scriptEvaluationEnvironment: ScriptEvaluationEnvironment
): ResultWithDiagnostics<EvaluationResult> =
ResultWithDiagnostics.Failure("not implemented".asErrorDiagnostics())
}
@@ -9,9 +9,11 @@ import kotlin.reflect.KClass
import kotlin.reflect.full.createInstance
import kotlin.reflect.full.findAnnotation
import kotlin.reflect.full.primaryConstructor
import kotlin.script.experimental.annotations.*
import kotlin.script.experimental.annotations.KotlinScript
import kotlin.script.experimental.annotations.KotlinScriptDefaultCompilationConfiguration
import kotlin.script.experimental.annotations.KotlinScriptDefinition
import kotlin.script.experimental.annotations.KotlinScriptFileExtension
import kotlin.script.experimental.api.*
import kotlin.script.experimental.basic.DummyEvaluator
import kotlin.script.experimental.util.TypedKey
import kotlin.script.experimental.util.chainPropertyBags
@@ -65,11 +67,6 @@ open class ScriptDefinitionFromAnnotatedBaseClass(
ScriptingEnvironment(baseProperties, propertiesData)
}
override val evaluator =
baseClass.findAnnotation<KotlinScriptEvaluator>()?.evaluator?.instantiateScriptHandler()
?: explicitDefinition?.evaluator
?: DummyEvaluator::class.instantiateScriptHandler()
private fun <T : Any> KClass<T>.instantiateScriptHandler(): T {
val klass: KClass<T> = try {
getScriptingClass(KotlinType(this), this@ScriptDefinitionFromAnnotatedBaseClass::class, environment) as KClass<T>
@@ -22,10 +22,10 @@ import kotlinx.coroutines.experimental.CoroutineScope
import kotlinx.coroutines.experimental.runBlocking
import kotlin.script.experimental.api.*
abstract class BasicScriptingHost<ScriptBase : Any>(
abstract class BasicScriptingHost(
val compiler: ScriptCompiler,
// TODO: does it belong here or to the definition?
val evaluator: ScriptEvaluator<ScriptBase>
val evaluator: ScriptEvaluator
) {
open fun <T> runInCoroutineContext(block: suspend CoroutineScope.() -> T): T = runBlocking { block() }
@@ -40,8 +40,7 @@ abstract class BasicScriptingHost<ScriptBase : Any>(
when (compiled) {
is ResultWithDiagnostics.Failure -> compiled
is ResultWithDiagnostics.Success -> {
val compiledScript = compiled.value!! as CompiledScript<ScriptBase>
evaluator.eval(compiledScript, environment)
evaluator.eval(compiled.value, environment)
}
}
}
@@ -11,10 +11,10 @@ import kotlin.script.experimental.api.ScriptEvaluator
import kotlin.script.experimental.host.BasicScriptingHost
import kotlin.script.experimental.util.typedKey
open class JvmBasicScriptingHost<ScriptBase : Any>(
open class JvmBasicScriptingHost(
compiler: JvmScriptCompiler,
evaluator: ScriptEvaluator<ScriptBase>
) : BasicScriptingHost<ScriptBase>(compiler, evaluator)
evaluator: ScriptEvaluator
) : BasicScriptingHost(compiler, evaluator)
object JvmScriptEvaluationEnvironmentProperties {
val baseClassLoader by typedKey<ClassLoader?>()
@@ -7,10 +7,10 @@ package kotlin.script.experimental.jvm.runners
import kotlin.script.experimental.api.*
open class BasicJvmScriptEvaluator<ScriptBase : Any>(val environment: ScriptingEnvironment) : ScriptEvaluator<ScriptBase> {
open class BasicJvmScriptEvaluator() : ScriptEvaluator {
override suspend fun eval(
compiledScript: CompiledScript<ScriptBase>,
compiledScript: CompiledScript<*>,
scriptEvaluationEnvironment: ScriptEvaluationEnvironment
): ResultWithDiagnostics<EvaluationResult> =
try {
@@ -75,6 +75,5 @@ class LazyScriptDefinitionFromDiscoveredClass internal constructor(
object InvalidScriptDefinition : ScriptDefinition {
override val properties: ScriptDefinitionPropertiesBag = ScriptDefinitionPropertiesBag()
override val evaluator: ScriptEvaluator<*>? = null
}