diff options
Diffstat (limited to 'core/commonMain/src/kotlinx/serialization/internal/Tagged.kt')
-rw-r--r-- | core/commonMain/src/kotlinx/serialization/internal/Tagged.kt | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/core/commonMain/src/kotlinx/serialization/internal/Tagged.kt b/core/commonMain/src/kotlinx/serialization/internal/Tagged.kt index e2e8d8f9..cf71388c 100644 --- a/core/commonMain/src/kotlinx/serialization/internal/Tagged.kt +++ b/core/commonMain/src/kotlinx/serialization/internal/Tagged.kt @@ -24,12 +24,13 @@ public abstract class TaggedEncoder<Tag : Any?> : Encoder, CompositeEncoder { protected abstract fun SerialDescriptor.getTag(index: Int): Tag override val serializersModule: SerializersModule - get() = EmptySerializersModule + get() = EmptySerializersModule() // ---- API ---- protected open fun encodeTaggedValue(tag: Tag, value: Any): Unit = throw SerializationException("Non-serializable ${value::class} is not supported by ${this::class} encoder") + protected open fun encodeTaggedNonNullMark(tag: Tag) {} protected open fun encodeTaggedNull(tag: Tag): Unit = throw SerializationException("null is not supported") protected open fun encodeTaggedInt(tag: Tag, value: Int): Unit = encodeTaggedValue(tag, value) protected open fun encodeTaggedByte(tag: Tag, value: Byte): Unit = encodeTaggedValue(tag, value) @@ -50,8 +51,8 @@ public abstract class TaggedEncoder<Tag : Any?> : Encoder, CompositeEncoder { protected open fun encodeTaggedInline(tag: Tag, inlineDescriptor: SerialDescriptor): Encoder = this.apply { pushTag(tag) } - final override fun encodeInline(inlineDescriptor: SerialDescriptor): Encoder = - encodeTaggedInline(popTag(), inlineDescriptor) + override fun encodeInline(descriptor: SerialDescriptor): Encoder = + encodeTaggedInline(popTag(), descriptor) // ---- Implementation of low-level API ---- @@ -61,7 +62,7 @@ public abstract class TaggedEncoder<Tag : Any?> : Encoder, CompositeEncoder { return true } - final override fun encodeNotNullMark() {} // Does nothing, open because is not really required + open override fun encodeNotNullMark(): Unit = encodeTaggedNonNullMark(currentTag) open override fun encodeNull(): Unit = encodeTaggedNull(popTag()) final override fun encodeBoolean(value: Boolean): Unit = encodeTaggedBoolean(popTag(), value) final override fun encodeByte(value: Byte): Unit = encodeTaggedByte(popTag(), value) @@ -177,7 +178,7 @@ public abstract class NamedValueEncoder : TaggedEncoder<String>() { @InternalSerializationApi public abstract class TaggedDecoder<Tag : Any?> : Decoder, CompositeDecoder { override val serializersModule: SerializersModule - get() = EmptySerializersModule + get() = EmptySerializersModule() protected abstract fun SerialDescriptor.getTag(index: Int): Tag @@ -205,11 +206,10 @@ public abstract class TaggedDecoder<Tag : Any?> : Decoder, CompositeDecoder { protected open fun <T : Any?> decodeSerializableValue(deserializer: DeserializationStrategy<T>, previousValue: T?): T = decodeSerializableValue(deserializer) - // ---- Implementation of low-level API ---- - final override fun decodeInline(inlineDescriptor: SerialDescriptor): Decoder = - decodeTaggedInline(popTag(), inlineDescriptor) + override fun decodeInline(descriptor: SerialDescriptor): Decoder = + decodeTaggedInline(popTag(), descriptor) // TODO this method should be overridden by any sane format that supports top-level nulls override fun decodeNotNullMark(): Boolean { @@ -283,13 +283,11 @@ public abstract class TaggedDecoder<Tag : Any?> : Decoder, CompositeDecoder { index: Int, deserializer: DeserializationStrategy<T?>, previousValue: T? - ): T? = - tagBlock(descriptor.getTag(index)) { - if (decodeNotNullMark()) decodeSerializableValue( - deserializer, - previousValue - ) else decodeNull() + ): T? = tagBlock(descriptor.getTag(index)) { + decodeIfNullable(deserializer) { + decodeSerializableValue(deserializer, previousValue) } + } private fun <E> tagBlock(tag: Tag, block: () -> E): E { pushTag(tag) @@ -330,7 +328,7 @@ public abstract class NamedValueDecoder : TaggedDecoder<String>() { final override fun SerialDescriptor.getTag(index: Int): String = nested(elementName(this, index)) protected fun nested(nestedName: String): String = composeName(currentTagOrNull ?: "", nestedName) - protected open fun elementName(desc: SerialDescriptor, index: Int): String = desc.getElementName(index) + protected open fun elementName(descriptor: SerialDescriptor, index: Int): String = descriptor.getElementName(index) protected open fun composeName(parentName: String, childName: String): String = if (parentName.isEmpty()) childName else "$parentName.$childName" } |