Returned support for generic serializers in @UseSerializers (#4055)

Fixes Kotlin/kotlinx.serialization#1305
This commit is contained in:
Sergey Shanshin
2021-01-26 14:57:40 +03:00
committed by GitHub
parent 1a4b327210
commit 122d04b9fa
2 changed files with 6 additions and 4 deletions
@@ -46,12 +46,14 @@ abstract class AbstractSerialGenerator(val bindingContext: BindingContext, val c
).toSet()
}
val additionalSerializersInScopeOfCurrentFile: Map<KotlinType, ClassDescriptor> by lazy {
val additionalSerializersInScopeOfCurrentFile: Map<Pair<ClassDescriptor, Boolean>, ClassDescriptor> by lazy {
getKClassListFromFileAnnotation(SerializationAnnotations.additionalSerializersFqName, currentDeclaration)
.associateBy(
{
it.supertypes().find(::isKSerializer)?.arguments?.firstOrNull()?.type
val kotlinType = it.supertypes().find(::isKSerializer)?.arguments?.firstOrNull()?.type
val descriptor = kotlinType.toClassDescriptor
?: throw AssertionError("Argument for ${SerializationAnnotations.additionalSerializersFqName} does not implement KSerializer or does not provide serializer for concrete type")
descriptor to kotlinType!!.isMarkedNullable
},
{ it.toClassDescriptor!! }
)
@@ -34,7 +34,7 @@ open class SerialTypeInfo(
)
fun AbstractSerialGenerator.findAddOnSerializer(propertyType: KotlinType, module: ModuleDescriptor): ClassDescriptor? {
additionalSerializersInScopeOfCurrentFile[propertyType]?.let { return it }
additionalSerializersInScopeOfCurrentFile[propertyType.toClassDescriptor to propertyType.isMarkedNullable]?.let { return it }
if (propertyType in contextualKClassListInCurrentFile)
return module.getClassFromSerializationPackage(SpecialBuiltins.contextSerializer)
if (propertyType.toClassDescriptor?.annotations?.hasAnnotation(SerializationAnnotations.polymorphicFqName) == true)
@@ -124,7 +124,7 @@ fun AbstractSerialGenerator.findTypeSerializerOrContextUnchecked(
val annotations = kType.annotations
if (kType.isTypeParameter()) return null
annotations.serializableWith(module)?.let { return it.toClassDescriptor }
additionalSerializersInScopeOfCurrentFile[kType]?.let { return it }
additionalSerializersInScopeOfCurrentFile[kType.toClassDescriptor to kType.isMarkedNullable]?.let { return it }
if (kType.isMarkedNullable) return findTypeSerializerOrContextUnchecked(module, kType.makeNotNullable())
if (kType in contextualKClassListInCurrentFile) return module.getClassFromSerializationPackage(SpecialBuiltins.contextSerializer)
return analyzeSpecialSerializers(module, annotations) ?: findTypeSerializer(module, kType)