From 20bbcd5d5ac4cf7c4359df0d46bed5930ef83a83 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Wed, 13 May 2020 21:22:44 +0200 Subject: [PATCH] Implement copied key with ability to take default from source config --- .../experimental/util/propertiesCollection.kt | 25 ++++++++++++++++--- .../experimental/test/ConfigurationsTest.kt | 19 ++++++++++++-- 2 files changed, 39 insertions(+), 5 deletions(-) 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 3972845544a..e41c17de831 100644 --- a/libraries/scripting/common/src/kotlin/script/experimental/util/propertiesCollection.kt +++ b/libraries/scripting/common/src/kotlin/script/experimental/util/propertiesCollection.kt @@ -37,6 +37,18 @@ open class PropertiesCollection(protected var properties: Map, Any?> = em getDefaultValue: PropertiesCollection.() -> T? ) : Key(name, getDefaultValue) + class CopiedKey( + source: Key, + getSourceProperties: PropertiesCollection.() -> PropertiesCollection? + ) : Key( + source.name, + { + val sourceProperties = getSourceProperties() + if (sourceProperties == null) source.getDefaultValue(this) + else sourceProperties.get(source) + } + ) + class PropertyKeyDelegate(private val getDefaultValue: PropertiesCollection.() -> T?, val isTransient: Boolean = false) { constructor(defaultValue: T?, isTransient: Boolean = false) : this({ defaultValue }, isTransient) @@ -45,8 +57,10 @@ open class PropertiesCollection(protected var properties: Map, Any?> = em else Key(property.name, getDefaultValue) } - class PropertyKeyCopyDelegate(val source: Key) { - operator fun getValue(thisRef: Any?, property: KProperty<*>): Key = source + class PropertyKeyCopyDelegate( + val source: Key, val getSourceProperties: PropertiesCollection.() -> PropertiesCollection? = { null } + ) { + operator fun getValue(thisRef: Any?, property: KProperty<*>): Key = CopiedKey(source, getSourceProperties) } @Suppress("UNCHECKED_CAST") @@ -87,7 +101,12 @@ open class PropertiesCollection(protected var properties: Map, Any?> = em fun key(getDefaultValue: PropertiesCollection.() -> T?, isTransient: Boolean = false): PropertyKeyDelegate = PropertyKeyDelegate(getDefaultValue, isTransient) - fun keyCopy(source: Key): PropertyKeyCopyDelegate = PropertyKeyCopyDelegate(source) +// fun keyCopy(source: Key): PropertyKeyCopyDelegate = PropertyKeyCopyDelegate(source) + + fun keyCopy( + source: Key, getSourceProperties: PropertiesCollection.() -> PropertiesCollection? = { null } + ): PropertyKeyCopyDelegate = + PropertyKeyCopyDelegate(source, getSourceProperties) @JvmStatic private val serialVersionUID = 1L diff --git a/libraries/scripting/common/test/kotlin/script/experimental/test/ConfigurationsTest.kt b/libraries/scripting/common/test/kotlin/script/experimental/test/ConfigurationsTest.kt index e6aa9828544..73dfde230db 100644 --- a/libraries/scripting/common/test/kotlin/script/experimental/test/ConfigurationsTest.kt +++ b/libraries/scripting/common/test/kotlin/script/experimental/test/ConfigurationsTest.kt @@ -7,6 +7,8 @@ package kotlin.script.experimental.test import junit.framework.TestCase import org.junit.Test +import kotlin.script.experimental.api.ScriptCompilationConfiguration +import kotlin.script.experimental.api.ScriptCompilationConfigurationKeys import kotlin.script.experimental.host.ScriptingHostConfiguration import kotlin.script.experimental.host.ScriptingHostConfigurationKeys import kotlin.script.experimental.host.withDefaultsFrom @@ -23,6 +25,7 @@ class ConfigurationsTest : TestCase() { val c2 = ScriptingHostConfiguration { p1(2) p2("yes") + p4("local") } assertEquals(c1, c1.withDefaultsFrom(c0)) @@ -35,8 +38,20 @@ class ConfigurationsTest : TestCase() { assertEquals(1, c1c2[ScriptingHostConfiguration.p1]) assertEquals("yes", c1c2[ScriptingHostConfiguration.p2]) assertEquals(2, c2c1[ScriptingHostConfiguration.p1]) + + assertEquals("from delegated", c1[ScriptingHostConfiguration.p4]) + assertEquals("local", c2[ScriptingHostConfiguration.p4]) } } -private val ScriptingHostConfigurationKeys.p1 by PropertiesCollection.key(-1) -private val ScriptingHostConfigurationKeys.p2 by PropertiesCollection.key("-") +private val ScriptingHostConfigurationKeys.p1 by PropertiesCollection.key(-1) +private val ScriptingHostConfigurationKeys.p2 by PropertiesCollection.key("-") + +private val ScriptCompilationConfigurationKeys.p3 by PropertiesCollection.key() + +private val delegatedConfig = ScriptCompilationConfiguration { + p3("from delegated") +} + +private val ScriptingHostConfigurationKeys.p4 by PropertiesCollection.keyCopy(ScriptCompilationConfiguration.p3, { delegatedConfig }) +