diff --git a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/DirectedCodegenRunner.java b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CodegenDirector.java similarity index 92% rename from smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/DirectedCodegenRunner.java rename to smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CodegenDirector.java index 7643e0195a2..bee92e77245 100644 --- a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/DirectedCodegenRunner.java +++ b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CodegenDirector.java @@ -37,8 +37,10 @@ import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StringShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.UnionShape; +import software.amazon.smithy.model.traits.EnumTrait; import software.amazon.smithy.model.traits.ErrorTrait; import software.amazon.smithy.model.transform.ModelTransformer; import software.amazon.smithy.utils.CodeInterceptor; @@ -53,7 +55,7 @@ * @param Type of {@link CodegenContext} to create and use. * @param Type of settings object to pass to directed methods. */ -public final class DirectedCodegenRunner< +public final class CodegenDirector< W extends SymbolWriter, I extends SmithyIntegration, C extends CodegenContext, @@ -80,7 +82,7 @@ public final class DirectedCodegenRunner< * * *

Note: This transform is applied automatically by a code - * generator if {@link DirectedCodegenRunner#performDefaultCodegenTransforms()} is + * generator if {@link CodegenDirector#performDefaultCodegenTransforms()} is * set to true. * * @param model Model being code generated. @@ -192,7 +194,7 @@ public void integrationClassLoader(ClassLoader classLoader) { } /** - * Set to true to apply {@link DirectedCodegenRunner#simplifyModelForServiceCodegen} + * Set to true to apply {@link CodegenDirector#simplifyModelForServiceCodegen} * prior to code generation. */ public void performDefaultCodegenTransforms() { @@ -268,11 +270,11 @@ public void run() { registerInterceptors(context, integrations); LOGGER.finest(() -> "Generating service " + serviceShape.getId()); - directedCodegen.generateService(new GenerateService<>(context, serviceShape)); + directedCodegen.generateService(new GenerateServiceDirective<>(context, serviceShape)); generateShapesInService(context, serviceShape, shapes); - Customize postProcess = new Customize<>(context, serviceShape); + CustomizeDirective postProcess = new CustomizeDirective<>(context, serviceShape); LOGGER.finest(() -> "Performing custom codegen for " + directedCodegen.getClass().getName() + " before integrations"); @@ -304,7 +306,7 @@ private void validateState() { if (integrationFinder == null) { LOGGER.fine(() -> String.format("Finding %s integrations using the %s class loader", integrationClass.getName(), - DirectedCodegenRunner.class.getCanonicalName())); + CodegenDirector.class.getCanonicalName())); integrationClassLoader(getClass().getClassLoader()); } } @@ -335,7 +337,7 @@ private void preprocessModelWithIntegrations(List integrations) { private SymbolProvider createSymbolProvider(List integrations, ServiceShape serviceShape) { LOGGER.fine(() -> "Creating a symbol provider from " + settings.getClass().getName()); SymbolProvider provider = directedCodegen.createSymbolProvider( - new CreateSymbolProvider<>(model, settings, serviceShape)); + new CreateSymbolProviderDirective<>(model, settings, serviceShape)); LOGGER.finer(() -> "Decorating symbol provider using " + integrationClass.getName()); for (I integration : integrations) { @@ -347,7 +349,7 @@ private SymbolProvider createSymbolProvider(List integrations, ServiceShape s private C createContext(ServiceShape serviceShape, SymbolProvider provider) { LOGGER.fine(() -> "Creating a codegen context for " + directedCodegen.getClass().getName()); - return directedCodegen.createContext(new CreateContext<>( + return directedCodegen.createContext(new CreateContextDirective<>( model, settings, serviceShape, provider, fileManifest)); } @@ -374,7 +376,7 @@ private void generateResourceShapes(C context, ServiceShape serviceShape, Set "Generating resource " + shape.getId()); directedCodegen.generateResource( - new GenerateResource<>(context, serviceShape, shape)); + new GenerateResourceDirective<>(context, serviceShape, shape)); } } } @@ -384,10 +386,10 @@ private void generateStructures(C context, ServiceShape serviceShape, Set if (shapes.contains(shape)) { if (shape.hasTrait(ErrorTrait.class)) { LOGGER.finest(() -> "Generating error " + shape.getId()); - directedCodegen.generateError(new GenerateError<>(context, serviceShape, shape)); + directedCodegen.generateError(new GenerateErrorDirective<>(context, serviceShape, shape)); } else { LOGGER.finest(() -> "Generating structure " + shape.getId()); - directedCodegen.generateStructure(new GenerateStructure<>(context, serviceShape, shape)); + directedCodegen.generateStructure(new GenerateStructureDirective<>(context, serviceShape, shape)); } } } @@ -397,21 +399,28 @@ private void generateUnionShapes(C context, ServiceShape serviceShape, Set "Generating union " + shape.getId()); - directedCodegen.generateUnion(new GenerateUnion<>(context, serviceShape, shape)); + directedCodegen.generateUnion(new GenerateUnionDirective<>(context, serviceShape, shape)); } } } private void generateEnumShapes(C context, ServiceShape serviceShape, Set shapes) { // Generate enum shapes connected to the service. + for (StringShape shape : model.getStringShapesWithTrait(EnumTrait.class)) { + if (shapes.contains(shape)) { + LOGGER.finest(() -> "Generating string enum " + shape.getId()); + directedCodegen.generateEnumShape(new GenerateEnumDirective<>(context, serviceShape, shape)); + } + } + /* + TODO: uncomment in idl-2.0 for (EnumShape shape : model.getEnumShapes()) { if (shapes.contains(shape)) { LOGGER.finest(() -> "Generating enum " + shape.getId()); directedCodegen.generateEnumShape(new GenerateEnumContext<>(context, serviceShape, shape)); } } - TODO: uncomment in idl-2.0 */ } diff --git a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CreateContext.java b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CreateContextDirective.java similarity index 96% rename from smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CreateContext.java rename to smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CreateContextDirective.java index 1dfb11e515b..8982bf9c1c8 100644 --- a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CreateContext.java +++ b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CreateContextDirective.java @@ -31,12 +31,12 @@ * @param Codegen settings type. * @see DirectedCodegen#createContext */ -public final class CreateContext extends Directive { +public final class CreateContextDirective extends Directive { private final SymbolProvider symbolProvider; private final FileManifest fileManifest; - CreateContext( + CreateContextDirective( Model model, S settings, ServiceShape service, diff --git a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CreateSymbolProvider.java b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CreateSymbolProviderDirective.java similarity index 86% rename from smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CreateSymbolProvider.java rename to smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CreateSymbolProviderDirective.java index 0c621e219c9..65cdb9e5817 100644 --- a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CreateSymbolProvider.java +++ b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CreateSymbolProviderDirective.java @@ -25,8 +25,8 @@ * @param Codegen settings type. * @see DirectedCodegen#createContext */ -public final class CreateSymbolProvider extends Directive { - CreateSymbolProvider(Model model, S settings, ServiceShape service) { +public final class CreateSymbolProviderDirective extends Directive { + CreateSymbolProviderDirective(Model model, S settings, ServiceShape service) { super(model, settings, service); } } diff --git a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/Customize.java b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CustomizeDirective.java similarity index 86% rename from smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/Customize.java rename to smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CustomizeDirective.java index bd0bfbcd267..d807b4c3cc6 100644 --- a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/Customize.java +++ b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CustomizeDirective.java @@ -26,8 +26,8 @@ * @see DirectedCodegen#customizeBeforeIntegrations * @see DirectedCodegen#customizeAfterIntegrations */ -public final class Customize, S> extends ContextualDirective { - Customize(C context, ServiceShape service) { +public final class CustomizeDirective, S> extends ContextualDirective { + CustomizeDirective(C context, ServiceShape service) { super(context, service); } } diff --git a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/DirectedCodegen.java b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/DirectedCodegen.java index 145a1e4da4a..8325f69f74f 100644 --- a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/DirectedCodegen.java +++ b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/DirectedCodegen.java @@ -39,7 +39,7 @@ public interface DirectedCodegen, S> { * @param directive Directive context data. * @return Returns the created SymbolProvider. */ - SymbolProvider createSymbolProvider(CreateSymbolProvider directive); + SymbolProvider createSymbolProvider(CreateSymbolProviderDirective directive); /** * Creates the codegen context object. @@ -47,21 +47,21 @@ public interface DirectedCodegen, S> { * @param directive Directive context data. * @return Returns the created context object used by the rest of the directed generation. */ - C createContext(CreateContext directive); + C createContext(CreateContextDirective directive); /** * Generates the code needed for a service shape. * * @param directive Directive to perform. */ - void generateService(GenerateService directive); + void generateService(GenerateServiceDirective directive); /** * Generates the code needed for a resource shape. * * @param directive Directive to perform. */ - default void generateResource(GenerateResource directive) { + default void generateResource(GenerateResourceDirective directive) { // Does nothing by default. } @@ -73,30 +73,30 @@ default void generateResource(GenerateResource directive) { * * @param directive Directive to perform. */ - void generateStructure(GenerateStructure directive); + void generateStructure(GenerateStructureDirective directive); /** * Generates the code needed for an error structure. * * @param directive Directive to perform. */ - void generateError(GenerateError directive); + void generateError(GenerateErrorDirective directive); /** * Generates the code needed for a union shape. * * @param directive Directive to perform. */ - void generateUnion(GenerateUnion directive); + void generateUnion(GenerateUnionDirective directive); - /* - * TODO: Uncomment in IDL-2.0 branch - * - * Generates the code needed for an enum shape. + /** + * Generates the code needed for an enum shape, whether it's a string shape + * marked with the enum trait, or a proper enum shape introduced in Smithy + * IDL 2.0. * * @param directive Directive to perform. */ - //void generateEnumShape(GenerateEnumContext directive); + void generateEnumShape(GenerateEnumDirective directive); /** * Performs any necessary code generation after all shapes are generated, @@ -105,7 +105,7 @@ default void generateResource(GenerateResource directive) { * * @param directive Directive to perform. */ - default void customizeBeforeIntegrations(Customize directive) { + default void customizeBeforeIntegrations(CustomizeDirective directive) { // Does nothing by default. } @@ -124,7 +124,7 @@ default void customizeBeforeIntegrations(Customize directive) { * * @param directive Directive to perform. */ - default void customizeAfterIntegrations(Customize directive) { + default void customizeAfterIntegrations(CustomizeDirective directive) { // Does nothing by default. } } diff --git a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/Directive.java b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/Directive.java index d2730defe6f..5dcaf5731d8 100644 --- a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/Directive.java +++ b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/Directive.java @@ -28,7 +28,8 @@ import software.amazon.smithy.model.shapes.ShapeId; /** - * Base class for all Directives emitted from {@link DirectedCodegen}. + * Directive classes contain all of the context needed in order to perform + * the tasks defined in a {@link DirectedCodegen} implementation. * * @param Settings object used to configure code generation. */ diff --git a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateEnumDirective.java b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateEnumDirective.java new file mode 100644 index 00000000000..ab573613ba4 --- /dev/null +++ b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateEnumDirective.java @@ -0,0 +1,88 @@ +/* + * Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package software.amazon.smithy.codegen.core.directed; + +import software.amazon.smithy.codegen.core.CodegenContext; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.traits.EnumTrait; + +/** + * Directive used to generate an enum shape or enum string shape. + * + * @param CodegenContext type. + * @param Codegen settings type. + * @see DirectedCodegen#generateUnion + */ +public final class GenerateEnumDirective, S> extends ShapeDirective { + + GenerateEnumDirective(C context, ServiceShape service, Shape shape) { + super(context, service, validateShape(shape)); + } + + private static Shape validateShape(Shape shape) { + if (!shape.isStringShape() || !shape.hasTrait(EnumTrait.class)) { + throw new IllegalArgumentException("GenerateEnum requires a string shape with the enum trait"); + } + + return shape; + } + + /** + * Represents the type of enum to generate. Smithy IDL 2.0 introduces actual + * enum shapes. + */ + public enum EnumType { + /** A string shape marked with the enum trait is being generated. */ + STRING, + + // TODO: idl-2.0 + // ENUM + } + + /** + * Gets the type of enum being generated, whether it's a string shape marked with + * the enum trait or, in Smithy IDL 2.0, an actual enum shape. + * + *

Note that Smithy IDL 2.0 generators can perform a pre-processing transform + * to convert eligible string shape enums to proper enums, removing the need to + * check this property. + * + * @return Gets the type of enum being generated. + * @see #getEnumTrait() + */ + public EnumType getEnumType() { + // TODO: update when idl-2.0 is released. + return EnumType.STRING; + } + + /** + * Gets the {@link EnumTrait} of the shape. + * + * @return Returns the enum trait. + */ + public EnumTrait getEnumTrait() { + return shape().expectTrait(EnumTrait.class); + } + + /* + TODO: Uncomment after IDL-2.0 is shipped. + public EnumShape expectEnumShape() { + return shape().asEnumShape().orElseThrow(() -> new ExpectationNotMetException( + "Expected an enum shape, but found " + shape(), shape())); + } + */ +} diff --git a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateError.java b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateErrorDirective.java similarity index 86% rename from smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateError.java rename to smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateErrorDirective.java index 4a99fb2ccab..e0f1d53b5ca 100644 --- a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateError.java +++ b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateErrorDirective.java @@ -27,9 +27,10 @@ * @param Codegen settings type. * @see DirectedCodegen#generateError */ -public final class GenerateError, S> extends ShapeDirective { +public final class GenerateErrorDirective, S> + extends ShapeDirective { - GenerateError(C context, ServiceShape service, StructureShape shape) { + GenerateErrorDirective(C context, ServiceShape service, StructureShape shape) { super(context, service, shape); } diff --git a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateResource.java b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateResourceDirective.java similarity index 82% rename from smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateResource.java rename to smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateResourceDirective.java index deb7980a20e..9b2904651e9 100644 --- a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateResource.java +++ b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateResourceDirective.java @@ -26,8 +26,9 @@ * @param Codegen settings type. * @see DirectedCodegen#generateResource */ -public final class GenerateResource, S> extends ShapeDirective { - GenerateResource(C context, ServiceShape service, ResourceShape shape) { +public final class GenerateResourceDirective, S> + extends ShapeDirective { + GenerateResourceDirective(C context, ServiceShape service, ResourceShape shape) { super(context, service, shape); } } diff --git a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateService.java b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateServiceDirective.java similarity index 95% rename from smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateService.java rename to smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateServiceDirective.java index 140bb95a793..e4a4bfd0638 100644 --- a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateService.java +++ b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateServiceDirective.java @@ -35,9 +35,10 @@ * @param Codegen settings type. * @see DirectedCodegen#generateService */ -public final class GenerateService, S> extends ShapeDirective { +public final class GenerateServiceDirective, S> + extends ShapeDirective { - GenerateService(C context, ServiceShape service) { + GenerateServiceDirective(C context, ServiceShape service) { super(context, service, service); } diff --git a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateStructure.java b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateStructureDirective.java similarity index 85% rename from smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateStructure.java rename to smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateStructureDirective.java index 11b79cec9c9..220084fe300 100644 --- a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateStructure.java +++ b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateStructureDirective.java @@ -29,9 +29,10 @@ * @param Codegen settings type. * @see DirectedCodegen#generateService */ -public final class GenerateStructure, S> extends ShapeDirective { +public final class GenerateStructureDirective, S> + extends ShapeDirective { - GenerateStructure(C context, ServiceShape service, StructureShape shape) { + GenerateStructureDirective(C context, ServiceShape service, StructureShape shape) { super(context, service, shape); } @@ -40,7 +41,7 @@ public final class GenerateStructure, S> extends * *

This is equivalent to calling {@code shape().hasTrait(InputTrait.class)}. * - *

Use the {@link DirectedCodegenRunner#createDedicatedInputsAndOutputs()} method + *

Use the {@link CodegenDirector#createDedicatedInputsAndOutputs()} method * to ensure that every operation has a unique input shape marked with the * input trait. * @@ -56,7 +57,7 @@ public boolean isInputShape() { * *

This is equivalent to calling {@code shape().hasTrait(OutputTrait.class)}. * - *

Use the {@link DirectedCodegenRunner#createDedicatedInputsAndOutputs()} method + *

Use the {@link CodegenDirector#createDedicatedInputsAndOutputs()} method * to ensure that every operation has a unique output shape marked with the * output trait. * diff --git a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateUnion.java b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateUnionDirective.java similarity index 86% rename from smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateUnion.java rename to smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateUnionDirective.java index f55218b5e03..08abee8327b 100644 --- a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateUnion.java +++ b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/GenerateUnionDirective.java @@ -27,9 +27,10 @@ * @param Codegen settings type. * @see DirectedCodegen#generateUnion */ -public final class GenerateUnion, S> extends ShapeDirective { +public final class GenerateUnionDirective, S> + extends ShapeDirective { - GenerateUnion(C context, ServiceShape service, UnionShape shape) { + GenerateUnionDirective(C context, ServiceShape service, UnionShape shape) { super(context, service, shape); } diff --git a/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/DirectedCodegenRunnerTest.java b/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/CodegenDirectorTest.java similarity index 70% rename from smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/DirectedCodegenRunnerTest.java rename to smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/CodegenDirectorTest.java index 32ab2d40ffd..715fe8537b7 100644 --- a/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/DirectedCodegenRunnerTest.java +++ b/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/CodegenDirectorTest.java @@ -28,13 +28,13 @@ import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.shapes.ShapeId; -public class DirectedCodegenRunnerTest { +public class CodegenDirectorTest { interface TestIntegration extends SmithyIntegration {} private static final class TestDirected implements DirectedCodegen { @Override - public SymbolProvider createSymbolProvider(CreateSymbolProvider directive) { + public SymbolProvider createSymbolProvider(CreateSymbolProviderDirective directive) { return shape -> Symbol.builder() .name(shape.getId().getName()) .namespace(shape.getId().getNamespace(), ".") @@ -42,7 +42,7 @@ public SymbolProvider createSymbolProvider(CreateSymbolProvider di } @Override - public TestContext createContext(CreateContext directive) { + public TestContext createContext(CreateContextDirective directive) { WriterDelegator delegator = new WriterDelegator<>( directive.fileManifest(), directive.symbolProvider(), @@ -53,32 +53,43 @@ public TestContext createContext(CreateContext directive) { } @Override - public void generateService(GenerateService directive) { } + public void generateService(GenerateServiceDirective directive) { } @Override - public void generateResource(GenerateResource directive) { } + public void generateResource(GenerateResourceDirective directive) { } @Override - public void generateStructure(GenerateStructure directive) { } + public void generateStructure(GenerateStructureDirective directive) { } @Override - public void generateError(GenerateError directive) { } + public void generateError(GenerateErrorDirective directive) { } @Override - public void generateUnion(GenerateUnion directive) {} + public void generateUnion(GenerateUnionDirective directive) {} @Override - public void customizeBeforeIntegrations(Customize directive) {} + public void generateEnumShape(GenerateEnumDirective directive) { + GenerateEnumDirective.EnumType type = directive.getEnumType(); + if (type == GenerateEnumDirective.EnumType.STRING) { + directive.getEnumTrait(); + } else { + // TODO: update for idl-2.0 + throw new RuntimeException("Expected enum type to be string"); + } + } + + @Override + public void customizeBeforeIntegrations(CustomizeDirective directive) {} @Override - public void customizeAfterIntegrations(Customize directive) {} + public void customizeAfterIntegrations(CustomizeDirective directive) {} } @Test public void validatesInput() { TestDirected testDirected = new TestDirected(); - DirectedCodegenRunner - runner = new DirectedCodegenRunner<>(); + CodegenDirector + runner = new CodegenDirector<>(); runner.directedCodegen(testDirected); runner.fileManifest(new MockManifest()); @@ -92,8 +103,8 @@ public void validatesInput() { @Test public void failsWhenServiceIsMissing() { TestDirected testDirected = new TestDirected(); - DirectedCodegenRunner runner - = new DirectedCodegenRunner<>(); + CodegenDirector runner + = new CodegenDirector<>(); FileManifest manifest = new MockManifest(); runner.settings(TestSettings.class, Node.objectNode().withMember("foo", "hi")); @@ -109,8 +120,8 @@ public void failsWhenServiceIsMissing() { @Test public void performsCodegen() { TestDirected testDirected = new TestDirected(); - DirectedCodegenRunner runner - = new DirectedCodegenRunner<>(); + CodegenDirector runner + = new CodegenDirector<>(); FileManifest manifest = new MockManifest(); Model model = Model.assembler() .addImport(getClass().getResource("directed-model.smithy")) diff --git a/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/DirectiveTest.java b/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/DirectiveTest.java index a48bb8a76f9..4020023a9cd 100644 --- a/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/DirectiveTest.java +++ b/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/DirectiveTest.java @@ -32,7 +32,8 @@ public class DirectiveTest { @Test public void providesOperations() { TestContext context = TestContext.create("directive-operations.smithy", ShapeId.from("smithy.example#Foo")); - GenerateService d = new GenerateService<>(context, context.service()); + GenerateServiceDirective d = new GenerateServiceDirective<>( + context, context.service()); Set operationShapes = d.operations(); assertThat(operationShapes, sameInstance(d.operations())); @@ -47,7 +48,8 @@ public void providesOperations() { @Test public void providesConnectedShapes() { TestContext context = TestContext.create("directive-operations.smithy", ShapeId.from("smithy.example#Foo")); - GenerateService d = new GenerateService<>(context, context.service()); + GenerateServiceDirective d = new GenerateServiceDirective<>( + context, context.service()); Map connected = d.connectedShapes(); assertThat(connected, sameInstance(d.connectedShapes())); diff --git a/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/GenerateEnumDirectiveTest.java b/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/GenerateEnumDirectiveTest.java new file mode 100644 index 00000000000..72a1f61805c --- /dev/null +++ b/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/GenerateEnumDirectiveTest.java @@ -0,0 +1,16 @@ +package software.amazon.smithy.codegen.core.directed; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import software.amazon.smithy.model.shapes.BooleanShape; + +public class GenerateEnumDirectiveTest { + @Test + public void validatesShapeType() { + BooleanShape shape = BooleanShape.builder().id("smithy.example#Foo").build(); + + Assertions.assertThrows(IllegalArgumentException.class, () -> { + new GenerateEnumDirective(null, null, shape); + }); + } +} diff --git a/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/GenerateServiceDirectiveTest.java b/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/GenerateServiceDirectiveTest.java index 7f3b4f80a00..ba8c277a41f 100644 --- a/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/GenerateServiceDirectiveTest.java +++ b/smithy-codegen-core/src/test/java/software/amazon/smithy/codegen/core/directed/GenerateServiceDirectiveTest.java @@ -28,14 +28,14 @@ public class GenerateServiceDirectiveTest { @Test public void getsServiceTitleWithExplicitTrait() { - GenerateService d = createDirective("service-title.smithy"); + GenerateServiceDirective d = createDirective("service-title.smithy"); assertThat(d.serviceTitle(), equalTo("Foo Service")); } @Test public void getsServiceTitleFromSymbolDefault() { - GenerateService d = createDirective( + GenerateServiceDirective d = createDirective( "service-title.smithy", ShapeId.from("smithy.example#Foo2")); assertThat(d.serviceTitle(), equalTo("Foo2")); @@ -43,7 +43,7 @@ public void getsServiceTitleFromSymbolDefault() { @Test public void providesPaginatedMap() { - GenerateService d = createDirective("service-paginated.smithy"); + GenerateServiceDirective d = createDirective("service-paginated.smithy"); Map info = d.paginatedOperations(); assertThat(info, hasKey(ShapeId.from("smithy.example#ListA"))); @@ -52,7 +52,7 @@ public void providesPaginatedMap() { @Test public void providesEventStreamMap() { - GenerateService d = createDirective("service-eventstream.smithy"); + GenerateServiceDirective d = createDirective("service-eventstream.smithy"); Map input = d.inputEventStreamOperations(); Map output = d.outputEventStreamOperations(); @@ -61,12 +61,12 @@ public void providesEventStreamMap() { assertThat(output, hasKey(ShapeId.from("smithy.example#GetAndSendMovements"))); } - private GenerateService createDirective(String modelFile, ShapeId serviceId) { + private GenerateServiceDirective createDirective(String modelFile, ShapeId serviceId) { TestContext context = TestContext.create(modelFile, serviceId); - return new GenerateService<>(context, context.service()); + return new GenerateServiceDirective<>(context, context.service()); } - private GenerateService createDirective(String modelFile) { + private GenerateServiceDirective createDirective(String modelFile) { return createDirective(modelFile, ShapeId.from("smithy.example#Foo")); } } diff --git a/smithy-codegen-core/src/test/resources/software/amazon/smithy/codegen/core/directed/directed-model.smithy b/smithy-codegen-core/src/test/resources/software/amazon/smithy/codegen/core/directed/directed-model.smithy index 8ea5edd6c5a..4198d9341bc 100644 --- a/smithy-codegen-core/src/test/resources/software/amazon/smithy/codegen/core/directed/directed-model.smithy +++ b/smithy-codegen-core/src/test/resources/software/amazon/smithy/codegen/core/directed/directed-model.smithy @@ -4,7 +4,12 @@ namespace smithy.example @paginated(inputToken: "nextToken", outputToken: "nextToken", items: "items", pageSize: "maxResults") service Foo { - operations: [ListFoo] + resources: [TheFoo] +} + +resource TheFoo { + identifiers: {id: String}, + list: ListFoo } @readonly @@ -23,9 +28,22 @@ structure ListFooInput { @output structure ListFooOutput { nextToken: String, - items: StringList + status: Status, + items: StringList, + instruction: Instruction, } list StringList { member: String } + +@enum([ + {name: "GOOD", value: "GOOD"}, + {name: "BAD", value: "BAD"} +]) +string Status + +union Instruction { + continueIteration: Unit, + stopIteration: Unit +}