Implement script evaluation configuration refinement

This commit is contained in:
Ilya Chernikov
2019-04-01 16:10:31 +02:00
parent c51d4a4405
commit fa58b41e43
3 changed files with 82 additions and 40 deletions
@@ -92,10 +92,18 @@ class ScriptCollectedData(properties: Map<PropertiesCollection.Key<*>, Any>) : P
val ScriptCollectedDataKeys.foundAnnotations by PropertiesCollection.key<List<Annotation>>()
/**
* The facade to the script data for refinement callbacks
* The facade to the script data for compilation configuration refinement callbacks
*/
class ScriptConfigurationRefinementContext(
val script: SourceCode,
val compilationConfiguration: ScriptCompilationConfiguration,
val collectedData: ScriptCollectedData? = null
)
/**
* The facade to the script data for evaluation configuration refinement callbacks
*/
class ScriptEvaluationConfigurationRefinementContext(
val compiledScript: CompiledScript<*>,
val evaluationConfiguration: ScriptEvaluationConfiguration
)
@@ -7,6 +7,7 @@
package kotlin.script.experimental.api
import java.io.Serializable
import kotlin.reflect.KClass
import kotlin.script.experimental.util.PropertiesCollection
@@ -52,7 +53,12 @@ val ScriptEvaluationConfigurationKeys.constructorArgs by PropertiesCollection.ke
* only create/evaluate instances if not found, and evaluator will put newly created instances into the map
* This allows to have a single instance of the script if it is imported several times via different import paths.
*/
val ScriptEvaluationConfigurationKeys.scriptsInstancesSharingMap by PropertiesCollection.key<MutableMap<KClass<*>, Any>>()
val ScriptEvaluationConfigurationKeys.scriptsInstancesSharingMap by PropertiesCollection.key<MutableMap<KClass<*>, EvaluationResult>>()
/**
* The callback that will be called on the script compilation immediately before starting the compilation
*/
val ScriptEvaluationConfigurationKeys.refineConfigurationBeforeEvaluate by PropertiesCollection.key<RefineEvaluationConfigurationData>()
/**
* A helper to enable scriptsInstancesSharingMap with default implementation
@@ -63,6 +69,25 @@ fun ScriptEvaluationConfiguration.Builder.enableScriptsInstancesSharing() {
}
}
/**
* A helper to enable passing lambda directly to the refinement "keyword"
*/
fun ScriptEvaluationConfiguration.Builder.refineConfigurationBeforeEvaluate(handler: RefineScriptEvaluationConfigurationHandler) {
set(ScriptEvaluationConfiguration.refineConfigurationBeforeEvaluate, RefineEvaluationConfigurationData(handler))
}
/**
* The refinement callback function signature
*/
typealias RefineScriptEvaluationConfigurationHandler =
(ScriptEvaluationConfigurationRefinementContext) -> ResultWithDiagnostics<ScriptEvaluationConfiguration>
data class RefineEvaluationConfigurationData(
val handler: RefineScriptEvaluationConfigurationHandler
) : Serializable {
companion object { private const val serialVersionUID: Long = 1L }
}
/**
* The script evaluation result value
*/