Skip to content

Commit 1aead70

Browse files
committed
Tidy up the code a bit (and use the cast method on the serializer to avoid casting warnings). Use a map to allow faster lookup of serializers to class (to allow for overlapping hierarchies).
1 parent 28c8fcd commit 1aead70

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

core/commonMain/src/kotlinx/serialization/modules/PolymorphicModuleBuilder.kt

+7-6
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class PolymorphicModuleBuilder<in Base : Any> @PublishedApi internal cons
1919
private val baseClass: KClass<Base>,
2020
private val baseSerializer: KSerializer<Base>? = null
2121
) {
22-
private val subclasses: MutableList<Pair<KClass<out Base>, KSerializer<out Base>>> = mutableListOf()
22+
private val subclasses: MutableMap<KClass<out Base>, KSerializer<out Base>> = mutableMapOf()
2323
private var defaultSerializerProvider: ((Base) -> SerializationStrategy<Base>?)? = null
2424
private var defaultDeserializerProvider: ((String?) -> DeserializationStrategy<Base>?)? = null
2525

@@ -29,13 +29,14 @@ public class PolymorphicModuleBuilder<in Base : Any> @PublishedApi internal cons
2929
public fun <T : Base> subclass(subclass: KClass<T>, serializer: KSerializer<T>) {
3030

3131
if (serializer is SealedClassSerializer) {
32-
for ((subsubclass, subserializer) in serializer.class2Serializer.entries) {
33-
@Suppress("UNCHECKED_CAST")
34-
// We don't know the type here, but it matches if correct in the sealed serializer.
35-
subclass(subsubclass as KClass<T>, subserializer as KSerializer<T>)
32+
for ((subsubclass, subserializer) in serializer.class2Serializer) {
33+
// Allow for overlapping hierarchies (possible with sealed interfaces)
34+
if (subsubclass !in subclasses) {
35+
subclass(subsubclass, subserializer.cast())
36+
}
3637
}
3738
} else {
38-
subclasses.add(subclass to serializer)
39+
subclasses.put(subclass, serializer)
3940
}
4041
}
4142

0 commit comments

Comments
 (0)