Skip to content

Commit 8c990fa

Browse files
authored
fix: add explicitReceiver parameter to ShapeValueGenerator (#1301)
1 parent fff09ff commit 8c990fa

File tree

7 files changed

+66
-27
lines changed

7 files changed

+66
-27
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"id": "bdcf7bc9-094c-4434-aa34-1df7f4f4c936",
3+
"type": "bugfix",
4+
"description": "Explicitly qualify shape member names in smoke tests and protocol tests"
5+
}

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/ShapeValueGenerator.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@ import kotlin.math.round
1919

2020
/**
2121
* Generates a shape type declaration based on the parameters provided.
22+
* @param model the model which contains the shape being generated
23+
* @param symbolProvider the symbol provider for the model
24+
* @param explicitReceiver Whether shape members should be fully qualified, prefixed with `this.`
2225
*/
2326
class ShapeValueGenerator(
2427
internal val model: Model,
2528
internal val symbolProvider: SymbolProvider,
29+
internal val explicitReceiver: Boolean = false,
2630
) {
2731

2832
/**
@@ -61,7 +65,7 @@ class ShapeValueGenerator(
6165
}
6266

6367
private fun writeShapeValuesInline(writer: KotlinWriter, shape: Shape, params: Node) {
64-
val nodeVisitor = ShapeValueNodeVisitor(writer, this, shape)
68+
val nodeVisitor = ShapeValueNodeVisitor(writer, this, shape, explicitReceiver)
6569
when (shape.type) {
6670
ShapeType.STRUCTURE -> params.accept(nodeVisitor)
6771
ShapeType.MAP -> mapDeclaration(writer, shape.asMapShape().get()) {
@@ -158,6 +162,7 @@ class ShapeValueGenerator(
158162
val writer: KotlinWriter,
159163
val generator: ShapeValueGenerator,
160164
val currShape: Shape,
165+
val explicitReceiver: Boolean = false,
161166
) : NodeVisitor<Unit> {
162167

163168
override fun objectNode(node: ObjectNode) {
@@ -178,7 +183,10 @@ class ShapeValueGenerator(
178183
}
179184
memberShape = generator.model.expectShape(member.target)
180185
val memberName = generator.symbolProvider.toMemberName(member)
181-
writer.writeInline("#L = ", memberName)
186+
val memberPrefix = if (explicitReceiver) "this." else ""
187+
188+
writer.writeInline("#L#L = ", memberPrefix, memberName)
189+
182190
generator.instantiateShapeInline(writer, memberShape, valueNode)
183191
if (i < node.members.size - 1) {
184192
writer.ensureNewline()

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/protocol/HttpProtocolUnitTestRequestGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ open class HttpProtocolUnitTestRequestGenerator protected constructor(builder: B
189189
writer.writeInline("\nval input = ")
190190
.indent()
191191
.call {
192-
ShapeValueGenerator(model, symbolProvider).instantiateShapeInline(writer, inputShape, test.params)
192+
ShapeValueGenerator(model, symbolProvider, explicitReceiver = true).instantiateShapeInline(writer, inputShape, test.params)
193193
}
194194
.dedent()
195195
.write("")

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/protocol/HttpProtocolUnitTestResponseGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ open class HttpProtocolUnitTestResponseGenerator protected constructor(builder:
8080
.call {
8181
outputShape?.let {
8282
writer.writeInline("\nresponse = ")
83-
ShapeValueGenerator(model, symbolProvider).instantiateShapeInline(writer, it, test.params)
83+
ShapeValueGenerator(model, symbolProvider, explicitReceiver = true).instantiateShapeInline(writer, it, test.params)
8484
}
8585
}
8686
.write("")

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/smoketests/SmokeTestsRunnerGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ class SmokeTestsRunnerGenerator(
211211
} else {
212212
writer.withBlock("(", ")") {
213213
val inputShape = model.expectShape(operation.input.get())
214-
ShapeValueGenerator(model, symbolProvider).instantiateShapeInline(writer, inputShape, inputParams)
214+
ShapeValueGenerator(model, symbolProvider, explicitReceiver = true).instantiateShapeInline(writer, inputShape, inputParams)
215215
}
216216
}
217217
}

codegen/smithy-kotlin-codegen/src/test/kotlin/software/amazon/smithy/kotlin/codegen/rendering/ShapeValueGeneratorTest.kt

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,49 @@ listOf<List<String>>(
172172

173173
@Test
174174
fun `it renders structs`() {
175+
val contents = renderTestStruct()
176+
177+
val expected = """
178+
MyStruct {
179+
stringMember = "v1"
180+
boolMember = true
181+
intMember = 1
182+
structMember = Nested {
183+
tsMember = Instant.fromEpochSeconds(11223344, 0)
184+
}
185+
enumMember = MyEnum.fromValue("fooey")
186+
floatMember = 2.toFloat()
187+
doubleMember = 3.0.toDouble()
188+
nullMember = null
189+
}
190+
""".trimIndent()
191+
192+
contents.shouldContainOnlyOnceWithDiff(expected)
193+
}
194+
195+
@Test
196+
fun `it renders structs with an explicit receiver`() {
197+
val contents = renderTestStruct(explicitReceiver = true)
198+
199+
val expected = """
200+
MyStruct {
201+
this.stringMember = "v1"
202+
this.boolMember = true
203+
this.intMember = 1
204+
this.structMember = Nested {
205+
this.tsMember = Instant.fromEpochSeconds(11223344, 0)
206+
}
207+
this.enumMember = MyEnum.fromValue("fooey")
208+
this.floatMember = 2.toFloat()
209+
this.doubleMember = 3.0.toDouble()
210+
this.nullMember = null
211+
}
212+
""".trimIndent()
213+
214+
contents.shouldContainOnlyOnceWithDiff(expected)
215+
}
216+
217+
fun renderTestStruct(explicitReceiver: Boolean = false): String {
175218
val model = """
176219
structure MyStruct {
177220
stringMember: String,
@@ -218,25 +261,8 @@ listOf<List<String>>(
218261
.withMember("nullMember", Node.nullNode())
219262
.build()
220263

221-
ShapeValueGenerator(model, provider).instantiateShapeInline(writer, structShape, params)
222-
val contents = writer.toString()
223-
224-
val expected = """
225-
MyStruct {
226-
stringMember = "v1"
227-
boolMember = true
228-
intMember = 1
229-
structMember = Nested {
230-
tsMember = Instant.fromEpochSeconds(11223344, 0)
231-
}
232-
enumMember = MyEnum.fromValue("fooey")
233-
floatMember = 2.toFloat()
234-
doubleMember = 3.0.toDouble()
235-
nullMember = null
236-
}
237-
""".trimIndent()
238-
239-
contents.shouldContainOnlyOnceWithDiff(expected)
264+
ShapeValueGenerator(model, provider, explicitReceiver).instantiateShapeInline(writer, structShape, params)
265+
return writer.toString()
240266
}
241267

242268
@Test

codegen/smithy-kotlin-codegen/src/test/kotlin/software/amazon/smithy/kotlin/codegen/rendering/smoketests/SmokeTestsRunnerGeneratorTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ class SmokeTestsRunnerGeneratorTest {
136136
}.use { client ->
137137
client.testOperation(
138138
TestOperationRequest {
139-
bar = "2"
139+
this.bar = "2"
140140
}
141141
)
142142
}
@@ -174,7 +174,7 @@ class SmokeTestsRunnerGeneratorTest {
174174
}.use { client ->
175175
client.testOperation(
176176
TestOperationRequest {
177-
bar = "föö"
177+
this.bar = "föö"
178178
}
179179
)
180180
}
@@ -213,7 +213,7 @@ class SmokeTestsRunnerGeneratorTest {
213213
}.use { client ->
214214
client.testOperation(
215215
TestOperationRequest {
216-
bar = "föö"
216+
this.bar = "föö"
217217
}
218218
)
219219
}

0 commit comments

Comments
 (0)