diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializer.java b/smithy-model/src/main/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializer.java index 8404fb9de52..08ae9d87fe9 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializer.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializer.java @@ -477,12 +477,17 @@ private void writeEnumMembers(Collection members) { private void applyIntroducedTraits(Collection members) { for (MemberShape member : members) { + Map introducedTraits = new LinkedHashMap<>(member.getIntroducedTraits()); + + // The @enumValue trait is serialized using the `=` IDL syntax, so remove it here. + introducedTraits.remove(EnumValueTrait.ID); + // Use short form for a single trait, and block form for multiple traits. - if (member.getIntroducedTraits().size() == 1) { + if (introducedTraits.size() == 1) { codeWriter.writeInline("apply $I ", member.getId()); serializeTraits(member.getIntroducedTraits(), TraitFeature.NO_SPECIAL_DOCS_SYNTAX); codeWriter.write(""); - } else if (!member.getIntroducedTraits().isEmpty()) { + } else if (!introducedTraits.isEmpty()) { codeWriter.openBlock("apply $I {", "}", member.getId(), () -> { // Only serialize local traits, and don't use special documentation syntax here. serializeTraits(member.getIntroducedTraits(), TraitFeature.NO_SPECIAL_DOCS_SYNTAX); diff --git a/smithy-model/src/test/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializerTest.java b/smithy-model/src/test/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializerTest.java index 8aa756b55d0..62dedc3a6ed 100644 --- a/smithy-model/src/test/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializerTest.java +++ b/smithy-model/src/test/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializerTest.java @@ -243,4 +243,20 @@ public void sortsAlphabetically() { assertThat(modelResult, equalTo(IoUtils.readUtf8Url(resource).replace("\r\n", "\n"))); } + + @Test + public void handlesEnumMixins() { + URL resource = getClass().getResource("idl-serialization/enum-mixin-input.smithy"); + Model model = Model.assembler().addImport(resource).assemble().unwrap(); + Map serialized = SmithyIdlModelSerializer.builder().build().serialize(model); + + if (serialized.size() != 1) { + throw new RuntimeException("Exactly one smithy file should be output for generated tests."); + } + + String expectedOutput = IoUtils.readUtf8Resource(getClass(), "idl-serialization/enum-mixin-output.smithy") + .replaceAll("\\R", "\n"); + String serializedString = serialized.entrySet().iterator().next().getValue(); + Assertions.assertEquals(expectedOutput, serializedString); + } } diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/shapes/idl-serialization/enum-mixin-input.smithy b/smithy-model/src/test/resources/software/amazon/smithy/model/shapes/idl-serialization/enum-mixin-input.smithy new file mode 100644 index 00000000000..d09dab55be2 --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/shapes/idl-serialization/enum-mixin-input.smithy @@ -0,0 +1,23 @@ +$version: "2.0" + +namespace ns.foo + +@mixin +intEnum IntMixin { + FOO = 1 + BAR = 2 +} + +intEnum IntEnum with [IntMixin] { + FOO = 1 + BAR = 2 +} + +@mixin +enum StringMixin { + BAZ = "baz" +} + +enum StringEnum with [StringMixin] { + BAZ = "baz" +} diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/shapes/idl-serialization/enum-mixin-output.smithy b/smithy-model/src/test/resources/software/amazon/smithy/model/shapes/idl-serialization/enum-mixin-output.smithy new file mode 100644 index 00000000000..560cb6b032e --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/shapes/idl-serialization/enum-mixin-output.smithy @@ -0,0 +1,18 @@ +$version: "2.0" + +namespace ns.foo + +intEnum IntEnum with [IntMixin] {} + +@mixin +intEnum IntMixin { + FOO = 1 + BAR = 2 +} + +enum StringEnum with [StringMixin] {} + +@mixin +enum StringMixin { + BAZ = "baz" +}