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,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)
}
}
}