From 3c9a02e271e235e02cc228803ed5b3e544bb861a Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Fri, 30 Aug 2019 18:12:04 +0300 Subject: [PATCH] Associate serializers added via @UseSerializers by argument class, not type Use class instead of type because MyType and MyType are different types, therefore map lookup was failing. Fixes https://github.com/Kotlin/kotlinx.serialization/issues/533 --- .../compiler/backend/common/AbstractSerialGenerator.kt | 6 +++--- .../serialization/compiler/backend/common/TypeUtil.kt | 4 ++-- 2 files changed, 5 insertions(+), 5 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 fd123b97a8e..b44546be349 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 @@ -38,12 +38,12 @@ abstract class AbstractSerialGenerator(val bindingContext: BindingContext, val c ).toSet() } - val additionalSerializersInScopeOfCurrentFile: Map by lazy { + val additionalSerializersInScopeOfCurrentFile: Map 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!! } ) 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 cb19d4bef34..2fc7c073251 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 @@ -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) }