override fun getFieldDescriptorTraits()

in smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/serde/XmlSerdeDescriptorGenerator.kt [64:141]


    override fun getFieldDescriptorTraits(
        member: MemberShape,
        targetShape: Shape,
        nameSuffix: String
    ): List<SdkFieldDescriptorTrait> {

        ctx.writer.addImport(
            RuntimeTypes.Serde.SerdeXml.XmlDeserializer,
            RuntimeTypes.Serde.SerdeXml.XmlSerialName,
        )

        val traitList = mutableListOf<SdkFieldDescriptorTrait>()

        val serialName = getSerialName(member, nameSuffix)
        traitList.add(SerdeXml.XmlSerialName, serialName.dq())

        val memberTarget = ctx.model.expectShape(member.target)
        val isNestedMap = memberTarget.isMapShape && targetShape.isMapShape && nameSuffix.isNotEmpty()
        val flattened = member.getTrait<XmlFlattenedTrait>()?.also {
            if (!isNestedMap) {
                traitList.add(it.toSdkTrait())
            }
        } != null
        member.getTrait<XmlAttributeTrait>()?.let { traitList.add(it.toSdkTrait()) }
        member.getTrait<XmlNamespaceTrait>()?.let { traitList.add(it.toSdkTrait()) }

        when (targetShape.type) {
            ShapeType.LIST, ShapeType.SET -> {
                val collectionMember = (targetShape as CollectionShape).member
                if (!flattened && collectionMember.hasTrait<XmlNameTrait>()) {
                    // flattened collections should only need the XmlSerialName trait since there is no <member> element
                    val memberName = collectionMember.expectTrait<XmlNameTrait>().value
                    traitList.add(SerdeXml.XmlCollectionName, memberName.dq())
                }

                if (collectionMember.hasTrait<XmlNamespaceTrait>()) {
                    val ns = collectionMember.expectTrait<XmlNamespaceTrait>()
                    val nsTrait = ns.toSdkTrait(SerdeXml.XmlCollectionValueNamespace)
                    traitList.add(nsTrait)
                }
            }
            ShapeType.MAP -> {
                val mapMember = targetShape as MapShape

                val customKeyName = mapMember.key.getTrait<XmlNameTrait>()?.value
                val customValueName = mapMember.value.getTrait<XmlNameTrait>()?.value

                val mapTraitArgs = when {
                    customKeyName != null && customValueName != null -> listOf("key = ${customKeyName.dq()}", "value = ${customValueName.dq()}")
                    customKeyName != null -> listOf("key = ${customKeyName.dq()}")
                    customValueName != null -> listOf("value = ${customValueName.dq()}")
                    else -> null
                }

                mapTraitArgs?.let {
                    traitList.add(SerdeXml.XmlMapName, *it.toTypedArray())
                    writer.addImport(SerdeXml.XmlMapName)
                }

                mapMember.key
                    .getTrait<XmlNamespaceTrait>()
                    ?.toSdkTrait(SerdeXml.XmlMapKeyNamespace)
                    ?.let {
                        traitList.add(it)
                    }

                mapMember.value
                    .getTrait<XmlNamespaceTrait>()
                    ?.toSdkTrait(SerdeXml.XmlCollectionValueNamespace)
                    ?.let {
                        traitList.add(it)
                    }
            }
            else -> { } // No action needed
        }

        return traitList
    }