Add a handler for providing evaluation context for scripts

use it on refinement.
also some refactoring on context class and around
This commit is contained in:
Ilya Chernikov
2019-07-25 11:46:17 +02:00
parent 2a5c4a2409
commit 288fdc0952
5 changed files with 63 additions and 6 deletions
@@ -8,6 +8,7 @@ package kotlin.script.experimental.host
import kotlin.reflect.KClass
import kotlin.script.experimental.api.KotlinType
import kotlin.script.experimental.api.ScriptDependency
import kotlin.script.experimental.api.ScriptEvaluationContextData
import kotlin.script.experimental.util.PropertiesCollection
interface ScriptingHostConfigurationKeys
@@ -52,6 +53,11 @@ val ScriptingHostConfigurationKeys.configurationDependencies by PropertiesCollec
*/
val ScriptingHostConfigurationKeys.getScriptingClass by PropertiesCollection.key<GetScriptingClass>(isTransient = true)
/**
* Evaluation context getter, allows to provide data to the evaluation configuration refinement functions
*/
val ScriptingHostConfigurationKeys.getEvaluationContext by PropertiesCollection.key<GetEvaluationContext>(isTransient = true)
/**
* The interface to the generic "class loader" for the types used in the script configurations
*/
@@ -59,6 +65,18 @@ interface GetScriptingClass {
operator fun invoke(classType: KotlinType, contextClass: KClass<*>, hostConfiguration: ScriptingHostConfiguration): KClass<*>
}
/**
* A helper to enable passing lambda directly to the getEvaluationContext "keyword"
*/
fun ScriptingHostConfiguration.Builder.getEvaluationContext(handler: GetEvaluationContext) {
ScriptingHostConfiguration.getEvaluationContext.put(handler)
}
/**
* The interface to an evaluation context getter
*/
typealias GetEvaluationContext = (hostConfiguration: ScriptingHostConfiguration) -> ScriptEvaluationContextData
// helper method
fun ScriptingHostConfiguration.getScriptingClass(type: KotlinType, contextClass: KClass<*>): KClass<*> {
val getClass = get(ScriptingHostConfiguration.getScriptingClass)