summaryrefslogtreecommitdiff
path: root/core/commonMain/src/kotlinx/serialization/internal/Tagged.kt
diff options
context:
space:
mode:
Diffstat (limited to 'core/commonMain/src/kotlinx/serialization/internal/Tagged.kt')
-rw-r--r--core/commonMain/src/kotlinx/serialization/internal/Tagged.kt28
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"
}