Returned support for generic serializers in @UseSerializers (#4055)
Fixes Kotlin/kotlinx.serialization#1305
This commit is contained in:
+4
-2
@@ -46,12 +46,14 @@ abstract class AbstractSerialGenerator(val bindingContext: BindingContext, val c
|
|||||||
).toSet()
|
).toSet()
|
||||||
}
|
}
|
||||||
|
|
||||||
val additionalSerializersInScopeOfCurrentFile: Map<KotlinType, ClassDescriptor> by lazy {
|
val additionalSerializersInScopeOfCurrentFile: Map<Pair<ClassDescriptor, Boolean>, ClassDescriptor> by lazy {
|
||||||
getKClassListFromFileAnnotation(SerializationAnnotations.additionalSerializersFqName, currentDeclaration)
|
getKClassListFromFileAnnotation(SerializationAnnotations.additionalSerializersFqName, currentDeclaration)
|
||||||
.associateBy(
|
.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")
|
?: throw AssertionError("Argument for ${SerializationAnnotations.additionalSerializersFqName} does not implement KSerializer or does not provide serializer for concrete type")
|
||||||
|
descriptor to kotlinType!!.isMarkedNullable
|
||||||
},
|
},
|
||||||
{ it.toClassDescriptor!! }
|
{ it.toClassDescriptor!! }
|
||||||
)
|
)
|
||||||
|
|||||||
+2
-2
@@ -34,7 +34,7 @@ open class SerialTypeInfo(
|
|||||||
)
|
)
|
||||||
|
|
||||||
fun AbstractSerialGenerator.findAddOnSerializer(propertyType: KotlinType, module: ModuleDescriptor): ClassDescriptor? {
|
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)
|
if (propertyType in contextualKClassListInCurrentFile)
|
||||||
return module.getClassFromSerializationPackage(SpecialBuiltins.contextSerializer)
|
return module.getClassFromSerializationPackage(SpecialBuiltins.contextSerializer)
|
||||||
if (propertyType.toClassDescriptor?.annotations?.hasAnnotation(SerializationAnnotations.polymorphicFqName) == true)
|
if (propertyType.toClassDescriptor?.annotations?.hasAnnotation(SerializationAnnotations.polymorphicFqName) == true)
|
||||||
@@ -124,7 +124,7 @@ fun AbstractSerialGenerator.findTypeSerializerOrContextUnchecked(
|
|||||||
val annotations = kType.annotations
|
val annotations = kType.annotations
|
||||||
if (kType.isTypeParameter()) return null
|
if (kType.isTypeParameter()) return null
|
||||||
annotations.serializableWith(module)?.let { return it.toClassDescriptor }
|
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.isMarkedNullable) return findTypeSerializerOrContextUnchecked(module, kType.makeNotNullable())
|
||||||
if (kType in contextualKClassListInCurrentFile) return module.getClassFromSerializationPackage(SpecialBuiltins.contextSerializer)
|
if (kType in contextualKClassListInCurrentFile) return module.getClassFromSerializationPackage(SpecialBuiltins.contextSerializer)
|
||||||
return analyzeSpecialSerializers(module, annotations) ?: findTypeSerializer(module, kType)
|
return analyzeSpecialSerializers(module, annotations) ?: findTypeSerializer(module, kType)
|
||||||
|
|||||||
Reference in New Issue
Block a user