Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@
import software.amazon.smithy.model.SourceLocation;
import software.amazon.smithy.model.node.ArrayNode;
import software.amazon.smithy.model.node.Node;
import software.amazon.smithy.model.node.NumberNode;
import software.amazon.smithy.model.node.ObjectNode;
import software.amazon.smithy.model.node.StringNode;
import software.amazon.smithy.model.shapes.ShapeId;
import software.amazon.smithy.model.traits.Trait;
import software.amazon.smithy.model.traits.TraitFactory;
Expand All @@ -71,6 +73,7 @@
public class CreatesTraitTest {
private static final ShapeId DUMMY_ID = ShapeId.from("ns.foo#foo");
private final TraitFactory provider = TraitFactory.createServiceFactory();
private static final SourceLocation testLocation = new SourceLocation("test.smithy", 1, 2);

static Stream<Arguments> createTraitTests() {
return Stream.of(
Expand Down Expand Up @@ -236,4 +239,54 @@ void createsTraitFromNode(ShapeId traitId, Node fromNode) {
assertEquals(SourceLocation.NONE, trait.getSourceLocation());
assertEquals(trait, provider.createTrait(traitId, DUMMY_ID, trait.toNode()).orElseThrow(RuntimeException::new));
}

static Stream<Arguments> createSourceLocationTests() {
return Stream.of(
Arguments.of(BigDecimalTrait.ID, new NumberNode(1, testLocation)),
Arguments.of(BigIntegerTrait.ID, new NumberNode(1, testLocation)),
Arguments.of(ByteTrait.ID, new NumberNode(1, testLocation)),
Arguments.of(DoubleTrait.ID, new NumberNode(1.2, testLocation)),
Arguments.of(FloatTrait.ID, new NumberNode(1.2, testLocation)),
Arguments.of(IntegerTrait.ID, new NumberNode(1, testLocation)),
Arguments.of(LongTrait.ID, new NumberNode(1L, testLocation)),
Arguments.of(ShortTrait.ID, new NumberNode(1, testLocation)),
Arguments.of(StringTrait.ID, new StringNode("a", testLocation)),
Arguments.of(TimestampTrait.ID, new StringNode("1985-04-12T23:20:50.52Z", testLocation)),
Arguments.of(NumberListTrait.ID,
ArrayNode.builder()
.withValue(Node.from(1))
.withValue(Node.from(2))
.withValue(Node.from(3))
.sourceLocation(testLocation)
.build()
.toNode()),
Arguments.of(NumberSetTrait.ID,
ArrayNode.builder()
.withValue(Node.from(1))
.withValue(Node.from(2))
.withValue(Node.from(3))
.sourceLocation(testLocation)
.build()
.toNode()),
Arguments.of(NestedMapTrait.ID,
NestedMapTrait.builder()
.putValues("1", MapUtils.of("1", MapUtils.of("2", "3")))
.sourceLocation(testLocation)
.build()
.toNode()),
Arguments.of(StructWithListOfMapTrait.ID,
StructWithListOfMapTrait.builder()
.addItems(MapUtils.of("1", "2"))
.addItems(MapUtils.of("3", "4"))
.sourceLocation(testLocation)
.build()
.toNode()));
}

@ParameterizedTest
@MethodSource("createSourceLocationTests")
void sourceLocationTest(ShapeId traitId, Node fromNode) {
Trait trait = provider.createTrait(traitId, DUMMY_ID, fromNode).orElseThrow(RuntimeException::new);
assertEquals(testLocation, trait.getSourceLocation());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import software.amazon.smithy.model.shapes.UnionShape;
import software.amazon.smithy.model.traits.IdRefTrait;
import software.amazon.smithy.model.traits.TimestampFormatTrait;
import software.amazon.smithy.model.traits.TraitDefinition;
import software.amazon.smithy.model.traits.UniqueItemsTrait;
import software.amazon.smithy.traitcodegen.SymbolProperties;
import software.amazon.smithy.traitcodegen.TraitCodegenUtils;
Expand Down Expand Up @@ -83,7 +84,8 @@ public Void listShape(ListShape shape) {
symbol,
Node.class,
() -> {
writer.writeWithNoFormatting("Builder builder = builder();");
writer.writeWithNoFormatting("Builder builder = builder()" +
(shape.hasTrait(TraitDefinition.ID) ? ".sourceLocation(node);" : ";"));
shape.accept(new FromNodeMapperVisitor(writer, model, "node", symbolProvider));
writer.write("builder.values(value0);");
writer.writeWithNoFormatting("return builder.build();");
Expand All @@ -101,7 +103,8 @@ public Void mapShape(MapShape shape) {
symbol,
Node.class,
() -> {
writer.writeWithNoFormatting("Builder builder = builder();");
writer.writeWithNoFormatting("Builder builder = builder()" +
(shape.hasTrait(TraitDefinition.ID) ? ".sourceLocation(node);" : ";"));
shape.accept(new FromNodeMapperVisitor(writer, model, "node", symbolProvider));
writer.writeWithNoFormatting("return builder.build();");
});
Expand Down Expand Up @@ -159,7 +162,8 @@ public Void structureShape(StructureShape shape) {
writeFromNodeJavaDoc();
writer.write("public static $T fromNode($T node) {", symbol, Node.class);
writer.indent();
writer.write("Builder builder = builder();");
writer.write("Builder builder = builder()" +
(shape.hasTrait(TraitDefinition.ID) ? ".sourceLocation(node);" : ";"));
// If the shape has no members (i.e. is an annotation trait) then there will be no member setters, and we
// need to terminate the line.
writer.putContext("isEmpty", shape.members().isEmpty());
Expand Down
Loading