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(); } }