Skip to content

Commit 1cff25e

Browse files
authored
Support tagged not null marks (#1954)
Currently, it's not possible to override the not null mark behavior of the tagged encoder. Added ability to override it.
1 parent 9e2e16e commit 1cff25e

File tree

3 files changed

+7
-2
lines changed

3 files changed

+7
-2
lines changed

core/api/kotlinx-serialization-core.api

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1087,7 +1087,7 @@ public abstract class kotlinx/serialization/internal/TaggedEncoder : kotlinx/ser
10871087
public final fun encodeIntElement (Lkotlinx/serialization/descriptors/SerialDescriptor;II)V
10881088
public final fun encodeLong (J)V
10891089
public final fun encodeLongElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IJ)V
1090-
public final fun encodeNotNullMark ()V
1090+
public fun encodeNotNullMark ()V
10911091
public fun encodeNull ()V
10921092
public fun encodeNullableSerializableElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
10931093
public fun encodeNullableSerializableValue (Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
@@ -1106,6 +1106,7 @@ public abstract class kotlinx/serialization/internal/TaggedEncoder : kotlinx/ser
11061106
protected fun encodeTaggedInline (Ljava/lang/Object;Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/encoding/Encoder;
11071107
protected fun encodeTaggedInt (Ljava/lang/Object;I)V
11081108
protected fun encodeTaggedLong (Ljava/lang/Object;J)V
1109+
protected fun encodeTaggedNonNullMark (Ljava/lang/Object;)V
11091110
protected fun encodeTaggedNull (Ljava/lang/Object;)V
11101111
protected fun encodeTaggedShort (Ljava/lang/Object;S)V
11111112
protected fun encodeTaggedString (Ljava/lang/Object;Ljava/lang/String;)V

core/commonMain/src/kotlinx/serialization/internal/Tagged.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public abstract class TaggedEncoder<Tag : Any?> : Encoder, CompositeEncoder {
3030
protected open fun encodeTaggedValue(tag: Tag, value: Any): Unit =
3131
throw SerializationException("Non-serializable ${value::class} is not supported by ${this::class} encoder")
3232

33+
protected open fun encodeTaggedNonNullMark(tag: Tag) {}
3334
protected open fun encodeTaggedNull(tag: Tag): Unit = throw SerializationException("null is not supported")
3435
protected open fun encodeTaggedInt(tag: Tag, value: Int): Unit = encodeTaggedValue(tag, value)
3536
protected open fun encodeTaggedByte(tag: Tag, value: Byte): Unit = encodeTaggedValue(tag, value)
@@ -61,7 +62,7 @@ public abstract class TaggedEncoder<Tag : Any?> : Encoder, CompositeEncoder {
6162
return true
6263
}
6364

64-
final override fun encodeNotNullMark() {} // Does nothing, open because is not really required
65+
open override fun encodeNotNullMark(): Unit = encodeTaggedNonNullMark(currentTag)
6566
open override fun encodeNull(): Unit = encodeTaggedNull(popTag())
6667
final override fun encodeBoolean(value: Boolean): Unit = encodeTaggedBoolean(popTag(), value)
6768
final override fun encodeByte(value: Byte): Unit = encodeTaggedByte(popTag(), value)

formats/json/commonMain/src/kotlinx/serialization/json/internal/TreeJsonEncoder.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@ private sealed class AbstractJsonTreeEncoder(
4646
abstract fun putElement(key: String, element: JsonElement)
4747
abstract fun getCurrent(): JsonElement
4848

49+
// has no tag when encoding a nullable element at root level
50+
override fun encodeNotNullMark() {}
4951

52+
// has no tag when encoding a nullable element at root level
5053
override fun encodeNull() {
5154
val tag = currentTagOrNull ?: return nodeConsumer(JsonNull)
5255
encodeTaggedNull(tag)

0 commit comments

Comments
 (0)