Skip to content

Commit 955244d

Browse files
authored
fix(smithy-dafny): local Service config in another namespace (#207)
1 parent 77aeeb1 commit 955244d

File tree

2 files changed

+24
-18
lines changed

2 files changed

+24
-18
lines changed

codegen/smithy-dafny-codegen/src/main/java/software/amazon/polymorph/smithydafny/DafnyApiCodegen.java

+19-13
Original file line numberDiff line numberDiff line change
@@ -119,19 +119,23 @@ public Map<Path, TokenTree> generate() {
119119
DafnyNameResolverHelpers.dafnyExternNamespaceForShapeId(serviceShape.getId()),
120120
typesModuleName
121121
));
122-
122+
final TokenTree abstractServiceModule = generateAbstractServiceModule(serviceShape);
123+
final TokenTree abstractOperationsModule = generateAbstractOperationsModule(serviceShape);
124+
final TokenTree modeledErrorDataType = generateModeledErrorDataType();
123125
// A smithy model may reference a model in a different package.
124126
// In which case we need to import it.
127+
// Everything MUST BE GENERATED BEFORE `typesModulePrelude` is calculated.
128+
// Otherwise, a foreign shape maybe referenced WITHOUT an import.
125129
final TokenTree typesModulePrelude = TokenTree
126130
.of(Stream
127131
.concat(
128-
nameResolver.modulePreludeStandardImports(),
132+
DafnyNameResolver.modulePreludeStandardImports(),
129133
nameResolver
130134
.dependentModels()
131135
.stream()
132136
.map(d ->
133-
"import " + nameResolver.dafnyTypesModuleForNamespace(d.namespace())))
134-
.map(i -> Token.of(i))
137+
"import " + DafnyNameResolver.dafnyTypesModuleForNamespace(d.namespace())))
138+
.map(Token::of)
135139
)
136140
.lineSeparated();
137141

@@ -152,7 +156,7 @@ public Map<Path, TokenTree> generate() {
152156
// Error types are generated *after*
153157
// all other types to account
154158
// for any dependent modules
155-
generateModeledErrorDataType()
159+
modeledErrorDataType
156160
)
157161
.lineSeparated()
158162
.braced();
@@ -163,8 +167,8 @@ public Map<Path, TokenTree> generate() {
163167
includeDirectives,
164168
typesModuleHeader,
165169
typesModuleBody,
166-
generateAbstractServiceModule(serviceShape),
167-
generateAbstractOperationsModule(serviceShape)
170+
abstractServiceModule,
171+
abstractOperationsModule
168172
)
169173
.lineSeparated();
170174
return Map.of(path, fullCode);
@@ -425,7 +429,7 @@ public TokenTree generateReferenceTraitDefinition(final ShapeId shapeWithReferen
425429
// the module needs to be included
426430
// because we are obviously using it!
427431
final String sideEffect = nameResolver
428-
.dafnyModulePrefixForShapeId(model.expectShape(referenceTrait.getReferentId()));
432+
.dafnyModulePrefixForShape(model.expectShape(referenceTrait.getReferentId()));
429433
return null;
430434
}
431435

@@ -1350,6 +1354,7 @@ abstractModulePrelude, generateAbstractLocalService(serviceShape)
13501354
}
13511355
}
13521356

1357+
// This method needs to be called before typesModulePrelude is calculated
13531358
public TokenTree generateAbstractServiceModule(ServiceShape serviceShape) {
13541359
final TokenTree abstractModulePrelude = TokenTree
13551360
.of(DafnyNameResolver.abstractModulePrelude(serviceShape))
@@ -1358,11 +1363,12 @@ public TokenTree generateAbstractServiceModule(ServiceShape serviceShape) {
13581363
.formatted(nameResolver.abstractServiceModuleName(serviceShape)));
13591364

13601365
if (serviceShape.hasTrait(ServiceTrait.class)) {
1366+
TokenTree body = generateAbstractAwsServiceClass(serviceShape);
13611367
return moduleHeader
13621368
.append(Token
13631369
.of(
13641370
abstractModulePrelude,
1365-
generateAbstractAwsServiceClass(serviceShape)
1371+
body
13661372
)
13671373
.lineSeparated()
13681374
.braced()
@@ -1829,8 +1835,8 @@ public TokenTree generateAbstractLocalService(ServiceShape serviceShape) {
18291835
if (!serviceShape.hasTrait(LocalServiceTrait.class)) throw new IllegalStateException("MUST be an LocalService");
18301836
final LocalServiceTrait localServiceTrait = serviceShape.expectTrait(LocalServiceTrait.class);
18311837

1832-
final String configTypeName = localServiceTrait.getConfigId().getName();
1833-
final String defaultFunctionMethodName = "Default%s".formatted(configTypeName);
1838+
final String configTypeName = nameResolver.baseTypeForShape(localServiceTrait.getConfigId());
1839+
final String defaultFunctionMethodName = "Default%s".formatted(localServiceTrait.getConfigId().getName());
18341840

18351841
final TokenTree defaultConfig = TokenTree
18361842
.of("function method %s(): %s".formatted(defaultFunctionMethodName, configTypeName));
@@ -1940,8 +1946,8 @@ public TokenTree generateAbstractWrappedLocalService(ServiceShape serviceShape)
19401946
.of(DafnyNameResolver.wrappedAbstractModulePrelude(serviceShape))
19411947
.lineSeparated();
19421948

1943-
final String configTypeName = localServiceTrait.getConfigId().getName();
1944-
final String defaultFunctionMethodName = "Default%s".formatted(configTypeName);
1949+
final String configTypeName = nameResolver.baseTypeForShape(localServiceTrait.getConfigId());
1950+
final String defaultFunctionMethodName = "Default%s".formatted(localServiceTrait.getConfigId().getName());
19451951

19461952
final TokenTree defaultConfig = TokenTree
19471953
.of("function method Wrapped%s(): %s".formatted(defaultFunctionMethodName, configTypeName));

codegen/smithy-dafny-codegen/src/main/java/software/amazon/polymorph/smithydafny/DafnyNameResolver.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public String baseTypeForShape(final ShapeId shapeId) {
6868
// currently unused in model and unsupported in StandardLibrary.UInt
6969
// BYTE, SHORT
7070
INTEGER, LONG, DOUBLE,
71-
LIST, MAP -> dafnyModulePrefixForShapeId(shape) + shapeName;
71+
LIST, MAP -> dafnyModulePrefixForShape(shape) + shapeName;
7272
case STRUCTURE -> {
7373
if (shape.hasTrait(ReferenceTrait.class)) {
7474
yield baseTypeForShape(shape.expectTrait(ReferenceTrait.class).getReferentId());
@@ -108,7 +108,7 @@ private String baseTypeForMember(final MemberShape memberShape) {
108108
}
109109

110110
private String dafnyTypeNameShape(final Shape shape) {
111-
return dafnyModulePrefixForShapeId(shape) + shape.getId().getName();
111+
return dafnyModulePrefixForShape(shape) + shape.getId().getName();
112112
}
113113

114114
public String generatedTypeForShape(final ShapeId shapeId) {
@@ -120,7 +120,7 @@ public static String traitNameForServiceClient(final ServiceShape serviceShape)
120120
}
121121

122122
public String traitForServiceClient(final ServiceShape serviceShape) {
123-
return dafnyModulePrefixForShapeId(serviceShape) + traitNameForServiceClient(serviceShape);
123+
return dafnyModulePrefixForShape(serviceShape) + traitNameForServiceClient(serviceShape);
124124
}
125125

126126
public static String classNameForServiceClient(ServiceShape shape) {
@@ -133,7 +133,7 @@ public static String classNameForServiceClient(ServiceShape shape) {
133133
}
134134

135135
public String traitForResource(final ResourceShape resourceShape) {
136-
return dafnyModulePrefixForShapeId(resourceShape) + traitNameForResource(resourceShape);
136+
return dafnyModulePrefixForShape(resourceShape) + traitNameForResource(resourceShape);
137137
}
138138

139139
public static String traitNameForResource(final ResourceShape shape) {
@@ -260,7 +260,7 @@ public static String dafnyInternalConfigModuleForNamespace(final String namespac
260260
}
261261

262262

263-
public String dafnyModulePrefixForShapeId(final Shape shape) {
263+
public String dafnyModulePrefixForShape(final Shape shape) {
264264
final String shapeNamespace = shape.getId().getNamespace();
265265
if (!namespace.equals(shapeNamespace)) {
266266

0 commit comments

Comments
 (0)