diff --git a/.changes/26842b1e-eda3-4dc5-b306-20cce3a1125d.json b/.changes/26842b1e-eda3-4dc5-b306-20cce3a1125d.json new file mode 100644 index 00000000000..f3197cf687b --- /dev/null +++ b/.changes/26842b1e-eda3-4dc5-b306-20cce3a1125d.json @@ -0,0 +1,9 @@ +{ + "id": "26842b1e-eda3-4dc5-b306-20cce3a1125d", + "type": "bugfix", + "description": "Fix schema generation for nullable lists and maps", + "issues": [ + "https://github.com/awslabs/aws-sdk-kotlin/issues/1590" + ], + "module": "dynamodb-mapper" +} \ No newline at end of file diff --git a/hll/dynamodb-mapper/dynamodb-mapper-schema-codegen/src/main/kotlin/aws/sdk/kotlin/hll/dynamodbmapper/codegen/annotations/rendering/SchemaRenderer.kt b/hll/dynamodb-mapper/dynamodb-mapper-schema-codegen/src/main/kotlin/aws/sdk/kotlin/hll/dynamodbmapper/codegen/annotations/rendering/SchemaRenderer.kt index 6676e004e2f..194a5266d48 100644 --- a/hll/dynamodb-mapper/dynamodb-mapper-schema-codegen/src/main/kotlin/aws/sdk/kotlin/hll/dynamodbmapper/codegen/annotations/rendering/SchemaRenderer.kt +++ b/hll/dynamodb-mapper/dynamodb-mapper-schema-codegen/src/main/kotlin/aws/sdk/kotlin/hll/dynamodbmapper/codegen/annotations/rendering/SchemaRenderer.kt @@ -175,6 +175,12 @@ internal class SchemaRenderer( val type = Type.from(ksType) when { + type.nullable -> { + writeInline("#T(", MapperTypes.Values.NullableConverter) + renderValueConverter(ksType.makeNotNullable()) + writeInline(")") + } + ksType.isEnum -> writeInline("#T()", MapperTypes.Values.Scalars.enumConverter(type)) // FIXME Handle multi-module codegen rather than assuming nested classes will be in the same [ctx.pkg] @@ -201,12 +207,6 @@ internal class SchemaRenderer( type.isGenericFor(Types.Kotlin.Collections.Set) -> writeInline("#T", ksType.singleArgument().setValueConverter) - type.nullable -> { - writeInline("#T(", MapperTypes.Values.NullableConverter) - renderValueConverter(ksType.makeNotNullable()) - writeInline(")") - } - else -> writeInline( "#T", when (type) { diff --git a/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/src/Lists.kt b/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/src/Lists.kt index 566cf45a57d..c9cae8dfdff 100644 --- a/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/src/Lists.kt +++ b/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/src/Lists.kt @@ -32,6 +32,9 @@ public data class Lists( var listUShort: List, var listULong: List, var listEnum: List, + var nullableList: List?, + var listNullableElement: List, + var nullableListNullableElement: List?, ) { override fun equals(other: Any?): Boolean { if (this === other) return true @@ -56,6 +59,9 @@ public data class Lists( if (listUShort != other.listUShort) return false if (listULong != other.listULong) return false if (listEnum != other.listEnum) return false + if (nullableList != other.nullableList) return false + if (listNullableElement != other.listNullableElement) return false + if (nullableListNullableElement != other.nullableListNullableElement) return false return true } diff --git a/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/src/Maps.kt b/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/src/Maps.kt index 8b67f3d2c59..1e68d5890f3 100644 --- a/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/src/Maps.kt +++ b/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/src/Maps.kt @@ -24,4 +24,7 @@ public data class Maps( var mapStringListString: Map>, var mapStringListMapStringString: Map>>, var mapEnum: Map, + var nullableMap: Map?, + var mapNullableValue: Map, + var nullableMapNullableValue: Map?, ) diff --git a/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/src/Sets.kt b/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/src/Sets.kt index 65b1dec69dd..18d3485a95d 100644 --- a/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/src/Sets.kt +++ b/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/src/Sets.kt @@ -28,6 +28,7 @@ public data class Sets( var setUInt: Set, var setULong: Set, var setUShort: Set, + var nullableSet: Set?, ) { override fun equals(other: Any?): Boolean { if (this === other) return true @@ -49,6 +50,8 @@ public data class Sets( if (setULong != other.setULong) return false if (setUShort != other.setUShort) return false + if (nullableSet != other.nullableSet) return false + return true } } diff --git a/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/test/ListsTest.kt b/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/test/ListsTest.kt index eb68e343e9b..8cf3451e7f7 100644 --- a/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/test/ListsTest.kt +++ b/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/test/ListsTest.kt @@ -31,6 +31,9 @@ public class ListsTest { listUShort = listOf(UShort.MIN_VALUE, UShort.MAX_VALUE), listULong = listOf(ULong.MIN_VALUE, ULong.MAX_VALUE), listEnum = listOf(EnumAnimals.CAT, EnumAnimals.DOG, EnumAnimals.SHEEP), + nullableList = null, + listNullableElement = listOf("foo", null, "baz"), + nullableListNullableElement = null, ) val item = ListsConverter.convertTo(lists) diff --git a/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/test/MapsTest.kt b/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/test/MapsTest.kt index 3136f21deed..9ae8a945924 100644 --- a/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/test/MapsTest.kt +++ b/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/test/MapsTest.kt @@ -35,6 +35,9 @@ public class MapsTest { ), ), mapEnum = mapOf("pet1" to EnumAnimals.CAT, "pet2" to EnumAnimals.DOG, "pet3" to EnumAnimals.SHEEP), + nullableMap = null, + mapNullableValue = mapOf("key1" to "value1", "key2" to null), + nullableMapNullableValue = null, ) val item = MapsConverter.convertTo(maps) diff --git a/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/test/SetsTest.kt b/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/test/SetsTest.kt index 124de3405c8..a5acb0beac3 100644 --- a/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/test/SetsTest.kt +++ b/hll/dynamodb-mapper/dynamodb-mapper-schema-generator-plugin/src/test/resources/standard-item-converters/test/SetsTest.kt @@ -28,6 +28,7 @@ public class SetsTest { setUInt = setOf(100u, 200u, 300u), setULong = setOf(1000uL, 2000uL, 3000uL), setUShort = setOf(1000u.toUShort(), 2000u.toUShort(), 3000u.toUShort()), + nullableSet = null, ) val item = SetsConverter.convertTo(sets)