Associate serializers added via @UseSerializers by argument class, not type

Use class instead of type because MyType<T> and MyType<Int> are different types, therefore map lookup was failing.

Fixes https://github.com/Kotlin/kotlinx.serialization/issues/533
This commit is contained in:
Leonid Startsev
2019-08-30 18:12:04 +03:00
parent 855a867893
commit 3c9a02e271
2 changed files with 5 additions and 5 deletions
@@ -38,12 +38,12 @@ abstract class AbstractSerialGenerator(val bindingContext: BindingContext, val c
).toSet()
}
val additionalSerializersInScopeOfCurrentFile: Map<KotlinType, ClassDescriptor> by lazy {
val additionalSerializersInScopeOfCurrentFile: Map<ClassDescriptor, ClassDescriptor> by lazy {
getKClassListFromFileAnnotation(SerializationAnnotations.additionalSerializersFqName, currentDeclaration)
.associateBy(
{
it.supertypes().find(::isKSerializer)?.arguments?.firstOrNull()?.type
?: throw AssertionError("Argument for ${SerializationAnnotations.additionalSerializersFqName} does not implement KSerializer")
it.supertypes().find(::isKSerializer)?.arguments?.firstOrNull()?.type.toClassDescriptor
?: throw AssertionError("Argument for ${SerializationAnnotations.additionalSerializersFqName} does not implement KSerializer or does not provide serializer for concrete type")
},
{ it.toClassDescriptor!! }
)
@@ -46,7 +46,7 @@ open class SerialTypeInfo(
)
fun AbstractSerialGenerator.findAddOnSerializer(propertyType: KotlinType, module: ModuleDescriptor): ClassDescriptor? {
additionalSerializersInScopeOfCurrentFile[propertyType]?.let { return it }
additionalSerializersInScopeOfCurrentFile[propertyType.toClassDescriptor]?.let { return it }
if (propertyType in contextualKClassListInCurrentFile)
return module.getClassFromSerializationPackage(SpecialBuiltins.contextSerializer)
if (propertyType.toClassDescriptor?.annotations?.hasAnnotation(SerializationAnnotations.polymorphicFqName) == true)
@@ -136,7 +136,7 @@ fun AbstractSerialGenerator.findTypeSerializerOrContextUnchecked(
if (kType.isTypeParameter()) return null
if (kType.isMarkedNullable) return findTypeSerializerOrContextUnchecked(module, kType.makeNotNullable())
annotations.serializableWith(module)?.let { return it.toClassDescriptor }
additionalSerializersInScopeOfCurrentFile[kType]?.let { return it }
additionalSerializersInScopeOfCurrentFile[kType.toClassDescriptor]?.let { return it }
if (kType in contextualKClassListInCurrentFile) return module.getClassFromSerializationPackage(SpecialBuiltins.contextSerializer)
return analyzeSpecialSerializers(module, annotations) ?: findTypeSerializer(module, kType)
}