Skip to content

Commit bf06e19

Browse files
fix(Go): fix Nativewrapper on positional trait (#753)
1 parent f67c210 commit bf06e19

File tree

3 files changed

+88
-26
lines changed

3 files changed

+88
-26
lines changed

Diff for: codegen/smithy-dafny-codegen/src/main/java/software/amazon/polymorph/smithygo/localservice/DafnyLocalServiceGenerator.java

+16-6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
package software.amazon.polymorph.smithygo.localservice;
55

6+
import static software.amazon.polymorph.smithygo.codegen.SymbolUtils.POINTABLE;
67
import static software.amazon.polymorph.smithygo.utils.Constants.DAFNY_RUNTIME_GO_LIBRARY_MODULE;
78

89
import software.amazon.polymorph.smithygo.codegen.GenerationContext;
@@ -1125,13 +1126,14 @@ void generateNativeResourceWrapper(
11251126
"dafny"
11261127
);
11271128
} else {
1128-
String fromDafnyConvMethodNameForOutput =
1129+
String toDafnyConvMethodNameForOutput =
11291130
SmithyNameResolver.getToDafnyMethodName(
11301131
service,
11311132
outputShape,
11321133
""
11331134
);
11341135
boolean deReferenceRequired = true;
1136+
boolean referenceType = false;
11351137
if (outputShape.hasTrait(PositionalTrait.class)) {
11361138
final MemberShape postionalMemShape = outputShape
11371139
.getAllMembers()
@@ -1147,26 +1149,34 @@ void generateNativeResourceWrapper(
11471149
.expectTrait(ReferenceTrait.class)
11481150
.getReferentId()
11491151
);
1152+
// If shape is pointer type, we need to fetch its address
1153+
// because conversion function will have pointer as input
1154+
referenceType =
1155+
context
1156+
.symbolProvider()
1157+
.toSymbol(outputShape)
1158+
.getProperty(POINTABLE, Boolean.class)
1159+
.orElse(false);
11501160
}
1151-
fromDafnyConvMethodNameForOutput =
1161+
toDafnyConvMethodNameForOutput =
11521162
outputShape.isResourceShape()
1153-
? SmithyNameResolver.getFromDafnyMethodName(
1163+
? SmithyNameResolver.getToDafnyMethodName(
11541164
service,
11551165
outputShape,
11561166
""
11571167
)
11581168
: Constants.funcNameGenerator(
11591169
postionalMemShape,
1160-
"FromDafny",
1170+
"ToDafny",
11611171
model
11621172
);
11631173
deReferenceRequired = false;
11641174
}
11651175
clientResponse = "var native_response, native_error";
11661176
returnResponse =
11671177
"%s(%snative_response)".formatted(
1168-
fromDafnyConvMethodNameForOutput,
1169-
deReferenceRequired ? "*" : ""
1178+
toDafnyConvMethodNameForOutput,
1179+
deReferenceRequired ? "*" : (referenceType ? "&" : "")
11701180
);
11711181
}
11721182
writer.write(

Diff for: codegen/smithy-dafny-codegen/src/main/java/software/amazon/polymorph/smithygo/localservice/DafnyLocalServiceTypeConversionProtocol.java

+54-11
Original file line numberDiff line numberDiff line change
@@ -1575,9 +1575,10 @@ private void generateSerializerFunctions(
15751575
}
15761576
alreadyVisited.add(visitingMemberShape.toShapeId());
15771577
String inputType;
1578-
final var outputType = ShapeVisitorHelper.isToDafnyShapeOptional(
1579-
visitingMemberShape
1580-
)
1578+
final Boolean isOptional = ShapeVisitorHelper.isToDafnyShapeOptional(
1579+
visitingMemberShape
1580+
);
1581+
var outputType = isOptional
15811582
? "Wrappers.Option"
15821583
: DafnyNameResolver.getDafnyType(
15831584
visitingShape,
@@ -1589,15 +1590,57 @@ private void generateSerializerFunctions(
15891590
visitingShape,
15901591
true
15911592
);
1592-
if (
1593-
context
1594-
.symbolProvider()
1595-
.toSymbol(visitingMemberShape)
1596-
.getProperty(POINTABLE, Boolean.class)
1597-
.orElse(false)
1598-
) {
1599-
inputType = "*".concat(inputType);
1593+
Boolean isPointable = context
1594+
.symbolProvider()
1595+
.toSymbol(visitingMemberShape)
1596+
.getProperty(POINTABLE, Boolean.class)
1597+
.orElse(false);
1598+
if (visitingShape.hasTrait(ReferenceTrait.class)) {
1599+
final var referenceTrait = visitingShape.expectTrait(
1600+
ReferenceTrait.class
1601+
);
1602+
final var resourceOrService = context
1603+
.model()
1604+
.expectShape(referenceTrait.getReferentId());
1605+
isPointable =
1606+
context
1607+
.symbolProvider()
1608+
.toSymbol(resourceOrService)
1609+
.getProperty(POINTABLE, Boolean.class)
1610+
.orElse(false);
1611+
if (resourceOrService.isServiceShape()) {
1612+
if (resourceOrService.hasTrait(ServiceTrait.class)) {
1613+
outputType =
1614+
isOptional
1615+
? "Wrappers.Option"
1616+
: DafnyNameResolver.getDafnyInterfaceClient(
1617+
resourceOrService.asServiceShape().get(),
1618+
resourceOrService.getTrait(ServiceTrait.class).get()
1619+
);
1620+
inputType =
1621+
GoCodegenUtils.getType(
1622+
context.symbolProvider().toSymbol(resourceOrService),
1623+
resourceOrService,
1624+
true
1625+
);
1626+
} else {
1627+
outputType =
1628+
isOptional
1629+
? "Wrappers.Option"
1630+
: DafnyNameResolver.getDafnyInterfaceClient(
1631+
resourceOrService
1632+
);
1633+
inputType =
1634+
SmithyNameResolver
1635+
.shapeNamespace(resourceOrService)
1636+
.concat(".")
1637+
.concat(
1638+
context.symbolProvider().toSymbol(serviceShape).getName()
1639+
);
1640+
}
1641+
}
16001642
}
1643+
inputType = isPointable ? "*".concat(inputType) : inputType;
16011644
writer.write(
16021645
"""
16031646
func $L(input $L)($L) {

Diff for: codegen/smithy-dafny-codegen/src/main/java/software/amazon/polymorph/smithygo/localservice/shapevisitor/ShapeVisitorHelper.java

+18-9
Original file line numberDiff line numberDiff line change
@@ -140,17 +140,26 @@ public static String toDafnyShapeVisitorWriter(
140140
final Shape targetShape = context
141141
.model()
142142
.expectShape(memberShape.getTarget());
143+
// Resource shape already goes into a function
143144
if (targetShape.hasTrait(ReferenceTrait.class)) {
144-
return targetShape.accept(
145-
new SmithyToDafnyShapeVisitor(
146-
context,
147-
dataSource,
148-
writer,
149-
isConfigShape,
150-
isOptional,
151-
isPointerType
152-
)
145+
final ReferenceTrait referenceTrait = targetShape.expectTrait(
146+
ReferenceTrait.class
153147
);
148+
final Shape resourceOrService = context
149+
.model()
150+
.expectShape(referenceTrait.getReferentId());
151+
if (resourceOrService.isResourceShape()) {
152+
return targetShape.accept(
153+
new SmithyToDafnyShapeVisitor(
154+
context,
155+
dataSource,
156+
writer,
157+
isConfigShape,
158+
isOptional,
159+
isPointerType
160+
)
161+
);
162+
}
154163
}
155164
final String funcDataSource = "input";
156165
if (

0 commit comments

Comments
 (0)