Skip to content

Commit 436ee73

Browse files
authored
fix: namespace fix (#351)
1 parent 939b6ef commit 436ee73

File tree

2 files changed

+88
-3
lines changed

2 files changed

+88
-3
lines changed

smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/SymbolVisitor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ class SymbolVisitor(private val model: Model, swiftSettings: SwiftSettings) :
157157
// add a reference to each member symbol
158158
addDeclareMemberReferences(builder, shape.allMembers.values)
159159

160-
if (shape.hasTrait<NestedTrait>() && service != null) {
160+
if (shape.hasTrait<NestedTrait>() && service != null && !shape.hasTrait<ErrorTrait>()) {
161161
builder.namespace(service.nestedNamespaceType(this).name, ".")
162162
}
163163

smithy-swift-codegen/src/test/kotlin/SymbolProviderTest.kt

Lines changed: 87 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@ import software.amazon.smithy.model.Model
1515
import software.amazon.smithy.model.shapes.ListShape
1616
import software.amazon.smithy.model.shapes.MapShape
1717
import software.amazon.smithy.model.shapes.MemberShape
18+
import software.amazon.smithy.model.shapes.OperationShape
19+
import software.amazon.smithy.model.shapes.ServiceShape
1820
import software.amazon.smithy.model.shapes.SetShape
1921
import software.amazon.smithy.model.shapes.StructureShape
22+
import software.amazon.smithy.model.traits.ErrorTrait
2023
import software.amazon.smithy.swift.codegen.SwiftCodegenPlugin
2124
import software.amazon.smithy.swift.codegen.SymbolVisitor
25+
import software.amazon.smithy.swift.codegen.model.NestedShapeTransformer
2226
import software.amazon.smithy.swift.codegen.model.defaultValue
2327
import software.amazon.smithy.swift.codegen.model.isBoxed
2428

@@ -220,12 +224,93 @@ class SymbolProviderTest {
220224

221225
for (validName in validNames) {
222226
val isSwiftIdentifierValid = SymbolVisitor.isValidSwiftIdentifier(validName)
223-
assertTrue(isSwiftIdentifierValid, "$validName is wrongly interpretted as invalid swift identifier")
227+
assertTrue(isSwiftIdentifierValid, "$validName is wrongly interpreted as invalid swift identifier")
224228
}
225229

226230
for (invalidName in invalidNames) {
227231
val isSwiftIdentifierValid = SymbolVisitor.isValidSwiftIdentifier(invalidName)
228-
assertFalse(isSwiftIdentifierValid, "$invalidName is wrongly interpretted as valid swift identifier")
232+
assertFalse(isSwiftIdentifierValid, "$invalidName is wrongly interpreted as valid swift identifier")
229233
}
230234
}
235+
236+
@Test
237+
fun `it adds namespace to nested structure`() {
238+
val memberQuux = MemberShape.builder()
239+
.id("foo.bar#Struct1\$quux")
240+
.target("smithy.api#String")
241+
.build()
242+
val struct1 = StructureShape.builder()
243+
.id("foo.bar#Struct1")
244+
.addMember(memberQuux)
245+
.build()
246+
val struct1AsMember = MemberShape.builder()
247+
.id("foo.bar#InputStruct\$foo")
248+
.target(struct1)
249+
.build()
250+
val input = StructureShape.builder()
251+
.id("foo.bar#InputStruct")
252+
.addMember(struct1AsMember)
253+
.build()
254+
val operation = OperationShape.builder()
255+
.id("foo.bar#TestOperation")
256+
.input(input)
257+
.build()
258+
val service = ServiceShape.builder()
259+
.id("foo.bar#QuuxService")
260+
.version("1.0")
261+
.addOperation(operation)
262+
.build()
263+
val model = Model.assembler()
264+
.addShapes(struct1, memberQuux, struct1AsMember, input, operation, service)
265+
.assemble()
266+
.unwrap()
267+
268+
val updatedModel = NestedShapeTransformer.transform(model, service)
269+
val provider: SymbolProvider = SwiftCodegenPlugin.createSymbolProvider(updatedModel, updatedModel.defaultSettings(service.id.toString(), sdkId = "Quux"))
270+
val updatedStruct = updatedModel.expectShape(struct1.id)
271+
val updatedStructSymbol = provider.toSymbol(updatedStruct)
272+
273+
assertEquals("QuuxClientTypes", updatedStructSymbol.namespace)
274+
}
275+
276+
@Test
277+
fun `it does not add namespace to error structure`() {
278+
val memberQuux = MemberShape.builder()
279+
.id("foo.bar#ErrorStruct\$quux")
280+
.target("smithy.api#String")
281+
.build()
282+
val struct1Error = StructureShape.builder()
283+
.id("foo.bar#ErrorStruct")
284+
.addMember(memberQuux)
285+
.addTrait(ErrorTrait("client"))
286+
.build()
287+
val struct1AsMember = MemberShape.builder()
288+
.id("foo.bar#InputStruct\$foo")
289+
.target(struct1Error)
290+
.build()
291+
val input = StructureShape.builder()
292+
.id("foo.bar#InputStruct")
293+
.addMember(struct1AsMember)
294+
.build()
295+
val operation = OperationShape.builder()
296+
.id("foo.bar#TestOperation")
297+
.input(input)
298+
.build()
299+
val service = ServiceShape.builder()
300+
.id("foo.bar#QuuxService")
301+
.version("1.0")
302+
.addOperation(operation)
303+
.build()
304+
val model = Model.assembler()
305+
.addShapes(struct1Error, memberQuux, struct1AsMember, input, operation, service)
306+
.assemble()
307+
.unwrap()
308+
309+
val updatedModel = NestedShapeTransformer.transform(model, service)
310+
val provider: SymbolProvider = SwiftCodegenPlugin.createSymbolProvider(updatedModel, updatedModel.defaultSettings(service.id.toString(), sdkId = "Quux"))
311+
val updatedStruct = updatedModel.expectShape(struct1Error.id)
312+
val updatedStructSymbol = provider.toSymbol(updatedStruct)
313+
314+
assertEquals("", updatedStructSymbol.namespace)
315+
}
231316
}

0 commit comments

Comments
 (0)