void execute()

in codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/CodegenVisitor.java [189:291]


    void execute() {
        // Generate models that are connected to the service being generated.
        LOGGER.fine("Walking shapes from " + service.getId() + " to find shapes to generate");
        Set<Shape> serviceShapes = new TreeSet<>(new Walker(modelWithoutTraitShapes).walkShapes(service));

        for (Shape shape : serviceShapes) {
            shape.accept(this);
        }

        // Generate any required types and functions need to support protocol documents.
        protocolDocumentGenerator.generateDocumentSupport();

        // Generate a struct to handle unknown tags in unions
        List<UnionShape> unions = serviceShapes.stream()
                .map(Shape::asUnionShape)
                .flatMap(OptionalUtils::stream)
                .collect(Collectors.toList());
        if (!unions.isEmpty()) {
            writers.useShapeWriter(unions.get(0), writer -> {
                UnionGenerator.generateUnknownUnion(writer, unions, symbolProvider);
            });
        }

        for (GoIntegration integration : integrations) {
            integration.writeAdditionalFiles(settings, model, symbolProvider, writers::useFileWriter);
            integration.writeAdditionalFiles(settings, model, symbolProvider, writers);
            integration.writeAdditionalFiles(ctx);
        }

        eventStreamGenerator.generateEventStreamInterfaces();
        TopDownIndex.of(model).getContainedOperations(service)
                .forEach(eventStreamGenerator::generateOperationEventStreamStructure);

        if (protocolGenerator != null) {
            LOGGER.info("Generating serde for protocol " + protocolGenerator.getProtocol() + " on " + service.getId());
            ProtocolGenerator.GenerationContext.Builder contextBuilder = ProtocolGenerator.GenerationContext.builder()
                    .protocolName(protocolGenerator.getProtocolName())
                    .integrations(integrations)
                    .model(model)
                    .service(service)
                    .settings(settings)
                    .symbolProvider(symbolProvider)
                    .delegator(writers);

            LOGGER.info("Generating serde for protocol " + protocolGenerator.getProtocol()
                    + " on " + service.getId());
            writers.useFileWriter("serializers.go", settings.getModuleName(), writer -> {
                ProtocolGenerator.GenerationContext context = contextBuilder.writer(writer).build();
                protocolGenerator.generateRequestSerializers(context);
                protocolGenerator.generateSharedSerializerComponents(context);
            });

            writers.useFileWriter("deserializers.go", settings.getModuleName(), writer -> {
                ProtocolGenerator.GenerationContext context = contextBuilder.writer(writer).build();
                protocolGenerator.generateResponseDeserializers(context);
                protocolGenerator.generateSharedDeserializerComponents(context);
            });

            if (eventStreamGenerator.hasEventStreamOperations()) {
                eventStreamGenerator.writeEventStreamImplementation(writer -> {
                    ProtocolGenerator.GenerationContext context = contextBuilder.writer(writer).build();
                    protocolGenerator.generateEventStreamComponents(context);
                });
            }

            writers.useFileWriter("endpoints.go", settings.getModuleName(), writer -> {
                ProtocolGenerator.GenerationContext context = contextBuilder.writer(writer).build();
                protocolGenerator.generateEndpointResolution(context);
            });

            writers.useFileWriter("auth.go", settings.getModuleName(), writer -> {
                ProtocolGenerator.GenerationContext context = contextBuilder.writer(writer).build();
                protocolGenerator.generateAuth(context);
            });

            writers.useFileWriter("endpoints_test.go", settings.getModuleName(), writer -> {
                ProtocolGenerator.GenerationContext context = contextBuilder.writer(writer).build();
                protocolGenerator.generateEndpointResolutionTests(context);
            });

            LOGGER.info("Generating protocol " + protocolGenerator.getProtocol()
                    + " unit tests for " + service.getId());
            writers.useFileWriter("protocol_test.go", settings.getModuleName(), writer -> {
                protocolGenerator.generateProtocolTests(contextBuilder.writer(writer).build());
            });

            protocolDocumentGenerator.generateInternalDocumentTypes(protocolGenerator, contextBuilder.build());
        }

        LOGGER.fine("Flushing go writers");
        List<SymbolDependency> dependencies = writers.getDependencies();
        writers.flushWriters();

        GoModuleInfo goModuleInfo = new GoModuleInfo.Builder()
                .goDirective(settings.getGoDirective())
                .dependencies(dependencies)
                .build();

        GoModGenerator.writeGoMod(settings, fileManifest, goModuleInfo);

        LOGGER.fine("Generating build manifest file");
        ManifestWriter.writeManifest(settings, model, fileManifest, goModuleInfo);
    }