Skip to content

Commit 6cff241

Browse files
authored
refactor(codegen): disambiguate sdk types (#162)
1 parent a4068b4 commit 6cff241

File tree

3 files changed

+52
-40
lines changed

3 files changed

+52
-40
lines changed

codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/AwsRuntimeTypes.kt

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package aws.sdk.kotlin.codegen
77

8+
import software.amazon.smithy.codegen.core.Symbol
9+
import software.amazon.smithy.kotlin.codegen.core.KotlinDependency
810
import software.amazon.smithy.kotlin.codegen.model.buildSymbol
911
import software.amazon.smithy.kotlin.codegen.model.namespace
1012

@@ -16,31 +18,30 @@ import software.amazon.smithy.kotlin.codegen.model.namespace
1618
*/
1719
object AwsRuntimeTypes {
1820
object Core {
19-
val AwsClientOption = buildSymbol {
20-
name = "AwsClientOption"
21-
namespace(AwsKotlinDependency.AWS_CLIENT_RT_CORE, subpackage = "client")
22-
}
21+
val AwsClientOption = runtimeSymbol("AwsClientOption", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "client")
22+
val AuthAttributes = runtimeSymbol("AuthAttributes", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "execution")
23+
val AwsErrorMetadata = runtimeSymbol("AwsErrorMetadata", AwsKotlinDependency.AWS_CLIENT_RT_CORE)
2324

24-
val AuthAttributes = buildSymbol {
25-
name = "AuthAttributes"
26-
namespace(AwsKotlinDependency.AWS_CLIENT_RT_CORE, subpackage = "execution")
27-
}
25+
object Endpoint {
26+
val EndpointResolver = runtimeSymbol("EndpointResolver", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint")
27+
val Endpoint = runtimeSymbol("Endpoint", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint")
2828

29-
val AwsErrorMetadata = buildSymbol {
30-
name = "AwsErrorMetadata"
31-
namespace(AwsKotlinDependency.AWS_CLIENT_RT_CORE)
29+
object Internal {
30+
val CredentialScope = runtimeSymbol("CredentialScope", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint.internal")
31+
val EndpointDefinition = runtimeSymbol("EndpointDefinition", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint.internal")
32+
val Partition = runtimeSymbol("Partition", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint.internal")
33+
val resolveEndpoint = runtimeSymbol("resolveEndpoint", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint.internal")
34+
}
3235
}
3336
}
3437

3538
object Auth {
36-
val AwsSigV4SigningMiddleware = buildSymbol {
37-
name = "AwsSigV4SigningMiddleware"
38-
namespace(AwsKotlinDependency.AWS_CLIENT_RT_AUTH)
39-
}
40-
41-
val AwsSignedBodyHeaderType = buildSymbol {
42-
name = "AwsSignedBodyHeaderType"
43-
namespace(AwsKotlinDependency.AWS_CLIENT_RT_AUTH)
44-
}
39+
val AwsSigV4SigningMiddleware = runtimeSymbol("AwsSigV4SigningMiddleware", AwsKotlinDependency.AWS_CLIENT_RT_AUTH)
40+
val AwsSignedBodyHeaderType = runtimeSymbol("AwsSignedBodyHeaderType", AwsKotlinDependency.AWS_CLIENT_RT_AUTH)
4541
}
4642
}
43+
44+
private fun runtimeSymbol(name: String, dependency: KotlinDependency, subpackage: String = ""): Symbol = buildSymbol {
45+
this.name = name
46+
namespace(dependency, subpackage)
47+
}

codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/AwsQuery.kt

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import software.amazon.smithy.aws.traits.protocols.AwsQueryTrait
1313
import software.amazon.smithy.kotlin.codegen.core.KotlinWriter
1414
import software.amazon.smithy.kotlin.codegen.core.RenderingContext
1515
import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
16+
import software.amazon.smithy.kotlin.codegen.core.addImport
1617
import software.amazon.smithy.kotlin.codegen.model.expectShape
1718
import software.amazon.smithy.kotlin.codegen.model.hasTrait
1819
import software.amazon.smithy.kotlin.codegen.model.traits.OperationOutput
@@ -153,17 +154,28 @@ class AwsQuery : AwsHttpBindingProtocolGenerator() {
153154
// we need to unwrap the response document to get the deserializer into the correct state
154155
// see: https://awslabs.github.io/smithy/1.0/spec/aws/aws-query-protocol.html#response-serialization
155156

156-
writer.write("")
157-
.write("val resultDescriptor = SdkFieldDescriptor(SerialKind.Struct, XmlSerialName(#S))", "${operationName}Result")
158-
.openBlock("val wrapperDescriptor = SdkObjectDescriptor.build {", "}") {
159-
writer.write("trait(XmlSerialName(#S))", "${operationName}Response")
160-
writer.write("field(resultDescriptor)")
157+
writer
158+
.addImport(
159+
RuntimeTypes.Serde.SdkFieldDescriptor,
160+
RuntimeTypes.Serde.SerdeXml.XmlSerialName,
161+
RuntimeTypes.Serde.SdkObjectDescriptor,
162+
RuntimeTypes.Serde.deserializeStruct
163+
)
164+
.write("")
165+
.write("val resultDescriptor = #T(SerialKind.Struct, #T(#S))", RuntimeTypes.Serde.SdkFieldDescriptor, RuntimeTypes.Serde.SerdeXml.XmlSerialName, "${operationName}Result")
166+
.openBlock("val wrapperDescriptor = #T.build {", "}", RuntimeTypes.Serde.SdkObjectDescriptor) {
167+
writer
168+
.addImport(RuntimeTypes.Serde.field)
169+
.write("trait(#T(#S))", RuntimeTypes.Serde.SerdeXml.XmlSerialName, "${operationName}Response")
170+
.write("#T(resultDescriptor)", RuntimeTypes.Serde.field)
161171
}
162172
.write("")
163173
// abandon the iterator, this only occurs at the top level operational output
164-
.write("val wrapper = deserializer.deserializeStruct(wrapperDescriptor)")
174+
.write("val wrapper = deserializer.#T(wrapperDescriptor)", RuntimeTypes.Serde.deserializeStruct)
165175
.openBlock("if (wrapper.findNextFieldIndex() != resultDescriptor.index) {", "}") {
166-
writer.write("throw DeserializationException(#S)", "failed to unwrap $operationName response")
176+
writer
177+
.addImport(RuntimeTypes.Serde.DeserializationException)
178+
.write("throw #T(#S)", RuntimeTypes.Serde.DeserializationException, "failed to unwrap $operationName response")
167179
}
168180
writer.write("")
169181
}

codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/core/EndpointResolverGenerator.kt

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@
66
package aws.sdk.kotlin.codegen.protocols.core
77

88
import aws.sdk.kotlin.codegen.AwsKotlinDependency
9+
import aws.sdk.kotlin.codegen.AwsRuntimeTypes
910
import aws.sdk.kotlin.codegen.endpointPrefix
1011
import software.amazon.smithy.kotlin.codegen.core.*
11-
import software.amazon.smithy.kotlin.codegen.model.buildSymbol
12-
import software.amazon.smithy.kotlin.codegen.model.namespace
1312
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
1413
import software.amazon.smithy.kotlin.codegen.utils.getOrNull
1514
import software.amazon.smithy.model.node.Node
@@ -22,6 +21,13 @@ import java.util.*
2221
* @param endpointData Parsed endpoints.json [ObjectNode]
2322
*/
2423
class EndpointResolverGenerator(private val endpointData: ObjectNode) {
24+
// Symbols which should be imported
25+
private val endpointResolverSymbols = setOf(
26+
AwsRuntimeTypes.Core.Endpoint.Internal.CredentialScope,
27+
AwsRuntimeTypes.Core.Endpoint.Internal.EndpointDefinition,
28+
AwsRuntimeTypes.Core.Endpoint.Internal.Partition,
29+
AwsRuntimeTypes.Core.Endpoint.Internal.resolveEndpoint
30+
)
2531

2632
fun render(ctx: ProtocolGenerator.GenerationContext) {
2733
ctx.delegator.useFileWriter("DefaultEndpointResolver.kt", "${ctx.settings.pkg.name}.internal") {
@@ -31,16 +37,9 @@ class EndpointResolverGenerator(private val endpointData: ObjectNode) {
3137
}
3238

3339
private fun renderResolver(writer: KotlinWriter) {
34-
val endpointResolverSymbol = buildSymbol {
35-
name = "EndpointResolver"
36-
namespace(AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint")
37-
}
38-
writer.addImport(endpointResolverSymbol)
39-
val endpointSymbol = buildSymbol {
40-
name = "Endpoint"
41-
namespace(AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint")
42-
}
43-
writer.addImport(endpointSymbol)
40+
writer.addImport(AwsRuntimeTypes.Core.Endpoint.EndpointResolver)
41+
writer.addImport(AwsRuntimeTypes.Core.Endpoint.Endpoint)
42+
writer.addImport(AwsRuntimeTypes.Core.Endpoint.Internal.resolveEndpoint)
4443
writer.addImport("ClientException", AwsKotlinDependency.AWS_CLIENT_RT_CORE)
4544

4645
writer.openBlock("internal class DefaultEndpointResolver : EndpointResolver {", "}") {
@@ -68,7 +67,7 @@ class EndpointResolverGenerator(private val endpointData: ObjectNode) {
6867
PartitionNode(ctx.service.endpointPrefix, it)
6968
}.sortedWith(comparePartitions)
7069

71-
writer.addImport("${AwsKotlinDependency.AWS_CLIENT_RT_CORE.namespace}.endpoint.internal", "*")
70+
writer.addImport(endpointResolverSymbols)
7271
writer.write("")
7372
writer.openBlock("private val servicePartitions = listOf(", ")") {
7473
partitions.forEach { renderPartition(writer, it) }

0 commit comments

Comments
 (0)