diff --git a/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/CodegenVisitor.java b/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/CodegenVisitor.java index fd399da6..ab9d801b 100644 --- a/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/CodegenVisitor.java +++ b/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/CodegenVisitor.java @@ -32,7 +32,6 @@ import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolDependency; import software.amazon.smithy.codegen.core.SymbolProvider; -import software.amazon.smithy.codegen.core.WriterDelegator; import software.amazon.smithy.go.codegen.GoSettings.ArtifactType; import software.amazon.smithy.go.codegen.integration.GoIntegration; import software.amazon.smithy.go.codegen.integration.ProtocolGenerator; @@ -157,14 +156,7 @@ final class CodegenVisitor extends ShapeVisitor.Default { this.eventStreamGenerator = new EventStreamGenerator(settings, model, writers, symbolProvider, service); - this.ctx = new GoCodegenContext( - model, - settings, - symbolProvider, - fileManifest, - // FUTURE: GoDelegator should satisfy this interface - new WriterDelegator<>(fileManifest, symbolProvider, (filename, namespace) -> new GoWriter(namespace)), - integrations); + this.ctx = new GoCodegenContext(model, settings, symbolProvider, fileManifest, writers, integrations); } private static ProtocolGenerator resolveProtocolGenerator( @@ -220,6 +212,7 @@ void execute() { for (GoIntegration integration : integrations) { integration.writeAdditionalFiles(settings, model, symbolProvider, writers::useFileWriter); integration.writeAdditionalFiles(settings, model, symbolProvider, writers); + integration.writeAdditionalFiles(ctx); } eventStreamGenerator.generateEventStreamInterfaces(); diff --git a/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/GoDelegator.java b/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/GoDelegator.java index 15d22ac1..364aabeb 100644 --- a/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/GoDelegator.java +++ b/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/GoDelegator.java @@ -17,9 +17,8 @@ import java.util.function.Consumer; import software.amazon.smithy.build.FileManifest; -import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; -import software.amazon.smithy.codegen.core.SymbolReference; +import software.amazon.smithy.codegen.core.WriterDelegator; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.utils.SmithyInternalApi; @@ -28,85 +27,43 @@ * for getting shape specific GoWriters. */ @SmithyInternalApi -public final class GoDelegator extends GoWriterDelegator { +public final class GoDelegator extends WriterDelegator { private final SymbolProvider symbolProvider; public GoDelegator(FileManifest fileManifest, SymbolProvider symbolProvider) { - super(fileManifest); + super(fileManifest, symbolProvider, (filename, namespace) -> new GoWriter(namespace)); this.symbolProvider = symbolProvider; } /** - * Gets a previously created writer or creates a new one if needed. - * - * @param shape Shape to create the writer for. - * @param writerConsumer Consumer that accepts and works with the file. - */ - public void useShapeWriter(Shape shape, Consumer writerConsumer) { - Symbol symbol = symbolProvider.toSymbol(shape); - useShapeWriter(symbol, writerConsumer); - } - - /** - * Gets a previously created writer or creates a new one for the a Go test file for the associated shape. + * Gets a previously created writer or creates a new one for the Go test file for the associated shape. * * @param shape Shape to create the writer for. * @param writerConsumer Consumer that accepts and works with the file. */ public void useShapeTestWriter(Shape shape, Consumer writerConsumer) { - Symbol symbol = symbolProvider.toSymbol(shape); - String filename = symbol.getDefinitionFile(); - - StringBuilder b = new StringBuilder(filename); - b.insert(filename.lastIndexOf(".go"), "_test"); - filename = b.toString(); - - symbol = symbol.toBuilder() - .definitionFile(filename) - .build(); - - useShapeWriter(symbol, writerConsumer); + var symbol = symbolProvider.toSymbol(shape); + var filename = symbol.getDefinitionFile(); + var testFilename = new StringBuilder(filename) + .insert(filename.lastIndexOf(".go"), "_test") + .toString(); + useFileWriter(testFilename, symbol.getNamespace(), writerConsumer); } /** - * Gets a previously created writer or creates a new one for the a Go public package test file for the associated + * Gets a previously created writer or creates a new one for the Go public package test file for the associated * shape. * * @param shape Shape to create the writer for. * @param writerConsumer Consumer that accepts and works with the file. */ public void useShapeExportedTestWriter(Shape shape, Consumer writerConsumer) { - Symbol symbol = symbolProvider.toSymbol(shape); - String filename = symbol.getDefinitionFile(); - - StringBuilder b = new StringBuilder(filename); - b.insert(filename.lastIndexOf(".go"), "_exported_test"); - filename = b.toString(); - - symbol = symbol.toBuilder() - .definitionFile(filename) - .namespace(symbol.getNamespace() + "_test", symbol.getNamespaceDelimiter()) - .build(); - - useShapeWriter(symbol, writerConsumer); - } - - /** - * Gets a previously created writer or creates a new one if needed. - * - * @param symbol symbol to create the writer for. - * @param writerConsumer Consumer that accepts and works with the file. - */ - private void useShapeWriter(Symbol symbol, Consumer writerConsumer) { - GoWriter writer = checkoutWriter(symbol.getDefinitionFile(), symbol.getNamespace()); - - // Add any needed DECLARE symbols. - writer.addImportReferences(symbol, SymbolReference.ContextOption.DECLARE); - symbol.getDependencies().forEach(writer::addDependency); - - writer.pushState(); - writerConsumer.accept(writer); - writer.popState(); + var symbol = symbolProvider.toSymbol(shape); + var filename = symbol.getDefinitionFile(); + var testFilename = new StringBuilder(filename) + .insert(filename.lastIndexOf(".go"), "_exported_test") + .toString(); + useFileWriter(testFilename, symbol.getNamespace() + "_test", writerConsumer); } } diff --git a/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/GoWriterDelegator.java b/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/GoWriterDelegator.java deleted file mode 100644 index 0c82b3a1..00000000 --- a/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/GoWriterDelegator.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2020 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.go.codegen; - -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; -import software.amazon.smithy.build.FileManifest; -import software.amazon.smithy.codegen.core.SymbolDependency; - -public class GoWriterDelegator { - private final FileManifest fileManifest; - private final Map writers = new HashMap<>(); - - public GoWriterDelegator(FileManifest fileManifest) { - this.fileManifest = fileManifest; - } - - /** - * Writes all pending writers to disk and then clears them out. - */ - public void flushWriters() { - writers.forEach((filename, writer) -> fileManifest.writeFile(filename, writer.toString())); - writers.clear(); - } - - /** - * Gets all the dependencies that have been registered in writers owned by the - * delegator. - * - * @return Returns all the dependencies. - */ - public List getDependencies() { - List resolved = new ArrayList<>(); - writers.values().forEach(s -> resolved.addAll(s.getDependencies())); - return resolved; - } - - /** - * Gets a previously created writer or creates a new one if needed - * and adds a new line if the writer already exists. - * - * @param filename Name of the file to create. - * @param namespace Namespace of the file's content. - * @param writerConsumer Consumer that accepts and works with the file. - */ - public void useFileWriter(String filename, String namespace, Consumer writerConsumer) { - writerConsumer.accept(checkoutWriter(filename, namespace)); - } - - GoWriter checkoutWriter(String filename, String namespace) { - String formattedFilename = Paths.get(filename).normalize().toString(); - boolean needsNewline = writers.containsKey(formattedFilename); - - GoWriter writer = writers.computeIfAbsent(formattedFilename, f -> new GoWriter(namespace)); - - if (needsNewline) { - writer.write("\n"); - } - - return writer; - } -} diff --git a/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/integration/GoIntegration.java b/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/integration/GoIntegration.java index 5762574e..6b68a281 100644 --- a/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/integration/GoIntegration.java +++ b/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/integration/GoIntegration.java @@ -127,6 +127,7 @@ default void onShapeWriterUse( * @param writerFactory A factory function that takes the name of a file * to write and a {@code Consumer} that receives a * {@link GoSettings} to perform the actual writing to the file. + * @deprecated use {@link #writeAdditionalFiles(GoCodegenContext)}. */ default void writeAdditionalFiles( GoSettings settings, @@ -144,6 +145,7 @@ default void writeAdditionalFiles( * @param model Model to generate from. * @param symbolProvider Symbol provider used for codegen. * @param goDelegator GoDelegator used to manage writer for the file. + * @deprecated use {@link #writeAdditionalFiles(GoCodegenContext)}. */ default void writeAdditionalFiles( GoSettings settings, @@ -154,6 +156,14 @@ default void writeAdditionalFiles( // pass } + /** + * Writes additional files. + * @param ctx The codegen context. + */ + default void writeAdditionalFiles(GoCodegenContext ctx) { + // pass + } + /** * Gets a list of protocol generators to register. * diff --git a/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/integration/Waiters.java b/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/integration/Waiters.java index 40a01c84..b23be030 100644 --- a/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/integration/Waiters.java +++ b/codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/integration/Waiters.java @@ -26,8 +26,7 @@ import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.go.codegen.ClientOptions; -import software.amazon.smithy.go.codegen.GoDelegator; -import software.amazon.smithy.go.codegen.GoSettings; +import software.amazon.smithy.go.codegen.GoCodegenContext; import software.amazon.smithy.go.codegen.GoWriter; import software.amazon.smithy.go.codegen.SmithyGoDependency; import software.amazon.smithy.go.codegen.SymbolUtils; @@ -60,26 +59,17 @@ public Set getAdditionalClientOptions() { } @Override - public void writeAdditionalFiles( - GoSettings settings, - Model model, - SymbolProvider symbolProvider, - GoDelegator goDelegator - ) { - ServiceShape serviceShape = settings.getService(model); - TopDownIndex topDownIndex = TopDownIndex.of(model); + public void writeAdditionalFiles(GoCodegenContext ctx) { + var service = ctx.settings().getService(ctx.model()); - topDownIndex.getContainedOperations(serviceShape).stream() + TopDownIndex.of(ctx.model()).getContainedOperations(service).stream() .forEach(operation -> { if (!operation.hasTrait(WaitableTrait.ID)) { return; } Map waiters = operation.expectTrait(WaitableTrait.class).getWaiters(); - - goDelegator.useShapeWriter(operation, writer -> { - generateOperationWaiter(model, symbolProvider, writer, serviceShape, operation, waiters); - }); + generateOperationWaiter(ctx, operation, waiters); }); } @@ -87,31 +77,18 @@ public void writeAdditionalFiles( /** * Generates all waiter components used for the operation. */ - private void generateOperationWaiter( - Model model, - SymbolProvider symbolProvider, - GoWriter writer, - ServiceShape service, - OperationShape operation, - Map waiters - ) { - // generate waiter function - waiters.forEach((name, waiter) -> { - // write waiter options - generateWaiterOptions(model, symbolProvider, writer, operation, name, waiter); - - // write waiter client - generateWaiterClient(model, symbolProvider, writer, operation, name, waiter); - - // write waiter specific invoker - generateWaiterInvoker(model, symbolProvider, writer, operation, name, waiter); - - // write waiter specific invoker with output - generateWaiterInvokerWithOutput(model, symbolProvider, writer, operation, name, waiter); - - // write waiter state mutator for each waiter - generateRetryable(model, symbolProvider, writer, service, operation, name, waiter); - + private void generateOperationWaiter(GoCodegenContext ctx, OperationShape operation, Map waiters) { + var model = ctx.model(); + var symbolProvider = ctx.symbolProvider(); + var service = ctx.settings().getService(model); + ctx.writerDelegator().useShapeWriter(operation, writer -> { + waiters.forEach((name, waiter) -> { + generateWaiterOptions(model, symbolProvider, writer, operation, name, waiter); + generateWaiterClient(model, symbolProvider, writer, operation, name, waiter); + generateWaiterInvoker(model, symbolProvider, writer, operation, name, waiter); + generateWaiterInvokerWithOutput(model, symbolProvider, writer, operation, name, waiter); + generateRetryable(model, symbolProvider, writer, service, operation, name, waiter); + }); }); } diff --git a/codegen/smithy-go-codegen/src/test/java/software/amazon/smithy/go/codegen/GenerateStandaloneGoModuleTest.java b/codegen/smithy-go-codegen/src/test/java/software/amazon/smithy/go/codegen/GenerateStandaloneGoModuleTest.java index b152e16a..e872ac88 100644 --- a/codegen/smithy-go-codegen/src/test/java/software/amazon/smithy/go/codegen/GenerateStandaloneGoModuleTest.java +++ b/codegen/smithy-go-codegen/src/test/java/software/amazon/smithy/go/codegen/GenerateStandaloneGoModuleTest.java @@ -25,8 +25,9 @@ public void testGenerateGoModule() throws Exception { var testPath = Files.createTempDirectory(getClass().getName()); LOGGER.warning("generating test suites into " + testPath); + // symbol provider not needed here since only useFileWriter is called var fileManifest = FileManifest.create(testPath); - var writers = new GoWriterDelegator(fileManifest); + var writers = new GoDelegator(fileManifest, null); writers.useFileWriter("test-directory/package-name/gofile.go", "github.com/aws/smithy-go/internal/testmodule/packagename",