From 122d04b9faad1302267b627277681445ac8fe655 Mon Sep 17 00:00:00 2001 From: Sergey Shanshin Date: Tue, 26 Jan 2021 14:57:40 +0300 Subject: [PATCH] Returned support for generic serializers in @UseSerializers (#4055) Fixes Kotlin/kotlinx.serialization#1305 --- .../compiler/backend/common/AbstractSerialGenerator.kt | 6 ++++-- .../serialization/compiler/backend/common/TypeUtil.kt | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/AbstractSerialGenerator.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/AbstractSerialGenerator.kt index d3d5c2a0303..c0049fa9685 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/AbstractSerialGenerator.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/AbstractSerialGenerator.kt @@ -46,12 +46,14 @@ abstract class AbstractSerialGenerator(val bindingContext: BindingContext, val c ).toSet() } - val additionalSerializersInScopeOfCurrentFile: Map by lazy { + val additionalSerializersInScopeOfCurrentFile: Map, 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!! } ) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/TypeUtil.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/TypeUtil.kt index 4535c4ce7c9..853d1bee728 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/TypeUtil.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/TypeUtil.kt @@ -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)