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
This commit is contained in:
Leonid Startsev
2019-02-25 19:12:47 +03:00
parent f9813af3ff
commit 472d91e0de
@@ -154,7 +154,7 @@ object KSerializerDescriptorResolver {
if (classDescriptor.declaredTypeParameters.isNotEmpty() && if (classDescriptor.declaredTypeParameters.isNotEmpty() &&
findSerializerConstructorForTypeArgumentsSerializers(thisDescriptor, onlyIfSynthetic = true) != null 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 // create properties typeSerial0, typeSerial1, etc... for storing generic arguments' serializers
private fun createLocalSerializersFieldsDescriptors(serializableDescriptor: ClassDescriptor, serializerDescriptor: ClassDescriptor): List<PropertyDescriptor> { private fun createLocalSerializersFieldsDescriptor(
name: Name,
serializableDescriptor: ClassDescriptor,
serializerDescriptor: ClassDescriptor
): List<PropertyDescriptor> {
if (serializableDescriptor.declaredTypeParameters.isEmpty()) return emptyList() if (serializableDescriptor.declaredTypeParameters.isEmpty()) return emptyList()
val serializerClass = serializableDescriptor.getClassFromSerializationPackage(SerialEntityNames.KSERIALIZER_CLASS) val serializerClass = serializableDescriptor.getClassFromSerializationPackage(SerialEntityNames.KSERIALIZER_CLASS)
return serializerDescriptor.declaredTypeParameters.mapIndexed { index, param -> val index = name.identifier.removePrefix(typeArgPrefix).toIntOrNull() ?: return emptyList()
val pType = val param = serializerDescriptor.declaredTypeParameters[index]
KotlinTypeFactory.simpleNotNullType( val pType =
Annotations.EMPTY, KotlinTypeFactory.simpleNotNullType(
serializerClass, Annotations.EMPTY,
listOf(TypeProjectionImpl(param.defaultType)) serializerClass,
) listOf(TypeProjectionImpl(param.defaultType))
SimpleSyntheticPropertyDescriptor(serializerDescriptor, "$typeArgPrefix$index", pType) )
} val desc = SimpleSyntheticPropertyDescriptor(serializerDescriptor, "$typeArgPrefix$index", pType)
return listOf(desc)
} }
} }