private record ExpressionGeneratorVisitor()

in codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/endpoints/ExpressionGenerator.java [59:122]


    private record ExpressionGeneratorVisitor(Scope scope, FnProvider fnProvider)
            implements ExpressionVisitor<GoWriter.Writable> {

        @Override
        public GoWriter.Writable visitLiteral(Literal literal) {
            return literal.accept(new LiteralGeneratorVisitor(scope, fnProvider));
        }

        @Override
        public GoWriter.Writable visitRef(Reference ref) {
            return goTemplate(ref.getName().toString());
        }

        @Override
        public GoWriter.Writable visitGetAttr(GetAttr getAttr) {
            var target = new ExpressionGenerator(scope, fnProvider).generate(getAttr.getTarget());
            var path = (GoWriter.Writable) (GoWriter w) -> {
                getAttr.getPath().stream().toList().forEach((part) -> {
                    if (part instanceof GetAttr.Part.Key) {
                        w.writeInline(".$L", getBuiltinMemberName(((GetAttr.Part.Key) part).key()));
                    } else if (part instanceof GetAttr.Part.Index) {
                        w.writeInline(".Get($L)", ((GetAttr.Part.Index) part).index());
                    }
                });
            };

            return (GoWriter w) -> w.writeInline("$W$W", target, path);
        }

        @Override
        public GoWriter.Writable visitIsSet(Expression expr) {
            return (GoWriter w) -> {
                w.write("$W != nil", new ExpressionGenerator(scope, fnProvider).generate(expr));
            };
        }

        @Override
        public GoWriter.Writable visitNot(Expression expr) {
            return (GoWriter w) -> {
                w.write("!($W)", new ExpressionGenerator(scope, fnProvider).generate(expr));
            };
        }

        @Override
        public GoWriter.Writable visitBoolEquals(Expression left, Expression right) {
            return (GoWriter w) -> {
                var generator = new ExpressionGenerator(scope, fnProvider);
                w.write("$W == $W", generator.generate(left), generator.generate(right));
            };
        }

        @Override
        public GoWriter.Writable visitStringEquals(Expression left, Expression right) {
            return (GoWriter w) -> {
                var generator = new ExpressionGenerator(scope, fnProvider);
                w.write("$W == $W", generator.generate(left), generator.generate(right));
            };
        }

        @Override
        public GoWriter.Writable visitLibraryFunction(FunctionDefinition fnDef, List<Expression> args) {
            return new FnGenerator(scope, fnProvider).generate(fnDef, args);
        }
    }