All Downloads are FREE. Search and download functionalities are using the official Maven repository.

software.amazon.smithy.traitcodegen.generators.StructureShapeGenerator Maven / Gradle / Ivy

/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0
 */

package software.amazon.smithy.traitcodegen.generators;

import java.util.function.Consumer;
import software.amazon.smithy.codegen.core.Symbol;
import software.amazon.smithy.model.node.ToNode;
import software.amazon.smithy.traitcodegen.GenerateTraitDirective;
import software.amazon.smithy.traitcodegen.sections.ClassSection;
import software.amazon.smithy.traitcodegen.writer.TraitCodegenWriter;
import software.amazon.smithy.utils.ToSmithyBuilder;

/**
 * Generates a Java class from a Smithy {@code StructureShape}.
 */
final class StructureShapeGenerator implements Consumer {
    @Override
    public void accept(GenerateTraitDirective directive) {
        directive.context().writerDelegator().useShapeWriter(directive.shape(), writer -> {
            writer.pushState(new ClassSection(directive.shape()))
                    .openBlock("public final class $1T implements $2T, $3T<$1T> {", "}",
                            directive.symbol(), ToNode.class, ToSmithyBuilder.class, () -> {
                        new PropertiesGenerator(writer, directive.shape(), directive.symbolProvider()).run();
                        new ConstructorGenerator(writer, directive.symbol(), directive.shape(),
                                directive.symbolProvider()).run();
                        new ToNodeGenerator(writer, directive.shape(), directive.symbolProvider(),
                                directive.model()).run();
                        new FromNodeGenerator(writer, directive.symbol(), directive.shape(),
                                directive.symbolProvider(), directive.model()).run();
                        new GetterGenerator(writer, directive.symbolProvider(), directive.model(),
                                directive.shape()).run();
                        new BuilderGenerator(writer, directive.symbol(), directive.symbolProvider(),
                                directive.shape(), directive.model()).run();
                        writeEquals(writer, directive.symbol());
                        writeHashCode(writer);
                    })
                    .popState();
            writer.newLine();
        });
    }

    private void writeEquals(TraitCodegenWriter writer, Symbol symbol) {
        writer.override();
        writer.openBlock("public boolean equals(Object other) {", "}", () -> {
            writer.disableNewlines();
            writer.openBlock("if (other == this) {\n", "}",
                    () -> writer.writeWithNoFormatting("return true;").newLine());
            writer.openBlock(" else if (!(other instanceof $T)) {\n", "}", symbol,
                    () -> writer.writeWithNoFormatting("return false;").newLine());
            writer.openBlock(" else {\n", "}", () -> {
                writer.write("$1T b = ($1T) other;", symbol).newLine();
                writer.writeWithNoFormatting("return toNode().equals(b.toNode());\n");
            }).newLine();
            writer.enableNewlines();
        });
        writer.newLine();
    }

    private void writeHashCode(TraitCodegenWriter writer) {
        writer.override();
        writer.openBlock("public int hashCode() {", "}",
                () -> writer.writeWithNoFormatting("return toNode().hashCode();"));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy