From 7ae2054cbae1c1716b63f3317d69c955895487a8 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Wed, 8 May 2019 11:31:08 +0200 Subject: [PATCH] Add a link to hostConfiguration from compilation and evaluation ones also add possibility to supply functional defaults for keys in PropertiesCollection --- .../script/experimental/api/scriptCompilation.kt | 6 ++++++ .../script/experimental/api/scriptEvaluation.kt | 6 ++++++ .../host/configurationFromTemplate.kt | 6 +++++- .../experimental/util/propertiesCollection.kt | 16 ++++++++++------ 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt index 0a46dd7f76c..a5603537c90 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptCompilation.kt @@ -9,6 +9,7 @@ package kotlin.script.experimental.api import java.io.Serializable import kotlin.reflect.KClass +import kotlin.script.experimental.host.ScriptingHostConfiguration import kotlin.script.experimental.util.PropertiesCollection interface ScriptCompilationConfigurationKeys @@ -113,6 +114,11 @@ val ScriptCompilationConfigurationKeys.refineConfigurationBeforeCompiling by Pro */ val ScriptCompilationConfigurationKeys.sourceFragments by PropertiesCollection.key>() +/** + * Scripting host configuration + */ +val ScriptCompilationConfigurationKeys.hostConfiguration by PropertiesCollection.key() + /** * The sub-builder DSL for configuring refinement callbacks */ diff --git a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptEvaluation.kt b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptEvaluation.kt index 6b4614e83f2..5e5a551c95b 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/api/scriptEvaluation.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/api/scriptEvaluation.kt @@ -9,6 +9,7 @@ package kotlin.script.experimental.api import java.io.Serializable import kotlin.reflect.KClass +import kotlin.script.experimental.host.ScriptingHostConfiguration import kotlin.script.experimental.util.PropertiesCollection interface ScriptEvaluationConfigurationKeys @@ -67,6 +68,11 @@ val ScriptEvaluationConfigurationKeys.scriptsInstancesSharingMap by PropertiesCo */ val ScriptEvaluationConfigurationKeys.scriptsInstancesSharing by PropertiesCollection.key(false) +/** + * Scripting host configuration + */ +val ScriptEvaluationConfigurationKeys.hostConfiguration by PropertiesCollection.key() + /** * The callback that will be called on the script compilation immediately before starting the compilation */ diff --git a/libraries/scripting/common/src/kotlin/script/experimental/host/configurationFromTemplate.kt b/libraries/scripting/common/src/kotlin/script/experimental/host/configurationFromTemplate.kt index 99e3bcaedb4..397da299f5f 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/host/configurationFromTemplate.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/host/configurationFromTemplate.kt @@ -39,6 +39,7 @@ fun createCompilationConfigurationFromTemplate( val mainAnnotation: KotlinScript = templateClass.kotlinScriptAnnotation return ScriptCompilationConfiguration(scriptConfigInstance(mainAnnotation.compilationConfiguration)) { + hostConfiguration(hostConfiguration) propertiesFromTemplate(templateClass, baseClassType, mainAnnotation) body() } @@ -62,7 +63,10 @@ fun createEvaluationConfigurationFromTemplate( val mainAnnotation = templateClass.kotlinScriptAnnotation - return ScriptEvaluationConfiguration(scriptConfigInstance(mainAnnotation.evaluationConfiguration), body = body) + return ScriptEvaluationConfiguration(scriptConfigInstance(mainAnnotation.evaluationConfiguration)) { + hostConfiguration(hostConfiguration) + body() + } } private fun ScriptCompilationConfiguration.Builder.propertiesFromTemplate( diff --git a/libraries/scripting/common/src/kotlin/script/experimental/util/propertiesCollection.kt b/libraries/scripting/common/src/kotlin/script/experimental/util/propertiesCollection.kt index c7accb04797..2a45c7b1158 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/util/propertiesCollection.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/util/propertiesCollection.kt @@ -13,7 +13,9 @@ import kotlin.script.experimental.api.KotlinType open class PropertiesCollection(private val properties: Map, Any?> = emptyMap()) : Serializable { - class Key(val name: String, @Transient val defaultValue: T? = null) : Serializable { + class Key(val name: String, @Transient val getDefaultValue: PropertiesCollection.() -> T?) : Serializable { + + constructor(name: String, defaultValue: T? = null) : this(name, { defaultValue }) override fun equals(other: Any?): Boolean = if (other is Key<*>) name == other.name else false override fun hashCode(): Int = name.hashCode() @@ -25,9 +27,11 @@ open class PropertiesCollection(private val properties: Map, Any?> = empt } } - class PropertyKeyDelegate(private val defaultValue: T? = null) { + class PropertyKeyDelegate(private val getDefaultValue: PropertiesCollection.() -> T?) { + constructor(defaultValue: T?) : this({ defaultValue }) + operator fun getValue(thisRef: Any?, property: KProperty<*>): Key = - Key(property.name, defaultValue) + Key(property.name, getDefaultValue) } class PropertyKeyCopyDelegate(val source: Key) { @@ -36,8 +40,7 @@ open class PropertiesCollection(private val properties: Map, Any?> = empt @Suppress("UNCHECKED_CAST") operator fun get(key: PropertiesCollection.Key): T? = - if (key.defaultValue == null) properties[key] as T? - else properties.getOrDefault(key, key.defaultValue) as T? + (properties[key] ?: if (properties.containsKey(key)) null else key.getDefaultValue(this)) as? T @Suppress("UNCHECKED_CAST") fun getNoDefault(key: PropertiesCollection.Key): T? = @@ -55,10 +58,11 @@ open class PropertiesCollection(private val properties: Map, Any?> = empt companion object { fun key(defaultValue: T? = null) = PropertyKeyDelegate(defaultValue) + fun key(getDefaultValue: PropertiesCollection.() -> T?) = PropertyKeyDelegate(getDefaultValue) fun keyCopy(source: Key) = PropertyKeyCopyDelegate(source) @JvmStatic - private val serialVersionUID = 0L + private val serialVersionUID = 1L } // properties builder base class (DSL for building properties collection)