Add support of nullable serializers to UseSerializers annotation (#3898)
Fixes https://github.com/Kotlin/kotlinx.serialization/issues/984
This commit is contained in:
+3
-3
@@ -46,11 +46,11 @@ abstract class AbstractSerialGenerator(val bindingContext: BindingContext, val c
|
||||
).toSet()
|
||||
}
|
||||
|
||||
val additionalSerializersInScopeOfCurrentFile: Map<ClassDescriptor, ClassDescriptor> by lazy {
|
||||
val additionalSerializersInScopeOfCurrentFile: Map<KotlinType, ClassDescriptor> by lazy {
|
||||
getKClassListFromFileAnnotation(SerializationAnnotations.additionalSerializersFqName, currentDeclaration)
|
||||
.associateBy(
|
||||
{
|
||||
it.supertypes().find(::isKSerializer)?.arguments?.firstOrNull()?.type.toClassDescriptor
|
||||
it.supertypes().find(::isKSerializer)?.arguments?.firstOrNull()?.type
|
||||
?: throw AssertionError("Argument for ${SerializationAnnotations.additionalSerializersFqName} does not implement KSerializer or does not provide serializer for concrete type")
|
||||
},
|
||||
{ it.toClassDescriptor!! }
|
||||
@@ -59,4 +59,4 @@ abstract class AbstractSerialGenerator(val bindingContext: BindingContext, val c
|
||||
|
||||
protected fun ClassDescriptor.getFuncDesc(funcName: String): Sequence<FunctionDescriptor> =
|
||||
unsubstitutedMemberScope.getDescriptorsFiltered { it == Name.identifier(funcName) }.asSequence().filterIsInstance<FunctionDescriptor>()
|
||||
}
|
||||
}
|
||||
|
||||
+6
-3
@@ -34,7 +34,7 @@ open class SerialTypeInfo(
|
||||
)
|
||||
|
||||
fun AbstractSerialGenerator.findAddOnSerializer(propertyType: KotlinType, module: ModuleDescriptor): ClassDescriptor? {
|
||||
additionalSerializersInScopeOfCurrentFile[propertyType.toClassDescriptor]?.let { return it }
|
||||
additionalSerializersInScopeOfCurrentFile[propertyType]?.let { return it }
|
||||
if (propertyType in contextualKClassListInCurrentFile)
|
||||
return module.getClassFromSerializationPackage(SpecialBuiltins.contextSerializer)
|
||||
if (propertyType.toClassDescriptor?.annotations?.hasAnnotation(SerializationAnnotations.polymorphicFqName) == true)
|
||||
@@ -123,9 +123,12 @@ fun AbstractSerialGenerator.findTypeSerializerOrContextUnchecked(
|
||||
): ClassDescriptor? {
|
||||
val annotations = kType.annotations
|
||||
if (kType.isTypeParameter()) return null
|
||||
if (kType.isMarkedNullable) return findTypeSerializerOrContextUnchecked(module, kType.makeNotNullable())
|
||||
annotations.serializableWith(module)?.let { return it.toClassDescriptor }
|
||||
additionalSerializersInScopeOfCurrentFile[kType.toClassDescriptor]?.let { return it }
|
||||
additionalSerializersInScopeOfCurrentFile[kType]?.let { return it }
|
||||
if (!kType.isMarkedNullable) {
|
||||
additionalSerializersInScopeOfCurrentFile[kType.makeNullable()]?.let { return it }
|
||||
}
|
||||
|
||||
if (kType in contextualKClassListInCurrentFile) return module.getClassFromSerializationPackage(SpecialBuiltins.contextSerializer)
|
||||
return analyzeSpecialSerializers(module, annotations) ?: findTypeSerializer(module, kType)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user