Skip to content

Commit

Permalink
codegen: fix union serialization cases (#979)
Browse files Browse the repository at this point in the history
Fixes the cases of generated union serializer functions to use the correct types for union members.

Fixes #978
  • Loading branch information
jasdel authored Dec 15, 2020
1 parent d45c35f commit 4806b72
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import software.amazon.smithy.go.codegen.GoValueAccessUtils;
import software.amazon.smithy.go.codegen.GoWriter;
import software.amazon.smithy.go.codegen.SmithyGoDependency;
import software.amazon.smithy.go.codegen.SymbolUtils;
import software.amazon.smithy.go.codegen.integration.DocumentShapeSerVisitor;
import software.amazon.smithy.go.codegen.integration.ProtocolGenerator.GenerationContext;
import software.amazon.smithy.go.codegen.integration.ProtocolUtils;
Expand Down Expand Up @@ -211,21 +212,23 @@ protected void serializeUnion(GenerationContext context, UnionShape shape) {
Set<MemberShape> members = new TreeSet<>(shape.getAllMembers().values());
for (MemberShape member : members) {
Shape target = context.getModel().expectShape(member.getTarget());
String exportedMemberName = symbol.getName() + symbolProvider.toMemberName(member);
Symbol memberSymbol = SymbolUtils.createValueSymbolBuilder(
symbolProvider.toMemberName(member),
symbol.getNamespace()
).build();

writer.openBlock("case *$L:", "", exportedMemberName, () -> {
writer.openBlock("case *$T:", "", memberSymbol, () -> {
String locationName = getSerializedLocationName(member, member.getMemberName());
if (isFlattened(context, member)) {
writer.write("objectKey := object.FlatKey($S)", locationName);
} else {
writer.write("objectKey := object.Key($S)", locationName);
}
target.accept(getMemberSerVisitor(member, "uv.Value()", "objectKey"));
target.accept(getMemberSerVisitor(member, "uv.Value", "objectKey"));
});
}

// Handle unknown union values
writer.openBlock("case *$LUnknown:", "", symbol.getName(), () -> writer.write("fallthrough"));
writer.openBlock("default:", "", () -> {
writer.write("return fmt.Errorf(\"attempted to serialize unknown member type %T"
+ " for union %T\", uv, v)");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import software.amazon.smithy.go.codegen.GoValueAccessUtils;
import software.amazon.smithy.go.codegen.GoWriter;
import software.amazon.smithy.go.codegen.SmithyGoDependency;
import software.amazon.smithy.go.codegen.SymbolUtils;
import software.amazon.smithy.go.codegen.integration.DocumentShapeSerVisitor;
import software.amazon.smithy.go.codegen.integration.ProtocolGenerator.GenerationContext;
import software.amazon.smithy.go.codegen.trait.NoSerializeTrait;
Expand Down Expand Up @@ -183,17 +184,19 @@ protected void serializeUnion(GenerationContext context, UnionShape shape) {
Set<MemberShape> members = new TreeSet<>(shape.getAllMembers().values());
for (MemberShape member : members) {
Shape target = context.getModel().expectShape(member.getTarget());
Symbol memberSymbol = symbolProvider.toSymbol(member);
String exportedMemberName = symbol.getName() + symbolProvider.toMemberName(member);

writer.openBlock("case *$L:", "", exportedMemberName, () -> {
writer.write("av := value.MemberElement($S)", memberSymbol.getName());
target.accept(getMemberSerVisitor(member, "uv.Value()", "av"));
Symbol memberSymbol = SymbolUtils.createValueSymbolBuilder(
symbolProvider.toMemberName(member),
symbol.getNamespace()
).build();

writer.openBlock("case *$T:", "", memberSymbol, () -> {
XmlProtocolUtils.generateXMLStartElement(context, member, "customMemberName", "v");
writer.write("av := value.MemberElement(customMemberName)");
target.accept(getMemberSerVisitor(member, "uv.Value", "av"));
});
}

// Handle unknown union values
writer.openBlock("case *$LUnknown:", "", symbol.getName(), () -> writer.write("fallthrough"));
writer.openBlock("default:", "", () -> {
writer.write("return fmt.Errorf(\"attempted to serialize unknown member type %T"
+ " for union %T\", uv, v)");
Expand Down

0 comments on commit 4806b72

Please sign in to comment.