From 00a6ef8fdd487f19b841cecd0d71228a5b9cb1e8 Mon Sep 17 00:00:00 2001 From: JordonPhillips Date: Wed, 26 Oct 2022 12:48:35 +0200 Subject: [PATCH] Add custom codegen hook before shape generation Some languages need to generate code before shapes are generated. Previously such languages could have used the service generation hook to perform this, but that was moved to occur after generating the other shapes. --- .../codegen/core/directed/CodegenDirector.java | 12 ++++++++---- .../codegen/core/directed/DirectedCodegen.java | 10 ++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CodegenDirector.java b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CodegenDirector.java index 412990af269..b70bdecea68 100644 --- a/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CodegenDirector.java +++ b/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/directed/CodegenDirector.java @@ -292,22 +292,26 @@ public void run() { LOGGER.fine("All setup done. Beginning code generation"); + LOGGER.finest(() -> "Performing custom codegen for " + + directedCodegen.getClass().getName() + " before shape codegen"); + CustomizeDirective customizeDirective = new CustomizeDirective<>(context, serviceShape); + directedCodegen.customizeBeforeShapeGeneration(customizeDirective); + + LOGGER.finest(() -> "Generating shapes for service " + serviceShape.getId()); generateShapesInService(context, serviceShape); LOGGER.finest(() -> "Generating service " + serviceShape.getId()); directedCodegen.generateService(new GenerateServiceDirective<>(context, serviceShape)); - CustomizeDirective postProcess = new CustomizeDirective<>(context, serviceShape); - LOGGER.finest(() -> "Performing custom codegen for " + directedCodegen.getClass().getName() + " before integrations"); - directedCodegen.customizeBeforeIntegrations(postProcess); + directedCodegen.customizeBeforeIntegrations(customizeDirective); applyIntegrationCustomizations(context, integrations); LOGGER.finest(() -> "Performing custom codegen for " + directedCodegen.getClass().getName() + " after integrations"); - directedCodegen.customizeAfterIntegrations(postProcess); + directedCodegen.customizeAfterIntegrations(customizeDirective); LOGGER.finest(() -> "Directed codegen finished for " + directedCodegen.getClass().getName()); 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 a904ddc99be..d98ffe1711d 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 @@ -106,6 +106,16 @@ default void generateResource(GenerateResourceDirective directive) { */ void generateIntEnumShape(GenerateIntEnumDirective directive); + /** + * Performs any necessary code generation before all shapes are generated, + * using the created codegen context object. + * + * @param directive Directive to perform. + */ + default void customizeBeforeShapeGeneration(CustomizeDirective directive) { + // Does nothing by default. + } + /** * Performs any necessary code generation after all shapes are generated, * using the created codegen context object before integrations perform