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() &&
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<PropertyDescriptor> {
private fun createLocalSerializersFieldsDescriptor(
name: Name,
serializableDescriptor: ClassDescriptor,
serializerDescriptor: ClassDescriptor
): List<PropertyDescriptor> {
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)
}
}