Skip to content

Commit

Permalink
feat: Make accessible the original descriptor when nullable (#2631)
Browse files Browse the repository at this point in the history
  • Loading branch information
Chuckame committed Apr 17, 2024
1 parent 84f5e8a commit 5d22d74
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 0 deletions.
1 change: 1 addition & 0 deletions core/api/kotlinx-serialization-core.api
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,7 @@ public final class kotlinx/serialization/descriptors/SerialDescriptorsKt {
public static final fun buildSerialDescriptor (Ljava/lang/String;Lkotlinx/serialization/descriptors/SerialKind;[Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlin/jvm/functions/Function1;)Lkotlinx/serialization/descriptors/SerialDescriptor;
public static synthetic fun buildSerialDescriptor$default (Ljava/lang/String;Lkotlinx/serialization/descriptors/SerialKind;[Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/serialization/descriptors/SerialDescriptor;
public static final fun getNullable (Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/descriptors/SerialDescriptor;
public static final fun getUnwrapNullable (Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/descriptors/SerialDescriptor;
public static final fun listSerialDescriptor (Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/descriptors/SerialDescriptor;
public static final fun mapSerialDescriptor (Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/descriptors/SerialDescriptor;
public static final fun serialDescriptor (Lkotlin/reflect/KType;)Lkotlinx/serialization/descriptors/SerialDescriptor;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,20 @@ public val SerialDescriptor.nullable: SerialDescriptor
return SerialDescriptorForNullable(this)
}

/**
* Returns non-nullable serial descriptor for the type, if [this] is a nullable descriptor created automatically or
* with `.nullable` extensions on a descriptor or serializer. Otherwise, returns [this].
*
* @see SerialDescriptor.nullable
* @see KSerializer.nullable
*/
@ExperimentalSerializationApi
public val SerialDescriptor.unwrapNullable: SerialDescriptor
get() = when (this) {
is SerialDescriptorForNullable -> original
else -> this
}

/**
* Builder for [SerialDescriptor] for user-defined serializers.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,4 +94,24 @@ class SerialDescriptorBuilderTest {
assertTrue(descriptor.isNullable)
assertEquals("my.Simple?", descriptor.serialName)
}

@Test
fun testUnwrapNullable() {
listOf(
buildClassSerialDescriptor("my.Simple") {},
Boolean.serializer().descriptor,
String.serializer().descriptor,
ListSerializer(Int.serializer()).descriptor,
).forEach { originalDescriptor ->
// Unwrapping nullable when it is not nullable should return the same descriptor (no-op operation)
assertSame(originalDescriptor.unwrapNullable, originalDescriptor)

// Unwrapping nullable when it is nullable should return the original descriptor
assertSame(originalDescriptor.nullable.unwrapNullable, originalDescriptor)
}

@Serializable class Type(val field: String?)
// Unwrapping nullable of a nullable field should return the original non-null descriptor
assertSame(Type.serializer().descriptor.getElementDescriptor(0).unwrapNullable, String.serializer().descriptor)
}
}

0 comments on commit 5d22d74

Please sign in to comment.