From ac52df40d8da81b58a023bc16dbf21e65b30f8d4 Mon Sep 17 00:00:00 2001 From: Lucas McDonald Date: Tue, 6 Aug 2024 10:34:26 -0700 Subject: [PATCH] debug union --- .../smithy/python/codegen/UnionGenerator.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/codegen/smithy-dafny-codegen-modules/smithy-python/codegen/smithy-python-codegen/src/main/java/software/amazon/smithy/python/codegen/UnionGenerator.java b/codegen/smithy-dafny-codegen-modules/smithy-python/codegen/smithy-python-codegen/src/main/java/software/amazon/smithy/python/codegen/UnionGenerator.java index 2f437e603..1c6c27a82 100644 --- a/codegen/smithy-dafny-codegen-modules/smithy-python/codegen/smithy-python-codegen/src/main/java/software/amazon/smithy/python/codegen/UnionGenerator.java +++ b/codegen/smithy-dafny-codegen-modules/smithy-python/codegen/smithy-python-codegen/src/main/java/software/amazon/smithy/python/codegen/UnionGenerator.java @@ -26,6 +26,8 @@ import software.amazon.smithy.model.traits.DocumentationTrait; import software.amazon.smithy.utils.StringUtils; +import static java.lang.String.format; + /** * Renders unions. */ @@ -56,13 +58,10 @@ protected void writeInitMethodConstraintsChecksForMember(MemberShape member, Str } protected void writeInitMethodForMember(MemberShape member, Symbol memberSymbol, Shape targetShape, Symbol targetSymbol) { - writer.openBlock("def __init__(self, value: '$L'):".formatted( - targetShape.isStructureShape() || targetShape.isUnionShape() - ? "'$T'" - : "$T" - ), + String formatString = format("def __init__(self, value: %s):", getTargetFormat(member)); + writer.openBlock(formatString, "", - targetSymbol.getNamespace() + "." + targetSymbol.getName(), + targetSymbol, () -> { writeInitMethodConstraintsChecksForMember(member, memberSymbol.getName()); writer.write("self.value = value"); @@ -173,6 +172,17 @@ def __repr__(self) -> str: writeGlobalFromDict(); } + private String getTargetFormat(MemberShape member) { + Shape target = model.expectShape(member.getTarget()); + // Recursive shapes may be referenced before they're defined even with + // a topological sort. So forward references need to be used when + // referencing them. + if (recursiveShapes.contains(target)) { + return "'$T'"; + } + return "$T"; + } + private void writeGlobalFromDict() { var parentSymbol = symbolProvider.toSymbol(shape); var fromDictSymbol = parentSymbol.expectProperty("fromDict", Symbol.class);