From 5c75233d66576eeb35c3db2fe1d640bf22a3ac24 Mon Sep 17 00:00:00 2001 From: JordonPhillips Date: Fri, 28 Feb 2025 18:23:13 +0100 Subject: [PATCH] Write out node values immutably This updates the node value serializer to write out immutable collections. This formatter is used for protocol tests and trait values. In the former case it doesn't matter either way, and in the latter we explicitly want immutable values. --- .../python/codegen/writer/PythonWriter.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/writer/PythonWriter.java b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/writer/PythonWriter.java index c9e598500..4e9e7a335 100644 --- a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/writer/PythonWriter.java +++ b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/writer/PythonWriter.java @@ -67,7 +67,7 @@ public PythonWriter(PythonSettings settings, String fullPackageName, boolean add trimBlankLines(); trimTrailingSpaces(); putFormatter('T', new PythonSymbolFormatter()); - putFormatter('N', new PythonNodeFormatter()); + putFormatter('N', new PythonNodeFormatter(this)); this.addCodegenWarningHeader = addCodegenWarningHeader; } @@ -325,6 +325,12 @@ private Boolean isOperationSymbol(Symbol typeSymbol) { } private final class PythonNodeFormatter implements BiFunction { + private final PythonWriter writer; + + PythonNodeFormatter(PythonWriter writer) { + this.writer = writer; + } + @Override public String apply(Object node, String indent) { if (node instanceof Optional) { @@ -334,16 +340,18 @@ public String apply(Object node, String indent) { throw new CodegenException( "Invalid type provided to $D. Expected a Node, but found `" + node + "`"); } - return ((Node) node).accept(new PythonNodeFormatVisitor(indent)); + return ((Node) node).accept(new PythonNodeFormatVisitor(indent, writer)); } } private final class PythonNodeFormatVisitor implements NodeVisitor { private String indent; + private final PythonWriter writer; - PythonNodeFormatVisitor(String indent) { + PythonNodeFormatVisitor(String indent, PythonWriter writer) { this.indent = indent; + this.writer = writer; } @Override @@ -379,10 +387,10 @@ public String stringNode(StringNode node) { @Override public String arrayNode(ArrayNode node) { if (node.getElements().isEmpty()) { - return "[]"; + return "()"; } - StringBuilder builder = new StringBuilder("[\n"); + StringBuilder builder = new StringBuilder("(\n"); var oldIndent = indent; indent += getIndentText(); for (Node element : node.getElements()) { @@ -392,17 +400,18 @@ public String arrayNode(ArrayNode node) { } indent = oldIndent; builder.append(indent); - builder.append(']'); + builder.append(')'); return builder.toString(); } @Override public String objectNode(ObjectNode node) { + writer.addStdlibImport("types", "MappingProxyType"); if (node.getMembers().isEmpty()) { - return "{}"; + return "MappingProxyType({})"; } - StringBuilder builder = new StringBuilder("{\n"); + StringBuilder builder = new StringBuilder("MappingProxyType({\n"); var oldIndent = indent; indent += getIndentText(); for (Map.Entry member : node.getMembers().entrySet()) { @@ -414,7 +423,7 @@ public String objectNode(ObjectNode node) { } indent = oldIndent; builder.append(indent); - builder.append('}'); + builder.append("})"); return builder.toString(); } }