From 279e433b8461bd1e46af64ccfd6b187b51729c57 Mon Sep 17 00:00:00 2001 From: Kevin Stich Date: Wed, 12 Feb 2025 10:09:29 -0800 Subject: [PATCH] Add flattenAndRemoveMixins build transform --- docs/source-2.0/guides/smithy-build-json.rst | 22 +++++++++++++ .../transforms/FlattenAndRemoveMixins.java | 26 +++++++++++++++ .../FlattenAndRemoveMixinsTest.java | 32 +++++++++++++++++++ .../flatten-and-remove-mixins.smithy | 12 +++++++ 4 files changed, 92 insertions(+) create mode 100644 smithy-build/src/main/java/software/amazon/smithy/build/transforms/FlattenAndRemoveMixins.java create mode 100644 smithy-build/src/test/java/software/amazon/smithy/build/transforms/FlattenAndRemoveMixinsTest.java create mode 100644 smithy-build/src/test/resources/software/amazon/smithy/build/transforms/flatten-and-remove-mixins.smithy diff --git a/docs/source-2.0/guides/smithy-build-json.rst b/docs/source-2.0/guides/smithy-build-json.rst index 16dbb5c92f5..543fe18b075 100644 --- a/docs/source-2.0/guides/smithy-build-json.rst +++ b/docs/source-2.0/guides/smithy-build-json.rst @@ -1518,6 +1518,28 @@ key is not in the provided ``keys`` list. } } +.. _flattenAndRemoveMixins: + +flattenAndRemoveMixins +---------------------- + +Flattens :ref:`mixins ` out of the model and into their local shapes. + +.. code-block:: json + + { + "version": "1.0", + "projections": { + "exampleProjection": { + "transforms": [ + { + "name": "flattenAndRemoveMixins" + } + ] + } + } + } + .. _flattenNamespaces: flattenNamespaces diff --git a/smithy-build/src/main/java/software/amazon/smithy/build/transforms/FlattenAndRemoveMixins.java b/smithy-build/src/main/java/software/amazon/smithy/build/transforms/FlattenAndRemoveMixins.java new file mode 100644 index 00000000000..371e13b67cb --- /dev/null +++ b/smithy-build/src/main/java/software/amazon/smithy/build/transforms/FlattenAndRemoveMixins.java @@ -0,0 +1,26 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +package software.amazon.smithy.build.transforms; + +import software.amazon.smithy.build.ProjectionTransformer; +import software.amazon.smithy.build.TransformContext; +import software.amazon.smithy.model.Model; + +/** + * {@code flattenAndRemoveMixins} flattens mixins out of the model. + */ +public final class FlattenAndRemoveMixins implements ProjectionTransformer { + + @Override + public String getName() { + return "flattenAndRemoveMixins"; + } + + @Override + public Model transform(TransformContext context) { + Model model = context.getModel(); + return context.getTransformer().flattenAndRemoveMixins(model); + } +} diff --git a/smithy-build/src/test/java/software/amazon/smithy/build/transforms/FlattenAndRemoveMixinsTest.java b/smithy-build/src/test/java/software/amazon/smithy/build/transforms/FlattenAndRemoveMixinsTest.java new file mode 100644 index 00000000000..74ef68981b3 --- /dev/null +++ b/smithy-build/src/test/java/software/amazon/smithy/build/transforms/FlattenAndRemoveMixinsTest.java @@ -0,0 +1,32 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +package software.amazon.smithy.build.transforms; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.model.traits.MixinTrait; +import software.amazon.smithy.model.transform.ModelTransformer; + +public class FlattenAndRemoveMixinsTest { + + @Test + void compareTransform() { + Model before = Model.assembler() + .addImport(FlattenAndRemoveMixinsTest.class.getResource("flatten-and-remove-mixins.smithy")) + .assemble() + .unwrap(); + Model result = ModelTransformer.create().flattenAndRemoveMixins(before); + + assertTrue(result.getShapesWithTrait(MixinTrait.class).isEmpty()); + assertThat(result.expectShape(ShapeId.from("smithy.example#Foo"), StructureShape.class).getMemberNames(), + contains("bar", "foo")); + } +} diff --git a/smithy-build/src/test/resources/software/amazon/smithy/build/transforms/flatten-and-remove-mixins.smithy b/smithy-build/src/test/resources/software/amazon/smithy/build/transforms/flatten-and-remove-mixins.smithy new file mode 100644 index 00000000000..eba91e7b60c --- /dev/null +++ b/smithy-build/src/test/resources/software/amazon/smithy/build/transforms/flatten-and-remove-mixins.smithy @@ -0,0 +1,12 @@ +$version: "2.0" + +namespace smithy.example + +@mixin +structure FooMixin { + bar: String +} + +structure Foo with [FooMixin] { + foo: String +}