Skip to content

Commit c827df9

Browse files
authored
de-duplicate nullable/non-nullable SerialDescriptors after extraction (#111)
* de-duplicate nullable/non-nullable SerialDescriptors after extraction * simplify test example
1 parent b81cfb3 commit c827df9

File tree

2 files changed

+47
-23
lines changed

2 files changed

+47
-23
lines changed

modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/core/SerializerDescriptorsExtractor.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,7 @@ package dev.adamko.kxstsgen.core
22

33
import dev.adamko.kxstsgen.core.util.MutableMapWithDefaultPut
44
import kotlinx.serialization.KSerializer
5-
import kotlinx.serialization.descriptors.PolymorphicKind
6-
import kotlinx.serialization.descriptors.PrimitiveKind
7-
import kotlinx.serialization.descriptors.SerialDescriptor
8-
import kotlinx.serialization.descriptors.SerialKind
9-
import kotlinx.serialization.descriptors.StructureKind
10-
import kotlinx.serialization.descriptors.elementDescriptors
5+
import kotlinx.serialization.descriptors.*
116

127

138
/**
@@ -26,6 +21,8 @@ fun interface SerializerDescriptorsExtractor {
2621
serializer: KSerializer<*>
2722
): Set<SerialDescriptor> {
2823
return extractDescriptors(serializer.descriptor)
24+
.distinctBy { it.nullable }
25+
.toSet()
2926
}
3027

3128

modules/kxs-ts-gen-core/src/commonTest/kotlin/dev/adamko/kxstsgen/core/SerializerDescriptorsExtractorTest.kt

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import io.kotest.core.spec.style.FunSpec
55
import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder
66
import kotlinx.serialization.Serializable
77
import kotlinx.serialization.builtins.serializer
8+
import kotlinx.serialization.descriptors.SerialDescriptor
89

910
class SerializerDescriptorsExtractorTest : FunSpec({
1011

@@ -18,14 +19,7 @@ class SerializerDescriptorsExtractorTest : FunSpec({
1819

1920
val actual = SerializerDescriptorsExtractor.Default(Example1.Parent.serializer())
2021

21-
withClue(
22-
"""
23-
expected: ${expected.map { it.serialName }.sorted().joinToString()}
24-
actual: ${actual.map { it.serialName }.sorted().joinToString()}
25-
""".trimIndent()
26-
) {
27-
actual shouldContainExactlyInAnyOrder expected
28-
}
22+
actual shouldContainDescriptors expected
2923
}
3024

3125
test("Example2: given parent class, expect subclass property descriptor extracted") {
@@ -38,17 +32,36 @@ class SerializerDescriptorsExtractorTest : FunSpec({
3832

3933
val actual = SerializerDescriptorsExtractor.Default(Example2.Parent.serializer())
4034

41-
withClue(
42-
"""
43-
expected: ${expected.map { it.serialName }.sorted().joinToString()}
44-
actual: ${actual.map { it.serialName }.sorted().joinToString()}
45-
""".trimIndent()
46-
) {
47-
actual shouldContainExactlyInAnyOrder expected
48-
}
35+
actual shouldContainDescriptors expected
4936
}
5037

51-
})
38+
test("Example3: expect nullable/non-nullable SerialDescriptors be de-duplicated") {
39+
40+
val expected = listOf(
41+
Example3.SomeType.serializer().descriptor,
42+
Example3.TypeHolder.serializer().descriptor,
43+
String.serializer().descriptor,
44+
)
45+
46+
val actual = SerializerDescriptorsExtractor.Default(Example3.TypeHolder.serializer())
47+
48+
actual shouldContainDescriptors expected
49+
}
50+
}) {
51+
companion object {
52+
private infix fun Collection<SerialDescriptor>.shouldContainDescriptors(expected: Collection<SerialDescriptor>) {
53+
val actual = this
54+
withClue(
55+
"""
56+
expected: ${expected.map { it.serialName }.sorted().joinToString()}
57+
actual: ${actual.map { it.serialName }.sorted().joinToString()}
58+
""".trimIndent()
59+
) {
60+
actual shouldContainExactlyInAnyOrder expected
61+
}
62+
}
63+
}
64+
}
5265

5366

5467
@Suppress("unused")
@@ -78,3 +91,17 @@ private object Example2 {
7891
@Serializable
7992
class SubClass1(val n: Nested) : SealedSub()
8093
}
94+
95+
96+
@Suppress("unused")
97+
private object Example3 {
98+
99+
@Serializable
100+
class SomeType(val a: String)
101+
102+
@Serializable
103+
class TypeHolder(
104+
val required: SomeType,
105+
val optional: SomeType?,
106+
)
107+
}

0 commit comments

Comments
 (0)