Skip to content

Commit 965955b

Browse files
committed
Fix trait codegen for structure's string member with @idref
1 parent f837f4b commit 965955b

8 files changed

Lines changed: 56 additions & 1 deletion

File tree

smithy-trait-codegen/src/it/java/software/amazon/smithy/traitcodegen/test/CreatesTraitTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import com.example.traits.structures.BasicAnnotationTrait;
4242
import com.example.traits.structures.NestedA;
4343
import com.example.traits.structures.NestedB;
44+
import com.example.traits.structures.StructWithIdrefMemberTrait;
4445
import com.example.traits.structures.StructWithListOfMapTrait;
4546
import com.example.traits.structures.StructWithUniqueItemsListTrait;
4647
import com.example.traits.structures.StructureTrait;
@@ -200,6 +201,12 @@ static Stream<Arguments> createTraitTests() {
200201
.addItems(SetUtils.of("a", "b", "c"))
201202
.build()
202203
.toNode()),
204+
Arguments.of(StructWithIdrefMemberTrait.ID,
205+
StructWithIdrefMemberTrait.builder()
206+
.idRefMemberA(ShapeId.from("test.smithy.traitcodegen#a"))
207+
.idRefMemberB(ShapeId.from("test.smithy.traitcodegen#b"))
208+
.build()
209+
.toNode()),
203210
// Timestamps
204211
Arguments.of(TimestampTrait.ID, Node.from("1985-04-12T23:20:50.52Z")),
205212
Arguments.of(DateTimeTimestampTrait.ID, Node.from("1985-04-12T23:20:50.52Z")),

smithy-trait-codegen/src/it/java/software/amazon/smithy/traitcodegen/test/LoadsFromModelTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import com.example.traits.structures.BasicAnnotationTrait;
4949
import com.example.traits.structures.NestedA;
5050
import com.example.traits.structures.NestedB;
51+
import com.example.traits.structures.StructWithIdrefMemberTrait;
5152
import com.example.traits.structures.StructWithListOfMapTrait;
5253
import com.example.traits.structures.StructWithUniqueItemsListTrait;
5354
import com.example.traits.structures.StructureTrait;
@@ -324,6 +325,13 @@ static Stream<Arguments> loadsModelTests() {
324325
Optional.of("a"),
325326
"getItems",
326327
Optional.of(SetUtils.of(SetUtils.of("b", "c"), SetUtils.of("d", "e"))))),
328+
Arguments.of("structures/struct-with-idref-member-trait.smithy",
329+
StructWithIdrefMemberTrait.class,
330+
MapUtils.of(
331+
"getIdRefMemberA",
332+
Optional.of(ShapeId.from("test.smithy.traitcodegen#a")),
333+
"getIdRefMemberB",
334+
Optional.of(ShapeId.from("test.smithy.traitcodegen#b")))),
327335
// Timestamps
328336
Arguments.of("timestamps/struct-with-nested-timestamps.smithy",
329337
StructWithNestedTimestampsTrait.class,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
$version: "2.0"
2+
3+
namespace test.smithy.traitcodegen
4+
5+
use test.smithy.traitcodegen.structures#StructWithIdrefMember
6+
7+
@StructWithIdrefMember(idRefMemberA: "test.smithy.traitcodegen#a", idRefMemberB: "test.smithy.traitcodegen#b")
8+
structure myStruct {}
9+
10+
structure a {}
11+
12+
structure b {}

smithy-trait-codegen/src/main/java/software/amazon/smithy/traitcodegen/generators/BuilderGenerator.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import software.amazon.smithy.model.shapes.UnionShape;
3838
import software.amazon.smithy.model.traits.AbstractTraitBuilder;
3939
import software.amazon.smithy.model.traits.DefaultTrait;
40+
import software.amazon.smithy.model.traits.IdRefTrait;
4041
import software.amazon.smithy.model.traits.StringListTrait;
4142
import software.amazon.smithy.model.traits.TimestampFormatTrait;
4243
import software.amazon.smithy.model.traits.TraitDefinition;
@@ -371,6 +372,10 @@ public Void mapShape(MapShape shape) {
371372

372373
@Override
373374
public Void memberShape(MemberShape shape) {
375+
if (shape.hasTrait(IdRefTrait.ID)) {
376+
this.getDefault(shape);
377+
return null;
378+
}
374379
return model.expectShape(shape.getTarget()).accept(this);
375380
}
376381
}

smithy-trait-codegen/src/main/java/software/amazon/smithy/traitcodegen/generators/FromNodeGenerator.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import software.amazon.smithy.model.shapes.StructureShape;
3636
import software.amazon.smithy.model.shapes.TimestampShape;
3737
import software.amazon.smithy.model.shapes.UnionShape;
38+
import software.amazon.smithy.model.traits.IdRefTrait;
3839
import software.amazon.smithy.model.traits.TimestampFormatTrait;
3940
import software.amazon.smithy.model.traits.UniqueItemsTrait;
4041
import software.amazon.smithy.traitcodegen.SymbolProperties;
@@ -242,6 +243,14 @@ private MemberGenerator(MemberShape member) {
242243

243244
@Override
244245
public Void memberShape(MemberShape shape) {
246+
if (shape.hasTrait(IdRefTrait.ID)) {
247+
writer.writeInline(memberPrefix + "Member($1S, n -> $3C, builder::$2L)",
248+
fieldName,
249+
memberName,
250+
(Runnable) () -> shape
251+
.accept(new FromNodeMapperVisitor(writer, model, "n", 1, symbolProvider)));
252+
return null;
253+
}
245254
return model.expectShape(shape.getTarget()).accept(this);
246255
}
247256

smithy-trait-codegen/src/test/java/software/amazon/smithy/traitcodegen/TraitCodegenPluginTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import software.amazon.smithy.model.node.ObjectNode;
2727

2828
public class TraitCodegenPluginTest {
29-
private static final int EXPECTED_NUMBER_OF_FILES = 67;
29+
private static final int EXPECTED_NUMBER_OF_FILES = 68;
3030

3131
private MockManifest manifest;
3232
private Model model;

smithy-trait-codegen/src/test/resources/META-INF/smithy/manifest

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ structures/annotation-trait.smithy
4242
structures/structure-trait.smithy
4343
structures/struct-with-listofmap-trait.smithy
4444
structures/struct-with-uniqueitems-list-trait.smithy
45+
structures/struct-with-idref-member-trait.smithy
4546
timestamps/date-time-format-timestamp-trait.smithy
4647
timestamps/epoch-seconds-format-timestamp-trait.smithy
4748
timestamps/http-date-format-timestamp-trait.smithy
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
$version: "2.0"
2+
3+
namespace test.smithy.traitcodegen.structures
4+
5+
@trait
6+
structure StructWithIdrefMember {
7+
@idRef(selector: "structure")
8+
idRefMemberA: String
9+
idRefMemberB: IdRefMemberB
10+
}
11+
12+
@idRef(selector: "structure")
13+
string IdRefMemberB

0 commit comments

Comments
 (0)