From 472d91e0defe5aeae97073cd6df6e6b3ef75fb09 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Mon, 25 Feb 2019 19:12:47 +0300 Subject: [PATCH] Do not return whole list of generated property descriptors for type arguments' serializers when only one name is needed. Fixes https://github.com/Kotlin/kotlinx.serialization/issues/383 --- .../resolve/KSerializerDescriptorResolver.kt | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt index 5488cc44327..3cd3c5ec7c8 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt @@ -154,7 +154,7 @@ object KSerializerDescriptorResolver { if (classDescriptor.declaredTypeParameters.isNotEmpty() && findSerializerConstructorForTypeArgumentsSerializers(thisDescriptor, onlyIfSynthetic = true) != null ) { - result.addAll(createLocalSerializersFieldsDescriptors(classDescriptor, thisDescriptor)) + result.addAll(createLocalSerializersFieldsDescriptor(name, classDescriptor, thisDescriptor)) } } @@ -547,17 +547,22 @@ object KSerializerDescriptorResolver { } // create properties typeSerial0, typeSerial1, etc... for storing generic arguments' serializers - private fun createLocalSerializersFieldsDescriptors(serializableDescriptor: ClassDescriptor, serializerDescriptor: ClassDescriptor): List { + private fun createLocalSerializersFieldsDescriptor( + name: Name, + serializableDescriptor: ClassDescriptor, + serializerDescriptor: ClassDescriptor + ): List { if (serializableDescriptor.declaredTypeParameters.isEmpty()) return emptyList() val serializerClass = serializableDescriptor.getClassFromSerializationPackage(SerialEntityNames.KSERIALIZER_CLASS) - return serializerDescriptor.declaredTypeParameters.mapIndexed { index, param -> - val pType = - KotlinTypeFactory.simpleNotNullType( - Annotations.EMPTY, - serializerClass, - listOf(TypeProjectionImpl(param.defaultType)) - ) - SimpleSyntheticPropertyDescriptor(serializerDescriptor, "$typeArgPrefix$index", pType) - } + val index = name.identifier.removePrefix(typeArgPrefix).toIntOrNull() ?: return emptyList() + val param = serializerDescriptor.declaredTypeParameters[index] + val pType = + KotlinTypeFactory.simpleNotNullType( + Annotations.EMPTY, + serializerClass, + listOf(TypeProjectionImpl(param.defaultType)) + ) + val desc = SimpleSyntheticPropertyDescriptor(serializerDescriptor, "$typeArgPrefix$index", pType) + return listOf(desc) } }