Skip to content

Commit 46369b6

Browse files
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.
1 parent b0043d0 commit 46369b6

File tree

1 file changed

+18
-9
lines changed
  • codegen/core/src/main/java/software/amazon/smithy/python/codegen/writer

1 file changed

+18
-9
lines changed

codegen/core/src/main/java/software/amazon/smithy/python/codegen/writer/PythonWriter.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public PythonWriter(PythonSettings settings, String fullPackageName, boolean add
6767
trimBlankLines();
6868
trimTrailingSpaces();
6969
putFormatter('T', new PythonSymbolFormatter());
70-
putFormatter('N', new PythonNodeFormatter());
70+
putFormatter('N', new PythonNodeFormatter(this));
7171
this.addCodegenWarningHeader = addCodegenWarningHeader;
7272
}
7373

@@ -325,6 +325,12 @@ private Boolean isOperationSymbol(Symbol typeSymbol) {
325325
}
326326

327327
private final class PythonNodeFormatter implements BiFunction<Object, String, String> {
328+
private final PythonWriter writer;
329+
330+
PythonNodeFormatter(PythonWriter writer) {
331+
this.writer = writer;
332+
}
333+
328334
@Override
329335
public String apply(Object node, String indent) {
330336
if (node instanceof Optional<?>) {
@@ -334,16 +340,18 @@ public String apply(Object node, String indent) {
334340
throw new CodegenException(
335341
"Invalid type provided to $D. Expected a Node, but found `" + node + "`");
336342
}
337-
return ((Node) node).accept(new PythonNodeFormatVisitor(indent));
343+
return ((Node) node).accept(new PythonNodeFormatVisitor(indent, writer));
338344
}
339345
}
340346

341347
private final class PythonNodeFormatVisitor implements NodeVisitor<String> {
342348

343349
private String indent;
350+
private final PythonWriter writer;
344351

345-
PythonNodeFormatVisitor(String indent) {
352+
PythonNodeFormatVisitor(String indent, PythonWriter writer) {
346353
this.indent = indent;
354+
this.writer = writer;
347355
}
348356

349357
@Override
@@ -379,10 +387,10 @@ public String stringNode(StringNode node) {
379387
@Override
380388
public String arrayNode(ArrayNode node) {
381389
if (node.getElements().isEmpty()) {
382-
return "[]";
390+
return "()";
383391
}
384392

385-
StringBuilder builder = new StringBuilder("[\n");
393+
StringBuilder builder = new StringBuilder("(\n");
386394
var oldIndent = indent;
387395
indent += getIndentText();
388396
for (Node element : node.getElements()) {
@@ -392,17 +400,18 @@ public String arrayNode(ArrayNode node) {
392400
}
393401
indent = oldIndent;
394402
builder.append(indent);
395-
builder.append(']');
403+
builder.append(')');
396404
return builder.toString();
397405
}
398406

399407
@Override
400408
public String objectNode(ObjectNode node) {
409+
writer.addStdlibImport("types", "MappingProxyType");
401410
if (node.getMembers().isEmpty()) {
402-
return "{}";
411+
return "MappingProxyType({})";
403412
}
404413

405-
StringBuilder builder = new StringBuilder("{\n");
414+
StringBuilder builder = new StringBuilder("MappingProxyType({\n");
406415
var oldIndent = indent;
407416
indent += getIndentText();
408417
for (Map.Entry<StringNode, Node> member : node.getMembers().entrySet()) {
@@ -414,7 +423,7 @@ public String objectNode(ObjectNode node) {
414423
}
415424
indent = oldIndent;
416425
builder.append(indent);
417-
builder.append('}');
426+
builder.append("})");
418427
return builder.toString();
419428
}
420429
}

0 commit comments

Comments
 (0)