diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/Setting.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/Setting.kt index cac3cace6..af9709d68 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/Setting.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/Setting.kt @@ -11,10 +11,12 @@ package net.mamoe.mirai.console.setting +import kotlinx.serialization.KSerializer import net.mamoe.mirai.console.setting.internal.cast import net.mamoe.mirai.console.setting.internal.valueFromKTypeImpl import net.mamoe.mirai.console.setting.internal.valueImpl import net.mamoe.mirai.utils.MiraiExperimentalAPI +import java.util.* import kotlin.internal.LowPriorityInOverloadResolution import kotlin.reflect.KProperty import kotlin.reflect.KType @@ -25,10 +27,12 @@ import kotlin.reflect.typeOf // Shows public APIs such as deciding when to auto-save. abstract class Setting : SettingImpl() { - operator fun Value.provideDelegate(thisRef: Any?, property: KProperty<*>): Value { + operator fun SerializerAwareValue.provideDelegate( + thisRef: Any?, + property: KProperty<*> + ): SerializerAwareValue { @Suppress("UNCHECKED_CAST") - valueNodes.add(Node(property as KProperty, value as Value, TODO())) - // TODO: 2020/6/21 track on + valueNodes.add(Node(property as KProperty, this, this.serializer)) return this } } @@ -43,18 +47,16 @@ internal abstract class SettingImpl { internal class Node( val property: KProperty, val value: Value, - val serializer: ValueSerializer + val updaterSerializer: KSerializer ) - internal val valueNodes: MutableList> = kotlin.run { - TODO("reflection") - } + internal val valueNodes: MutableList> = Collections.synchronizedList(mutableListOf()) /** * flatten */ internal fun onValueChanged(value: Value<*>) { - + // TODO: 2020/6/22 } } @@ -63,7 +65,7 @@ internal abstract class SettingImpl { // TODO: 2020/6/19 CODEGEN -fun Setting.value(default: Int): IntValue = valueImpl(default) +fun Setting.value(default: Int): SerializableValue = valueImpl(default) //// endregion Setting.value primitives CODEGEN //// diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/Value.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/Value.kt index 270914b40..0458bfab6 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/Value.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/Value.kt @@ -29,6 +29,24 @@ interface Value { var value: T } +/** + * Typically returned by [Setting.value] functions. + */ +class SerializableValue( + delegate: Value, + /** + * The serializer used to update and dump [delegate] + */ + override val serializer: KSerializer +) : Value by delegate, SerializerAwareValue + +/** + * @see SerializableValue + */ +interface SerializerAwareValue : Value { + val serializer: KSerializer +} + inline operator fun Value.getValue(mySetting: Any?, property: KProperty<*>): T = value inline operator fun Value.setValue(mySetting: Any?, property: KProperty<*>, value: T) { this.value = value diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/internal/_Setting.value.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/internal/_Setting.value.kt index 76e8e5331..019b42489 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/internal/_Setting.value.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/internal/_Setting.value.kt @@ -9,7 +9,8 @@ package net.mamoe.mirai.console.setting.internal -import net.mamoe.mirai.console.setting.IntValue +import kotlinx.serialization.builtins.serializer +import net.mamoe.mirai.console.setting.SerializableValue import net.mamoe.mirai.console.setting.Setting @@ -17,8 +18,14 @@ import net.mamoe.mirai.console.setting.Setting // TODO: 2020/6/21 CODEGEN -internal fun Setting.valueImpl(default: Int): IntValue = object : IntValueImpl(default) { - override fun onChanged() = this@valueImpl.onValueChanged(this) +internal fun Setting.valueImpl(default: Int): SerializableValue { + val instance = object : IntValueImpl(default) { + override fun onChanged() = this@valueImpl.onValueChanged(this) + } + return SerializableValue(instance, Int.serializer().map( + serializer = { instance.value }, + deserializer = { instance.value = it } + )) } //// endregion Setting.value primitives impl CODEGEN //// diff --git a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/internal/serializerUtil.kt b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/internal/serializerUtil.kt index 1abad6b95..454544929 100644 --- a/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/internal/serializerUtil.kt +++ b/backend/mirai-console/src/main/kotlin/net/mamoe/mirai/console/setting/internal/serializerUtil.kt @@ -13,8 +13,6 @@ import kotlinx.serialization.* import kotlin.reflect.KProperty import kotlin.reflect.full.findAnnotation -internal object SettingSerializerMark - internal val KProperty<*>.serialNameOrPropertyName: String get() = this.findAnnotation()?.value ?: this.name internal inline fun KSerializer.bind(