Skip to content

Commit 4cb4a8f

Browse files
authored
fix: disambiguate sdk types (#301)
1 parent 49426a6 commit 4cb4a8f

File tree

125 files changed

+2797
-2439
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

125 files changed

+2797
-2439
lines changed

Packages/ClientRuntime/Sources/Serialization/Decoder/JSONDecoder+Extensions.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import Foundation
77

8+
public typealias JSONDecoder = Foundation.JSONDecoder
89
extension JSONDecoder: ResponseDecoder {
910
public func decode<T>(responseBody: Data) throws -> T where T: Decodable {
1011
return try decode(T.self, from: responseBody)

Packages/ClientRuntime/Sources/Serialization/Encoder/JSONEncoder+Extensions.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@
55

66
import Foundation
77

8+
public typealias JSONEncoder = Foundation.JSONEncoder
89
extension JSONEncoder: RequestEncoder {}

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,70 @@ object ClientRuntimeTypes {
1717
object Http {
1818
val HttpClientEngine = runtimeSymbol("HttpClientEngine")
1919
val HttpClientConfiguration = runtimeSymbol("HttpClientConfiguration")
20+
val Headers = runtimeSymbol("Headers")
21+
val HttpStatusCode = runtimeSymbol("HttpStatusCode")
22+
val SdkHttpClient = runtimeSymbol("SdkHttpClient")
23+
val SdkHttpRequestBuilder = runtimeSymbol("SdkHttpRequestBuilder")
24+
val SdkHttpRequest = runtimeSymbol("SdkHttpRequest")
25+
val HttpBody = runtimeSymbol("HttpBody")
26+
val HttpResponse = runtimeSymbol("HttpResponse")
27+
val HttpResponseBinding = runtimeSymbol("HttpResponseBinding")
28+
val HttpServiceError = runtimeSymbol("HttpServiceError")
29+
val UnknownHttpServiceError = runtimeSymbol("UnknownHttpServiceError")
30+
val HttpContextBuilder = runtimeSymbol("HttpContextBuilder")
2031
}
2132

2233
object Serde {
2334
val RequestEncoder = runtimeSymbol("RequestEncoder")
2435
val ResponseDecoder = runtimeSymbol("ResponseDecoder")
36+
val Key = runtimeSymbol("Key")
37+
val TimestampWrapper = runtimeSymbol("TimestampWrapper")
38+
val DynamicNodeDecoding = runtimeSymbol("DynamicNodeDecoding")
39+
val DynamicNodeEncoding = runtimeSymbol("DynamicNodeEncoding")
40+
val NodeDecoding = runtimeSymbol("NodeDecoding")
41+
val NodeEncoding = runtimeSymbol("NodeEncoding")
42+
val TimestampWrapperDecoder = runtimeSymbol("TimestampWrapperDecoder")
43+
val MapEntry = runtimeSymbol("MapEntry")
44+
val CollectionMember = runtimeSymbol("CollectionMember")
45+
val MapKeyValue = runtimeSymbol("MapKeyValue")
46+
val FormURLEncoder = runtimeSymbol("FormURLEncoder")
47+
val JSONDecoder = runtimeSymbol("JSONDecoder")
48+
val JSONEncoder = runtimeSymbol("JSONEncoder")
49+
val XMLEncoder = runtimeSymbol("XMLEncoder")
50+
val XMLDecoder = runtimeSymbol("XMLDecoder")
51+
}
52+
53+
object Middleware {
54+
val OperationOutput = runtimeSymbol("OperationOutput")
55+
val Middleware = runtimeSymbol("Middleware")
2556
}
2657

2758
object Core {
59+
val ByteStream = runtimeSymbol("ByteStream")
60+
val Date = runtimeSymbol("Date")
61+
val Data = runtimeSymbol("Data")
62+
val Document = runtimeSymbol("Document")
63+
val URLQueryItem = runtimeSymbol("URLQueryItem")
64+
val ClientError = runtimeSymbol("ClientError")
65+
val SdkError = runtimeSymbol("SdkError")
66+
val ServiceError = runtimeSymbol("ServiceError")
67+
val SdkResult = runtimeSymbol("SdkResult")
2868
val Logger = runtimeSymbol("LogAgent")
69+
val SDKLogHandlerFactory = runtimeSymbol("SDKLogHandlerFactory")
70+
val SDKLogLevel = runtimeSymbol("SDKLogLevel")
2971
val ClientLogMode = runtimeSymbol("ClientLogMode")
3072
val IdempotencyTokenGenerator = runtimeSymbol("IdempotencyTokenGenerator")
3173
val Retrier = runtimeSymbol("Retrier")
74+
val ErrorType = runtimeSymbol("ErrorType")
75+
val SDKRuntimeConfiguration = runtimeSymbol("SDKRuntimeConfiguration")
76+
val DefaultSDKRuntimeConfiguration = runtimeSymbol("DefaultSDKRuntimeConfiguration")
77+
val DateFormatter = runtimeSymbol("DateFormatter")
78+
val Reflection: Symbol = runtimeSymbol("Reflection")
3279
}
3380
}
3481

3582
private fun runtimeSymbol(name: String): Symbol = buildSymbol {
3683
this.name = name
84+
this.namespace = SwiftDependency.CLIENT_RUNTIME.target
3785
dependency(SwiftDependency.CLIENT_RUNTIME)
3886
}

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

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ import software.amazon.smithy.model.traits.EnumTrait
2121
import software.amazon.smithy.swift.codegen.integration.CustomDebugStringConvertibleGenerator
2222
import software.amazon.smithy.swift.codegen.integration.ProtocolGenerator
2323
import software.amazon.smithy.swift.codegen.integration.SwiftIntegration
24+
import software.amazon.smithy.swift.codegen.model.AddOperationShapes
25+
import software.amazon.smithy.swift.codegen.model.HashableShapeTransformer
26+
import software.amazon.smithy.swift.codegen.model.NestedShapeTransformer
27+
import software.amazon.smithy.swift.codegen.model.RecursiveShapeBoxer
28+
import software.amazon.smithy.swift.codegen.model.hasTrait
2429
import java.util.ServiceLoader
2530
import java.util.logging.Logger
2631

@@ -48,11 +53,7 @@ class CodegenVisitor(context: PluginContext) : ShapeVisitor.Default<Void>() {
4853
for (integration in integrations) {
4954
resolvedModel = integration.preprocessModel(resolvedModel, settings)
5055
}
51-
// Add operation input/output shapes if not provided for future evolution of sdk
52-
resolvedModel = AddOperationShapes.execute(resolvedModel, settings.getService(resolvedModel), settings.moduleName)
53-
resolvedModel = RecursiveShapeBoxer.transform(resolvedModel)
54-
resolvedModel = HashableShapeTransformer.transform(resolvedModel)
55-
model = resolvedModel
56+
model = preprocessModel(resolvedModel)
5657

5758
service = settings.getService(model)
5859

@@ -66,6 +67,15 @@ class CodegenVisitor(context: PluginContext) : ShapeVisitor.Default<Void>() {
6667
protocolGenerator = resolveProtocolGenerator(integrations, model, service, settings)
6768
}
6869

70+
fun preprocessModel(model: Model): Model {
71+
var resolvedModel = model
72+
resolvedModel = AddOperationShapes.execute(resolvedModel, settings.getService(resolvedModel), settings.moduleName)
73+
resolvedModel = RecursiveShapeBoxer.transform(resolvedModel)
74+
resolvedModel = HashableShapeTransformer.transform(resolvedModel)
75+
resolvedModel = NestedShapeTransformer.transform(resolvedModel, settings.getService(resolvedModel))
76+
return resolvedModel
77+
}
78+
6979
private fun resolveProtocolGenerator(
7080
integrations: List<SwiftIntegration>,
7181
model: Model,
@@ -127,29 +137,30 @@ class CodegenVisitor(context: PluginContext) : ShapeVisitor.Default<Void>() {
127137
}
128138

129139
override fun structureShape(shape: StructureShape): Void? {
130-
writers.useShapeWriter(shape) { writer: SwiftWriter -> StructureGenerator(model, symbolProvider, writer, shape).render() }
140+
writers.useShapeWriter(shape) { writer: SwiftWriter -> StructureGenerator(model, symbolProvider, writer, shape, settings).render() }
131141
writers.useShapeExtensionWriter(shape, "CustomDebugStringConvertible") { writer: SwiftWriter ->
132142
CustomDebugStringConvertibleGenerator(symbolProvider, writer, shape).render()
133143
}
134144
return null
135145
}
136146

137147
override fun stringShape(shape: StringShape): Void? {
138-
if (shape.hasTrait(EnumTrait::class.java)) {
139-
writers.useShapeWriter(shape) { writer: SwiftWriter -> EnumGenerator(symbolProvider.toSymbol(shape), writer, shape).render() }
148+
if (shape.hasTrait<EnumTrait>()) {
149+
writers.useShapeWriter(shape) { writer: SwiftWriter -> EnumGenerator(model, symbolProvider, writer, shape, settings).render() }
140150
}
141151
return null
142152
}
143153

144154
override fun unionShape(shape: UnionShape): Void? {
145-
writers.useShapeWriter(shape) { writer: SwiftWriter -> UnionGenerator(model, symbolProvider, writer, shape).render() }
155+
writers.useShapeWriter(shape) { writer: SwiftWriter -> UnionGenerator(model, symbolProvider, writer, shape, settings).render() }
146156
return null
147157
}
148158

149159
override fun serviceShape(shape: ServiceShape): Void? {
150160
writers.useShapeWriter(shape) {
151161
writer: SwiftWriter ->
152162
ServiceGenerator(settings, model, symbolProvider, writer, writers, protocolGenerator).render()
163+
ServiceNamespaceGenerator(settings, model, symbolProvider, writer).render()
153164
}
154165
return null
155166
}

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

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,17 @@
55

66
package software.amazon.smithy.swift.codegen
77

8-
import software.amazon.smithy.codegen.core.Symbol
8+
import software.amazon.smithy.codegen.core.SymbolProvider
9+
import software.amazon.smithy.model.Model
10+
import software.amazon.smithy.model.shapes.ServiceShape
911
import software.amazon.smithy.model.shapes.StringShape
1012
import software.amazon.smithy.model.traits.EnumDefinition
1113
import software.amazon.smithy.model.traits.EnumTrait
1214
import software.amazon.smithy.swift.codegen.SwiftSettings.Companion.reservedKeywords
15+
import software.amazon.smithy.swift.codegen.customtraits.NestedTrait
16+
import software.amazon.smithy.swift.codegen.model.expectShape
17+
import software.amazon.smithy.swift.codegen.model.hasTrait
18+
import software.amazon.smithy.swift.codegen.model.nestedNamespaceType
1319
import software.amazon.smithy.utils.CaseUtils
1420

1521
/**
@@ -100,9 +106,11 @@ import software.amazon.smithy.utils.CaseUtils
100106
* ```
101107
*/
102108
class EnumGenerator(
103-
private val symbol: Symbol,
109+
private val model: Model,
110+
private val symbolProvider: SymbolProvider,
104111
private val writer: SwiftWriter,
105-
private val shape: StringShape
112+
private val shape: StringShape,
113+
private val settings: SwiftSettings
106114
) {
107115

108116
init {
@@ -113,20 +121,33 @@ class EnumGenerator(
113121
shape.getTrait(EnumTrait::class.java).get()
114122
}
115123

116-
var allCasesBuilder: MutableList<String> = mutableListOf<String>()
117-
var rawValuesBuilder: MutableList<String> = mutableListOf<String>()
124+
private var allCasesBuilder: MutableList<String> = mutableListOf()
125+
private var rawValuesBuilder: MutableList<String> = mutableListOf()
118126

119127
fun render() {
128+
val symbol = symbolProvider.toSymbol(shape)
120129
writer.putContext("enum.name", symbol.name)
130+
val isNestedType = shape.hasTrait<NestedTrait>()
131+
if (isNestedType) {
132+
val service = model.expectShape<ServiceShape>(settings.service)
133+
writer.openBlock("extension ${service.nestedNamespaceType(symbolProvider)} {", "}") {
134+
renderEnum()
135+
}
136+
} else {
137+
renderEnum()
138+
}
139+
writer.removeContext("enum.name")
140+
}
141+
142+
private fun renderEnum() {
121143
writer.writeShapeDocs(shape)
122144
writer.writeAvailableAttribute(null, shape)
123-
writer.openBlock("public enum \$enum.name:L {", "}\n") {
145+
writer.openBlock("public enum \$enum.name:L: \$N, \$N, \$N, \$N, \$N {", "}", SwiftTypes.Protocols.Equatable, SwiftTypes.Protocols.RawRepresentable, SwiftTypes.Protocols.CaseIterable, SwiftTypes.Protocols.Codable, SwiftTypes.Protocols.Hashable) {
124146
createEnumWriterContexts()
125147
// add the sdkUnknown case which will always be last
126-
writer.write("case sdkUnknown(String)")
127-
}
148+
writer.write("case sdkUnknown(\$N)", SwiftTypes.String)
128149

129-
writer.openBlock("extension \$enum.name:L : Equatable, RawRepresentable, Codable, CaseIterable, Hashable { ", "}") {
150+
writer.write("")
130151

131152
// Generate allCases static array
132153
generateAllCasesBlock()
@@ -140,7 +161,6 @@ class EnumGenerator(
140161
// Generate deserializer
141162
generateInitFromDecoderBlock()
142163
}
143-
writer.removeContext("enum.name")
144164
}
145165

146166
fun addEnumCaseToEnum(definition: EnumDefinition) {
@@ -178,23 +198,23 @@ class EnumGenerator(
178198
}
179199

180200
fun generateInitFromRawValueBlock() {
181-
writer.openBlock("public init?(rawValue: String) {", "}") {
201+
writer.openBlock("public init?(rawValue: \$N) {", "}", SwiftTypes.String) {
182202
writer.write("let value = Self.allCases.first(where: { \$\$0.rawValue == rawValue })")
183203
writer.write("self = value ?? Self.sdkUnknown(rawValue)")
184204
}
185205
}
186206

187207
fun generateRawValueEnumBlock() {
188208
rawValuesBuilder.add("case let .sdkUnknown(s): return s")
189-
writer.openBlock("public var rawValue: String {", "}") {
209+
writer.openBlock("public var rawValue: \$N {", "}", SwiftTypes.String) {
190210
writer.write("switch self {")
191211
writer.write(rawValuesBuilder.joinToString("\n"))
192212
writer.write("}")
193213
}
194214
}
195215

196216
fun generateInitFromDecoderBlock() {
197-
writer.openBlock("public init(from decoder: Decoder) throws {", "}") {
217+
writer.openBlock("public init(from decoder: \$N) throws {", "}", SwiftTypes.Decoder) {
198218
writer.write("let container = try decoder.singleValueContainer()")
199219
writer.write("let rawValue = try container.decode(RawValue.self)")
200220
writer.write("self = \$enum.name:L(rawValue: rawValue) ?? \$enum.name:L.sdkUnknown(rawValue)")

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class IdempotencyTokenMiddlewareGenerator(
3131
* */
3232
fun renderIdempotencyMiddleware() {
3333
// TODO: Need to write a unit test for this
34-
writer.openBlock("$operationMiddlewareStackName.initializeStep.intercept(position: .before, id: \"IdempotencyTokenMiddleware\") { (context, input, next) -> Result<OperationOutput<$outputShapeName>, SdkError<$outputErrorShapeName>> in", "}") {
34+
writer.openBlock("$operationMiddlewareStackName.initializeStep.intercept(position: .before, id: \"IdempotencyTokenMiddleware\") { (context, input, next) -> \$N<\$N<$outputShapeName>, \$N<$outputErrorShapeName>> in", "}", SwiftTypes.Result, ClientRuntimeTypes.Middleware.OperationOutput, ClientRuntimeTypes.Core.SdkError) {
3535
writer.write("let idempotencyTokenGenerator = context.getIdempotencyTokenGenerator()")
3636
writer.write("var copiedInput = input")
3737
writer.openBlock("if input.$idempotentMemberName == nil {", "}") {

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,17 @@ abstract class Middleware(private val writer: SwiftWriter, shapeSymbol: Symbol,
1414
open val contextType: Symbol = Symbol
1515
.builder()
1616
.name("HttpContext")
17+
.namespace(SwiftDependency.CLIENT_RUNTIME.target, ".")
1718
.addDependency(SwiftDependency.CLIENT_RUNTIME)
1819
.build()
1920

20-
open val typesToConformMiddlewareTo: List<String> = mutableListOf("Middleware")
21+
open val typesToConformMiddlewareTo: List<Symbol> = mutableListOf(ClientRuntimeTypes.Middleware.Middleware)
2122

2223
open val properties: MutableMap<String, Symbol> = mutableMapOf()
2324

2425
fun getTypeInheritance(): String {
2526
val separator = if (typesToConformMiddlewareTo.count() == 1) "" else ", "
26-
return typesToConformMiddlewareTo.joinToString(separator)
27+
return typesToConformMiddlewareTo.joinToString(separator) { it.toString() }
2728
}
2829

2930
abstract fun generateInit()

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class MiddlewareGenerator(
2828
fun generate() {
2929

3030
writer.openBlock("public struct ${middleware.typeName}: ${middleware.getTypeInheritance()} {", "}") {
31-
writer.write("public let id: String = \"${middleware.typeName}\"")
31+
writer.write("public let id: \$N = \"${middleware.typeName}\"", SwiftTypes.String)
3232
writer.write("")
3333
middleware.properties.forEach {
3434
val memberName = it.key
@@ -40,8 +40,8 @@ class MiddlewareGenerator(
4040
writer.write("")
4141
writer.write("public func handle<H>(context: Context,")
4242
writer.swiftFunctionParameterIndent {
43-
writer.write(" input: ${middleware.inputType.name},")
44-
writer.write(" next: H) -> Swift.Result<${middleware.outputType.name}, MError>")
43+
writer.write(" input: \$N,", middleware.inputType)
44+
writer.write(" next: H) -> \$N<\$L, MError>", SwiftTypes.Result, middleware.outputType)
4545
}
4646
writer.write("where H: Handler,")
4747
writer.write("Self.MInput == H.Input,")
@@ -52,10 +52,10 @@ class MiddlewareGenerator(
5252
middleware.renderReturn()
5353
}
5454
writer.write("")
55-
writer.write("public typealias MInput = ${middleware.inputType.name}")
56-
writer.write("public typealias MOutput = ${middleware.outputType.name}")
57-
writer.write("public typealias Context = ClientRuntime.${middleware.contextType.name}")
58-
writer.write("public typealias MError = ${middleware.errorType.name}")
55+
writer.write("public typealias MInput = \$N", middleware.inputType)
56+
writer.write("public typealias MOutput = \$L", middleware.outputType)
57+
writer.write("public typealias Context = \$N", middleware.contextType)
58+
writer.write("public typealias MError = \$L", middleware.errorType)
5959
}
6060
}
6161
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ abstract class OperationStep(outputType: Symbol, outputErrorType: Symbol) {
66
abstract val inputType: Symbol
77
val outputType: Symbol = Symbol
88
.builder()
9-
.name("OperationOutput<$outputType>")
9+
.name("${ClientRuntimeTypes.Middleware.OperationOutput}<$outputType>")
1010
.addDependency(SwiftDependency.CLIENT_RUNTIME)
1111
.build()
1212

1313
val errorType: Symbol = Symbol
1414
.builder()
15-
.name("SdkError<$outputErrorType>")
15+
.name("${ClientRuntimeTypes.Core.SdkError}<$outputErrorType>")
1616
.addDependency(SwiftDependency.CLIENT_RUNTIME)
1717
.build()
1818
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ class ServiceGenerator(
9494
val outputShapeName = symbolProvider.toSymbol(outputShape).name
9595
val errorTypeName = getOperationErrorShapeName(op)
9696

97-
return "SdkResult<$outputShapeName, $errorTypeName>"
97+
return "${ClientRuntimeTypes.Core.SdkResult}<$outputShapeName, $errorTypeName>"
9898
}
9999

100100
fun getOperationInputShapeName(symbolProvider: SymbolProvider, opIndex: OperationIndex, op: OperationShape): String {
@@ -183,7 +183,7 @@ class ServiceGenerator(
183183

184184
delegator.useShapeWriter(operationErrorSymbol) { writer ->
185185
writer.addImport(unknownServiceErrorSymbol)
186-
writer.openBlock("public enum $operationErrorName: Swift.Error, Equatable {", "}") {
186+
writer.openBlock("public enum $operationErrorName: \$N, \$N {", "}", SwiftTypes.Error, SwiftTypes.Protocols.Equatable) {
187187
for (errorShape in errorShapes) {
188188
val errorShapeName = symbolProvider.toSymbol(errorShape).name
189189
writer.write("case \$L(\$L)", errorShapeName.decapitalize(), errorShapeName)

0 commit comments

Comments
 (0)