diff --git a/docs/source-2.0/spec/idl.rst b/docs/source-2.0/spec/idl.rst index 9f00671244d..f842bff08bf 100644 --- a/docs/source-2.0/spec/idl.rst +++ b/docs/source-2.0/spec/idl.rst @@ -177,10 +177,8 @@ string support defined in :rfc:`7405`. ShapeStatement :`TraitStatements` `ShapeBody` ShapeBody :`SimpleShapeStatement` :/ `EnumStatement` - :/ `ListStatement` - :/ `MapStatement` + :/ `AggregateShapeStatement` :/ `StructureStatement` - :/ `UnionStatement` :/ `ServiceStatement` :/ `OperationStatement` :/ `ResourceStatement` @@ -193,30 +191,16 @@ string support defined in :rfc:`7405`. EnumStatement :`EnumTypeName` `SP` `Identifier` [`Mixins`] [`WS`] `EnumShapeMembers` EnumTypeName :%s"enum" / %s"intEnum" EnumShapeMembers :"{" [`WS`] 1*(`TraitStatements` `Identifier` [`ValueAssignment`] [`WS`]) "}" - ValueAssignment :[`SP`] "=" [`SP`] `NodeValue` [`SP`] [`Comma`] `BR` - ListStatement :%s"list" `SP` `Identifier` [`Mixins`] [`WS`] `ListMembers` - ListMembers :"{" [`WS`] [`ListMember`] [`WS`] "}" - ListMember :`TraitStatements` (`ElidedListMember` / `ExplicitListMember`) - ElidedListMember :%s"$member" - ExplicitListMember :%s"member" [`SP`] ":" [`SP`] `ShapeId` - MapStatement :%s"map" `SP` `Identifier` [`Mixins`] [`WS`] `MapMembers` - MapMembers :"{" [`WS`] [`MapKey` / `MapValue` / (`MapKey` `WS` `MapValue`)] [`WS`] "}" - MapKey :`TraitStatements` (`ElidedMapKey` / `ExplicitMapKey`) - MapValue :`TraitStatements` (`ElidedMapValue` / `ExplicitMapValue`) - ElidedMapKey :%s"$key" - ExplicitMapKey :%s"key" [`SP`] ":" [`SP`] `ShapeId` - ElidedMapValue :%s"$value" - ExplicitMapValue :%s"value" [`SP`] ":" [`SP`] `ShapeId` + ValueAssignment :[`SP`] "=" [`SP`] `NodeValue` `BR` + AggregateShapeStatement :`AggregateTypeName` `SP` `Identifier` [`Mixins`] `ShapeMembers` + AggregateTypeName :%s"list" / %s"map" / %s"union" StructureStatement :%s"structure" `SP` `Identifier` [`StructureResource`] - : [`Mixins`] [`WS`] `StructureMembers` + : [`Mixins`] [`WS`] `ShapeMembers` StructureResource :`SP` %s"for" `SP` `ShapeId` - StructureMembers :"{" [`WS`] *(`TraitStatements` `StructureMember` [`WS`]) "}" - StructureMember :(`ExplicitStructureMember` / `ElidedStructureMember`) [`ValueAssignment`] - ExplicitStructureMember :`Identifier` [`SP`] ":" [`SP`] `ShapeId` - ElidedStructureMember :"$" `Identifier` - UnionStatement :%s"union" `SP` `Identifier` [`Mixins`] [`WS`] `UnionMembers` - UnionMembers :"{" [`WS`] *(`TraitStatements` `UnionMember` [`WS`]) "}" - UnionMember :(`ExplicitStructureMember` / `ElidedStructureMember`) + ShapeMembers :"{" [`WS`] *(`TraitStatements` `ShapeMember` [`WS`]) "}" + ShapeMember :(`ExplicitShapeMember` / `ElidedShapeMember`) [`ValueAssignment`] + ExplicitShapeMember :`Identifier` [`SP`] ":" [`SP`] `ShapeId` + ElidedShapeMember :"$" `Identifier` ServiceStatement :%s"service" `SP` `Identifier` [`Mixins`] [`WS`] `NodeObject` ResourceStatement :%s"resource" `SP` `Identifier` [`Mixins`] [`WS`] `NodeObject` OperationStatement :%s"operation" `SP` `Identifier` [`Mixins`] [`WS`] `OperationBody` @@ -228,7 +212,7 @@ string support defined in :rfc:`7405`. OperationOutput :%s"output" [`WS`] (`InlineStructure` / (":" [`WS`] `ShapeId`)) OperationErrors :%s"errors" [`WS`] ":" [`WS`] "[" [`WS`] *(`ShapeId` [`WS`]) "]" InlineStructure :":=" [`WS`] `TraitStatements` [`StructureResource`] - : [`Mixins`] [`WS`] `StructureMembers` + : [`Mixins`] [`WS`] `ShapeMembers` .. rubric:: Traits @@ -896,7 +880,7 @@ The above intEnum is exactly equivalent to the following intEnum: List shapes ----------- -A :ref:`list ` shape is defined using a :token:`smithy:ListStatement`. +A :ref:`list ` shape is defined using a :token:`smithy:AggregateShapeStatement`. The following example defines a list with a string member from the :ref:`prelude `: @@ -977,7 +961,7 @@ Traits can be applied to the list shape and its member: Map shapes ---------- -A :ref:`map ` shape is defined using a :token:`smithy:MapStatement`. +A :ref:`map ` shape is defined using a :token:`smithy:AggregateShapeStatement`. The following example defines a map of strings to integers: @@ -1187,7 +1171,7 @@ Is exactly equivalent to: Union shapes ------------ -A :ref:`union ` shape is defined using a :token:`smithy:UnionStatement`. +A :ref:`union ` shape is defined using a :token:`smithy:AggregateShapeStatement`. The following example defines a union shape with several members: diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/loader/IdlModelLoader.java b/smithy-model/src/main/java/software/amazon/smithy/model/loader/IdlModelLoader.java index db3ed62e71b..5e194b21b16 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/loader/IdlModelLoader.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/loader/IdlModelLoader.java @@ -33,16 +33,12 @@ import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.model.node.StringNode; import software.amazon.smithy.model.shapes.AbstractShapeBuilder; -import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.EnumShape; import software.amazon.smithy.model.shapes.IntEnumShape; -import software.amazon.smithy.model.shapes.ListShape; -import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ResourceShape; import software.amazon.smithy.model.shapes.ServiceShape; -import software.amazon.smithy.model.shapes.SetShape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.ShapeType; import software.amazon.smithy.model.shapes.StructureShape; @@ -52,7 +48,6 @@ import software.amazon.smithy.model.traits.EnumValueTrait; import software.amazon.smithy.model.traits.InputTrait; import software.amazon.smithy.model.traits.OutputTrait; -import software.amazon.smithy.model.traits.Trait; import software.amazon.smithy.model.traits.UnitTypeTrait; import software.amazon.smithy.model.validation.Severity; import software.amazon.smithy.model.validation.ValidationEvent; @@ -561,13 +556,9 @@ private void parseShapeOrApply(List traits) { parseSimpleShape(id, location, type.createBuilderForType()); break; case LIST: - parseCollection(id, location, ListShape.builder()); - break; case SET: - parseCollection(id, location, SetShape.builder()); - break; case MAP: - parseMapStatement(id, location); + parseAggregateShape(id, location, type.createBuilderForType()); break; case ENUM: parseEnumShape(id, location, EnumShape.builder()); @@ -576,10 +567,10 @@ private void parseShapeOrApply(List traits) { parseEnumShape(id, location, IntEnumShape.builder()); break; case STRUCTURE: - parseStructuredShape(id, location, StructureShape.builder(), MemberParsing.PARSING_STRUCTURE_MEMBER); + parseStructuredShape(id, location, StructureShape.builder()); break; case UNION: - parseStructuredShape(id, location, UnionShape.builder(), MemberParsing.PARSING_MEMBER); + parseStructuredShape(id, location, UnionShape.builder()); break; case SERVICE: parseServiceStatement(id, location); @@ -665,64 +656,6 @@ private void parseMixins(LoadOperation.DefineShape operation) { tokenizer.next(); } - // See parseMap for information on why members are parsed before the list/set is registered with the ModelFile. - private void parseCollection(ShapeId id, SourceLocation location, CollectionShape.Builder builder) { - LoadOperation.DefineShape operation = createShape(builder.id(id).source(location)); - parseMixins(operation); - tokenizer.skipWsAndDocs(); - tokenizer.expect(IdlToken.LBRACE); - tokenizer.next(); - tokenizer.skipWs(); - parsePossiblyElidedMember(operation, "member"); - tokenizer.skipWsAndDocs(); - tokenizer.expect(IdlToken.RBRACE); - tokenizer.next(); - operations.accept(operation); - } - - // Parsed list, set, and map members. - private void parsePossiblyElidedMember(LoadOperation.DefineShape operation, String memberName) { - boolean isElided = false; - List memberTraits = IdlTraitParser.parseDocsAndTraitsBeforeShape(tokenizer, resolver); - SourceLocation location = tokenizer.getCurrentTokenLocation(); - - if (tokenizer.getCurrentToken() == IdlToken.DOLLAR) { - isElided = true; - if (!modelVersion.supportsTargetElision()) { - throw syntax(operation.toShapeId().withMember(memberName), - "Members can only elide targets in IDL version 2 or later"); - } - tokenizer.next(); - tokenizer.expect(IdlToken.IDENTIFIER); - } else { - if (!tokenizer.doesCurrentIdentifierStartWith(memberName.charAt(0))) { - if (!memberTraits.isEmpty()) { - throw syntax("Expected member definition to follow traits"); - } - return; - } - } - - MemberShape.Builder memberBuilder = MemberShape.builder() - .id(operation.toShapeId().withMember(memberName)) - .source(location); - - tokenizer.expectCurrentLexeme(memberName); - tokenizer.next(); - - if (!isElided) { - tokenizer.skipWsAndDocs(); - tokenizer.expect(IdlToken.COLON); - tokenizer.next(); - tokenizer.skipWsAndDocs(); - String id = tokenizer.internString(IdlShapeIdParser.expectAndSkipShapeId(tokenizer)); - addForwardReference(id, memberBuilder::target); - } - - operation.addMember(memberBuilder); - addTraits(memberBuilder.getId(), memberTraits); - } - private void parseEnumShape(ShapeId id, SourceLocation location, AbstractShapeBuilder builder) { LoadOperation.DefineShape operation = createShape(builder.id(id).source(location)); parseMixins(operation); @@ -765,27 +698,17 @@ private void parseEnumShape(ShapeId id, SourceLocation location, AbstractShapeBu operations.accept(operation); } - private void parseMapStatement(ShapeId id, SourceLocation location) { - LoadOperation.DefineShape operation = createShape(MapShape.builder().id(id).source(location)); + private void parseAggregateShape(ShapeId id, SourceLocation location, AbstractShapeBuilder builder) { + LoadOperation.DefineShape operation = createShape(builder.id(id).source(location)); parseMixins(operation); - tokenizer.skipWsAndDocs(); - tokenizer.expect(IdlToken.LBRACE); - tokenizer.next(); - tokenizer.skipWs(); - parsePossiblyElidedMember(operation, "key"); - tokenizer.skipWs(); - parsePossiblyElidedMember(operation, "value"); - tokenizer.skipWsAndDocs(); - tokenizer.expect(IdlToken.RBRACE); - tokenizer.next(); + parseMembers(operation); operations.accept(operation); } private void parseStructuredShape( ShapeId id, SourceLocation location, - AbstractShapeBuilder builder, - MemberParsing memberParsing + AbstractShapeBuilder builder ) { LoadOperation.DefineShape operation = createShape(builder.id(id).source(location)); @@ -797,40 +720,11 @@ private void parseStructuredShape( // Parse optional "with" statements to add mixins, but only if it's supported by the version. parseMixins(operation); - parseMembers(operation, memberParsing); + parseMembers(operation); operations.accept(operation); } - private enum MemberParsing { - PARSING_STRUCTURE_MEMBER { - @Override - boolean supportsAssignment() { - return true; - } - - @Override - Trait createAssignmentTrait(ShapeId id, Node value) { - return new DefaultTrait(value); - } - }, - PARSING_MEMBER { - @Override - boolean supportsAssignment() { - return false; - } - - @Override - Trait createAssignmentTrait(ShapeId id, Node value) { - throw new UnsupportedOperationException(); - } - }; - - abstract boolean supportsAssignment(); - - abstract Trait createAssignmentTrait(ShapeId id, Node value); - } - - private void parseMembers(LoadOperation.DefineShape op, MemberParsing memberParsing) { + private void parseMembers(LoadOperation.DefineShape op) { Set definedMembers = new HashSet<>(); tokenizer.skipWsAndDocs(); @@ -839,7 +733,7 @@ private void parseMembers(LoadOperation.DefineShape op, MemberParsing memberPars tokenizer.skipWs(); while (tokenizer.hasNext() && tokenizer.getCurrentToken() != IdlToken.RBRACE) { - parseMember(op, definedMembers, memberParsing); + parseMember(op, definedMembers); tokenizer.skipWs(); } @@ -847,7 +741,7 @@ private void parseMembers(LoadOperation.DefineShape op, MemberParsing memberPars tokenizer.next(); } - private void parseMember(LoadOperation.DefineShape operation, Set defined, MemberParsing memberParsing) { + private void parseMember(LoadOperation.DefineShape operation, Set defined) { ShapeId parent = operation.toShapeId(); // Parse optional member traits. @@ -905,7 +799,7 @@ private void parseMember(LoadOperation.DefineShape operation, Set define // Skip spaces to check if there is default trait sugar. tokenizer.skipSpaces(); - if (memberParsing.supportsAssignment() && tokenizer.getCurrentToken() == IdlToken.EQUAL) { + if (tokenizer.getCurrentToken() == IdlToken.EQUAL) { if (!modelVersion.isDefaultSupported()) { throw syntax("@default assignment is only supported in IDL version 2 or later"); } @@ -913,7 +807,7 @@ private void parseMember(LoadOperation.DefineShape operation, Set define tokenizer.next(); tokenizer.skipSpaces(); Node node = IdlNodeParser.expectAndSkipNode(tokenizer, resolver); - memberBuilder.addTrait(memberParsing.createAssignmentTrait(memberId, node)); + memberBuilder.addTrait(new DefaultTrait(node)); tokenizer.expectAndSkipBr(); } @@ -1108,7 +1002,7 @@ private ShapeId parseInlineStructure(String name, IdlTraitParser.Result defaultT LoadOperation.DefineShape operation = createShape(builder); parseMixins(operation); parseForResource(operation); - parseMembers(operation, MemberParsing.PARSING_STRUCTURE_MEMBER); + parseMembers(operation); addTraits(id, traits); operations.accept(operation); return id; diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/loader/LoaderShapeMap.java b/smithy-model/src/main/java/software/amazon/smithy/model/loader/LoaderShapeMap.java index 9ef8e8cf36a..669b88f6338 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/loader/LoaderShapeMap.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/loader/LoaderShapeMap.java @@ -371,7 +371,13 @@ private Shape buildShape( } MemberShape member = buildMember(memberBuilder); if (member != null) { - builder.addMember(member); + // Adding a member may throw, but we want to continue execution, so we collect all + // errors that occur. + try { + builder.addMember(member); + } catch (SourceException e) { + events.add(ValidationEvent.fromSourceException(e, "", builder.getId())); + } } } diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/shapes/CollectionShape.java b/smithy-model/src/main/java/software/amazon/smithy/model/shapes/CollectionShape.java index 79040d82b81..5d88c25573b 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/shapes/CollectionShape.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/shapes/CollectionShape.java @@ -21,8 +21,10 @@ import java.util.Objects; import java.util.Optional; import java.util.function.Consumer; +import software.amazon.smithy.model.SourceException; import software.amazon.smithy.model.SourceLocation; import software.amazon.smithy.model.traits.Trait; +import software.amazon.smithy.utils.StringUtils; /** * Abstract class representing Set and List shapes. @@ -34,14 +36,9 @@ public abstract class CollectionShape extends Shape { CollectionShape(Builder builder) { super(builder, false); - member = getRequiredMixinMember(builder, builder.member, "member"); - - ShapeId expected = getId().withMember("member"); - if (!member.getId().equals(expected)) { - throw new IllegalArgumentException(String.format( - "Expected member of `%s` to have an ID of `%s` but found `%s`", - getId(), expected, member.getId())); - } + MemberShape[] members = getRequiredMembers(builder, "member"); + member = members[0]; + validateMemberShapeIds(); } /** @@ -81,6 +78,15 @@ public abstract static class Builder, S extends Collecti private MemberShape member; + @Override + public Optional getMember(String memberName) { + if ("member".equals(memberName)) { + return Optional.ofNullable(member); + } else { + return Optional.empty(); + } + } + @Override public B id(ShapeId shapeId) { if (member != null) { @@ -97,6 +103,12 @@ public B id(ShapeId shapeId) { */ @SuppressWarnings("unchecked") public B member(MemberShape member) { + if (member != null && !member.getMemberName().equals("member")) { + String shapeTypeName = StringUtils.capitalize(this.getShapeType().toString()); + String message = String.format("%s shapes may only have a `member` member, but found `%s`", + shapeTypeName, member.getMemberName()); + throw new SourceException(message, member); + } this.member = Objects.requireNonNull(member); return (B) this; } diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/shapes/MapShape.java b/smithy-model/src/main/java/software/amazon/smithy/model/shapes/MapShape.java index 42dce23e484..cab5ed6a800 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/shapes/MapShape.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/shapes/MapShape.java @@ -24,6 +24,7 @@ import java.util.Optional; import java.util.Set; import java.util.function.Consumer; +import software.amazon.smithy.model.SourceException; import software.amazon.smithy.model.SourceLocation; import software.amazon.smithy.model.traits.Trait; import software.amazon.smithy.utils.ListUtils; @@ -42,8 +43,9 @@ public final class MapShape extends Shape implements ToSmithyBuilder { private MapShape(Builder builder) { super(builder, false); - key = getRequiredMixinMember(builder, builder.key, "key"); - value = getRequiredMixinMember(builder, builder.value, "value"); + MemberShape[] members = getRequiredMembers(builder, "key", "value"); + key = members[0]; + value = members[1]; validateMemberShapeIds(); } @@ -175,6 +177,17 @@ public ShapeType getShapeType() { return ShapeType.MAP; } + @Override + public Optional getMember(String memberName) { + if ("key".equals(memberName)) { + return Optional.ofNullable(key); + } else if ("value".equals(memberName)) { + return Optional.ofNullable(value); + } else { + return Optional.empty(); + } + } + @Override public Builder id(ShapeId shapeId) { // If the shape id has changed then the key and value member ids also need to be updated. @@ -204,7 +217,9 @@ public Builder addMember(MemberShape member) { } else if (member.getMemberName().equals("value")) { return value(member); } else { - throw new IllegalStateException("Invalid member given to MapShape builder: " + member.getId()); + String message = String.format("Map shapes may only have `key` and `value` members, but found `%s`", + member.getMemberName()); + throw new SourceException(message, member); } } diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/shapes/Shape.java b/smithy-model/src/main/java/software/amazon/smithy/model/shapes/Shape.java index dc2de8ccf8e..99473ac3982 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/shapes/Shape.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/shapes/Shape.java @@ -15,6 +15,7 @@ package software.amazon.smithy.model.shapes; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -108,13 +109,38 @@ protected void validateMixins(Map mixins, Map in } } - protected MemberShape getRequiredMixinMember( - AbstractShapeBuilder builder, - MemberShape onBuilder, - String name - ) { - if (onBuilder != null) { - return onBuilder; + protected MemberShape[] getRequiredMembers(AbstractShapeBuilder builder, String... requiredMembersNames) { + // Caller knows the order of provided member names, so we don't need a dynamic data structure. + MemberShape[] members = new MemberShape[requiredMembersNames.length]; + int missingMemberCount = 0; + + for (int memberNameIndex = 0; memberNameIndex < requiredMembersNames.length; memberNameIndex++) { + String requiredMemberName = requiredMembersNames[memberNameIndex]; + MemberShape member = getRequiredMixinMember(builder, requiredMemberName); + if (member != null) { + members[memberNameIndex] = member; + } else { + missingMemberCount++; + } + } + + if (missingMemberCount > 0) { + List missingMembers = new ArrayList<>(); + for (int memberIndex = 0; memberIndex < members.length; memberIndex++) { + if (members[memberIndex] == null) { + missingMembers.add(requiredMembersNames[memberIndex]); + } + } + throw missingRequiredMembersException(missingMembers); + } + + return members; + } + + private MemberShape getRequiredMixinMember(AbstractShapeBuilder builder, String requiredMemberName) { + Optional memberOnBuilder = builder.getMember(requiredMemberName); + if (memberOnBuilder.isPresent()) { + return memberOnBuilder.get(); } // Get the most recently introduced mixin member with the given name. @@ -122,7 +148,7 @@ protected MemberShape getRequiredMixinMember( for (Shape shape : builder.getMixins().values()) { for (MemberShape member : shape.members()) { - if (member.getMemberName().equals(name)) { + if (member.getMemberName().equals(requiredMemberName)) { mostRecentMember = member; break; // break to the next mixin shape. } @@ -130,19 +156,25 @@ protected MemberShape getRequiredMixinMember( } if (mostRecentMember == null) { - throw new SourceException( - String.format("Missing required member of shape `%s`: %s", getId(), name), - builder.getSourceLocation()); + return null; } return MemberShape.builder() - .id(getId().withMember(name)) + .id(getId().withMember(requiredMemberName)) .target(mostRecentMember.getTarget()) .source(getSourceLocation()) .addMixin(mostRecentMember) .build(); } + private SourceException missingRequiredMembersException(List missingMembersNames) { + String missingRequired = missingMembersNames.size() > 1 ? "members" : "member"; + String missingMembers = String.join(", ", missingMembersNames); + String message = String.format("Missing required %s of shape `%s`: %s", + missingRequired, getId(), missingMembers); + return new SourceException(message, getSourceLocation()); + } + /** * Validates that a shape ID has or does not have a member. * diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/dupe-list-member-names.errors b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/dupe-list-member-names.errors index 5f2b51f3107..bede84baeba 100644 --- a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/dupe-list-member-names.errors +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/dupe-list-member-names.errors @@ -1 +1 @@ -[ERROR] -: Syntax error at line 7, column 5: Expected RBRACE('}') but found IDENTIFIER('member') | Model +[ERROR] com.foo#List: Syntax error at line 7, column 5: Duplicate member of `com.foo#List`: 'member' | Model diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/dupe-map-member-names.errors b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/dupe-map-member-names.errors index 776102a47a1..7c906ea191b 100644 --- a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/dupe-map-member-names.errors +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/dupe-map-member-names.errors @@ -1 +1 @@ -[ERROR] -: Syntax error at line 7, column 5: Expected RBRACE('}') but found IDENTIFIER('key') | Model +[ERROR] com.foo#Map: Syntax error at line 7, column 5: Duplicate member of `com.foo#Map`: 'key' | Model diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/dupe-set-member-names.errors b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/dupe-set-member-names.errors index 5f2b51f3107..42ccd927c90 100644 --- a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/dupe-set-member-names.errors +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/dupe-set-member-names.errors @@ -1 +1 @@ -[ERROR] -: Syntax error at line 7, column 5: Expected RBRACE('}') but found IDENTIFIER('member') | Model +[ERROR] com.foo#Set: Syntax error at line 7, column 5: Duplicate member of `com.foo#Set`: 'member' | Model diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/idl-invalid-list-and-map-members.errors b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/idl-invalid-list-and-map-members.errors new file mode 100644 index 00000000000..b37d43b47d2 --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/idl-invalid-list-and-map-members.errors @@ -0,0 +1,15 @@ +[ERROR] com.test#NoMemberList: Missing required member of shape `com.test#NoMemberList`: member | Model +[ERROR] com.test#NoMemberMap: Missing required members of shape `com.test#NoMemberMap`: key, value | Model +[ERROR] com.test#MissingKeyMap: Missing required member of shape `com.test#MissingKeyMap`: key | Model +[ERROR] com.test#MissingValueMap: Missing required member of shape `com.test#MissingValueMap`: value | Model +[ERROR] com.test#WrongMemberList: List shapes may only have a `member` member, but found `foo` | Model +[ERROR] com.test#WrongMemberList: Missing required member of shape `com.test#WrongMemberList`: member | Model +[ERROR] com.test#WrongMemberMap: Map shapes may only have `key` and `value` members, but found `foo` | Model +[ERROR] com.test#WrongMemberMap: Missing required member of shape `com.test#WrongMemberMap`: key | Model +[ERROR] com.test#OtherWrongMemberMap: Map shapes may only have `key` and `value` members, but found `foo` | Model +[ERROR] com.test#OtherWrongMemberMap: Missing required member of shape `com.test#OtherWrongMemberMap`: value | Model +[ERROR] com.test#BothWrongMembersMap: Map shapes may only have `key` and `value` members, but found `foo` | Model +[ERROR] com.test#BothWrongMembersMap: Map shapes may only have `key` and `value` members, but found `bar` | Model +[ERROR] com.test#BothWrongMembersMap: Missing required members of shape `com.test#BothWrongMembersMap`: key, value | Model +[ERROR] com.test#ExtraMemberList: List shapes may only have a `member` member, but found `foo` | Model +[ERROR] com.test#ExtraMemberMap: Map shapes may only have `key` and `value` members, but found `foo` | Model diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/idl-invalid-list-and-map-members.smithy b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/idl-invalid-list-and-map-members.smithy new file mode 100644 index 00000000000..03ff0458870 --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/idl-invalid-list-and-map-members.smithy @@ -0,0 +1,45 @@ +$version: "2.0" + +namespace com.test + +list NoMemberList {} + +map NoMemberMap {} + +map MissingValueMap { + key: String +} + +map MissingKeyMap { + value: String +} + +list WrongMemberList { + foo: String +} + +map WrongMemberMap { + foo: String + value: String +} + +map OtherWrongMemberMap { + key: String + foo: String +} + +map BothWrongMembersMap { + foo: String + bar: String +} + +list ExtraMemberList { + member: String + foo: String +} + +map ExtraMemberMap { + key: String + value: String + foo: String +} diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/idl-invalid-set-members.errors b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/idl-invalid-set-members.errors new file mode 100644 index 00000000000..013f4a3dffe --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/idl-invalid-set-members.errors @@ -0,0 +1,4 @@ +[ERROR] com.test#NoMemberSet: Missing required member of shape `com.test#NoMemberSet`: member | Model +[ERROR] com.test#WrongMemberSet: Set shapes may only have a `member` member, but found `foo` | Model +[ERROR] com.test#WrongMemberSet: Missing required member of shape `com.test#WrongMemberSet`: member | Model +[ERROR] com.test#ExtraMemberSet: Set shapes may only have a `member` member, but found `foo` | Model diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/idl-invalid-set-members.smithy b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/idl-invalid-set-members.smithy new file mode 100644 index 00000000000..7f579790658 --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/idl-invalid-set-members.smithy @@ -0,0 +1,14 @@ +$version: "1.0" + +namespace com.test + +set NoMemberSet {} + +set WrongMemberSet { + foo: String +} + +set ExtraMemberSet { + member: String + foo: String +} diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/invalid-list-mixins.errors b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/invalid-list-mixins.errors new file mode 100644 index 00000000000..ddb6a4d7e93 --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/invalid-list-mixins.errors @@ -0,0 +1,6 @@ +[ERROR] com.test#ExtraMemberAndValidMixin: List shapes may only have a `member` member, but found `foo` | Model +[ERROR] com.test#NoMemberMixin: Missing required member of shape `com.test#NoMemberMixin`: member | Model +[ERROR] com.test#ExtraMemberMixin: List shapes may only have a `member` member, but found `foo` | Model +[ERROR] com.test#ValidWithNoMemberMixin: Cannot apply mixin to com.test#ValidWithNoMemberMixin: com.test#NoMemberMixin not found | Model +[ERROR] com.test#InvalidWithNoMemberMixin: Cannot apply mixin to com.test#InvalidWithNoMemberMixin: com.test#NoMemberMixin not found | Model +[ERROR] com.test#ElidingMemberFromNoMemberMixin: Cannot apply mixin to com.test#ElidingMemberFromNoMemberMixin$member: com.test#NoMemberMixin not found | Model diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/invalid-list-mixins.smithy b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/invalid-list-mixins.smithy new file mode 100644 index 00000000000..249086f13a4 --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/invalid-list-mixins.smithy @@ -0,0 +1,40 @@ +$version: "2.0" + +namespace com.test + +@mixin +list ValidMixin { + member: String +} + +list ExtraMemberAndValidMixin with [ValidMixin] { + foo: String +} + +@mixin +list NoMemberMixin { + +} + +list ValidWithNoMemberMixin with [NoMemberMixin] { + member: String +} + +list InvalidWithNoMemberMixin with [NoMemberMixin] { + +} + +@mixin +list ExtraMemberMixin { + member: String + foo: String +} + +// This shape doesn't produce its own error for now +list WithExtraMemberMixin with [ExtraMemberMixin] { + $member +} + +list ElidingMemberFromNoMemberMixin with [NoMemberMixin] { + $member +} diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/invalid-map-mixins.errors b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/invalid-map-mixins.errors new file mode 100644 index 00000000000..c5251de2bf6 --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/invalid-map-mixins.errors @@ -0,0 +1,9 @@ +[ERROR] com.test#ExtraMemberAndValidMixin: Map shapes may only have `key` and `value` members, but found `foo` | Model +[ERROR] com.test#MissingMemberMixin: Missing required member of shape `com.test#MissingMemberMixin`: value | Model +[ERROR] com.test#ValidWithMissingMemberMixin: Cannot apply mixin to com.test#ValidWithMissingMemberMixin: com.test#MissingMemberMixin not found | Model +[ERROR] com.test#InvalidWithMissingMemberMixin: Cannot apply mixin to com.test#InvalidWithMissingMemberMixin: com.test#MissingMemberMixin not found | Model +[ERROR] com.test#NoMemberMixin: Missing required members of shape `com.test#NoMemberMixin`: key, value | Model +[ERROR] com.test#ValidWithNoMemberMixin: Cannot apply mixin to com.test#ValidWithNoMemberMixin: com.test#NoMemberMixin not found | Model +[ERROR] com.test#InvalidWithNoMemberMixin: Cannot apply mixin to com.test#InvalidWithNoMemberMixin: com.test#NoMemberMixin not found | Model +[ERROR] com.test#ExtraMemberMixin: Map shapes may only have `key` and `value` members, but found `foo` | Model +[ERROR] com.test#ElidingMemberFromNoMemberMixin: Cannot apply mixin to com.test#ElidingMemberFromNoMemberMixin$key: com.test#NoMemberMixin not found | Model diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/invalid-map-mixins.smithy b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/invalid-map-mixins.smithy new file mode 100644 index 00000000000..80fd0ce55f0 --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/invalid-map-mixins.smithy @@ -0,0 +1,59 @@ +$version: "2.0" + +namespace com.test + +@mixin +map ValidMixin { + key: String + value: String +} + +map ExtraMemberAndValidMixin with [ValidMixin] { + foo: String +} + +@mixin +map MissingMemberMixin { + key: String +} + +map ValidWithMissingMemberMixin with [MissingMemberMixin] { + key: String + value: String +} + +map InvalidWithMissingMemberMixin with [MissingMemberMixin] { + value: String +} + +@mixin +map NoMemberMixin { + +} + +map ValidWithNoMemberMixin with [NoMemberMixin] { + key: String + value: String +} + +map InvalidWithNoMemberMixin with [NoMemberMixin] { + key: String +} + +@mixin +map ExtraMemberMixin { + key: String + value: String + foo: String +} + +// This shape doesn't produce its own error for now +map WithExtraMemberMixin with [ExtraMemberMixin] { + $key + $value +} + +map ElidingMemberFromNoMemberMixin with [NoMemberMixin] { + $key + $value +} diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/json-invalid-list-and-map-members.errors b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/json-invalid-list-and-map-members.errors new file mode 100644 index 00000000000..9130e4c9e8e --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/json-invalid-list-and-map-members.errors @@ -0,0 +1,8 @@ +[ERROR] com.test#NoMemberList: Missing required member of shape `com.test#NoMemberList`: member | Model +[ERROR] com.test#NoMemberMap: Missing required members of shape `com.test#NoMemberMap`: key, value | Model +[ERROR] com.test#MissingKeyMap: Missing required member of shape `com.test#MissingKeyMap`: key | Model +[ERROR] com.test#MissingValueMap: Missing required member of shape `com.test#MissingValueMap`: value | Model +[ERROR] com.test#WrongMemberList: Missing required member of shape `com.test#WrongMemberList`: member | Model +[ERROR] com.test#WrongMemberMap: Missing required member of shape `com.test#WrongMemberMap`: key | Model +[ERROR] com.test#OtherWrongMemberMap: Missing required member of shape `com.test#OtherWrongMemberMap`: value | Model +[ERROR] com.test#BothWrongMembersMap: Missing required members of shape `com.test#BothWrongMembersMap`: key, value | Model diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/json-invalid-list-and-map-members.json b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/json-invalid-list-and-map-members.json new file mode 100644 index 00000000000..0e714c78bd6 --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/json-invalid-list-and-map-members.json @@ -0,0 +1,77 @@ +{ + "smithy": "2.0", + "shapes": { + "com.test#NoMemberList": { + "type": "list" + }, + "com.test#NoMemberMap": { + "type": "map" + }, + "com.test#MissingValueMap": { + "type": "map", + "key": { + "target": "smithy.api#String" + } + }, + "com.test#MissingKeyMap": { + "type": "map", + "value": { + "target": "smithy.api#String" + } + }, + "com.test#WrongMemberList": { + "type": "list", + "foo": { + "target": "smithy.api#String" + } + }, + "com.test#WrongMemberMap": { + "type": "map", + "foo": { + "target": "smithy.api#String" + }, + "value": { + "target": "smithy.api#String" + } + }, + "com.test#OtherWrongMemberMap": { + "type": "map", + "key": { + "target": "smithy.api#String" + }, + "foo": { + "target": "smithy.api#String" + } + }, + "com.test#BothWrongMembersMap": { + "type": "map", + "foo": { + "target": "smithy.api#String" + }, + "bar": { + "target": "smithy.api#String" + } + }, + "com.test#ExtraMemberList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "foo": { + "target": "smithy.api#String" + } + }, + "com.test#ExtraMemberMap": { + "type": "map", + "key": { + "target": "smithy.api#String" + }, + "value": { + "target": "smithy.api#String" + }, + "foo": { + "target": "smithy.api#String" + } + } + } +} diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/json-invalid-set-members.errors b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/json-invalid-set-members.errors new file mode 100644 index 00000000000..4806e262593 --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/json-invalid-set-members.errors @@ -0,0 +1,2 @@ +[ERROR] com.test#NoMemberSet: Missing required member of shape `com.test#NoMemberSet`: member | Model +[ERROR] com.test#WrongMemberSet: Missing required member of shape `com.test#WrongMemberSet`: member | Model diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/json-invalid-set-members.json b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/json-invalid-set-members.json new file mode 100644 index 00000000000..7f03bab2244 --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/loader/json-invalid-set-members.json @@ -0,0 +1,23 @@ +{ + "smithy": "1.0", + "shapes": { + "com.test#NoMemberSet": { + "type": "set" + }, + "com.test#WrongMemberSet": { + "type": "set", + "foo": { + "target": "smithy.api#String" + } + }, + "com.test#ExtraMemberSet": { + "type": "set", + "member": { + "target": "smithy.api#String" + }, + "foo": { + "target": "smithy.api#String" + } + } + } +} diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/lists-do-not-support-member-defaults.errors b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/lists-do-not-support-member-defaults.errors new file mode 100644 index 00000000000..a1bdc75f55b --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/lists-do-not-support-member-defaults.errors @@ -0,0 +1 @@ +[ERROR] com.foo#Foo$member: Trait `default` cannot be applied to `com.foo#Foo$member`. This trait may only be applied to shapes that match the following selector: :is(simpleType, list, map, structure > member :test(> :is(simpleType, list, map))) | TraitTarget diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/lists-do-not-support-member-defaults.smithy b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/lists-do-not-support-member-defaults.smithy new file mode 100644 index 00000000000..0e929e2814f --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/lists-do-not-support-member-defaults.smithy @@ -0,0 +1,7 @@ +$version: "2.0" + +namespace com.foo + +list Foo { + member: String = "hi" +} diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/maps-do-not-support-member-defaults.errors b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/maps-do-not-support-member-defaults.errors new file mode 100644 index 00000000000..642f1b31a08 --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/maps-do-not-support-member-defaults.errors @@ -0,0 +1,2 @@ +[ERROR] com.foo#Foo$key: Trait `default` cannot be applied to `com.foo#Foo$key`. This trait may only be applied to shapes that match the following selector: :is(simpleType, list, map, structure > member :test(> :is(simpleType, list, map))) | TraitTarget +[ERROR] com.foo#Foo$value: Trait `default` cannot be applied to `com.foo#Foo$value`. This trait may only be applied to shapes that match the following selector: :is(simpleType, list, map, structure > member :test(> :is(simpleType, list, map))) | TraitTarget diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/maps-do-not-support-member-defaults.smithy b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/maps-do-not-support-member-defaults.smithy new file mode 100644 index 00000000000..e9ac689240c --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/maps-do-not-support-member-defaults.smithy @@ -0,0 +1,8 @@ +$version: "2.0" + +namespace com.foo + +map Foo { + key: String = "hi" + value: String = "hi" +} diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target.errors b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/trait-target.errors similarity index 100% rename from smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target.errors rename to smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/trait-target.errors diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target.json b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/trait-target.json similarity index 100% rename from smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target.json rename to smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/trait-target.json diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/unions-do-not-support-member-defaults.errors b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/unions-do-not-support-member-defaults.errors new file mode 100644 index 00000000000..dd2e755cf1b --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/unions-do-not-support-member-defaults.errors @@ -0,0 +1 @@ +[ERROR] com.foo#Foo$bar: Trait `default` cannot be applied to `com.foo#Foo$bar`. This trait may only be applied to shapes that match the following selector: :is(simpleType, list, map, structure > member :test(> :is(simpleType, list, map))) | TraitTarget diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/unions-do-not-support-member-defaults.smithy b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/unions-do-not-support-member-defaults.smithy new file mode 100644 index 00000000000..f4e6d43aaef --- /dev/null +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/errorfiles/validators/trait-target/unions-do-not-support-member-defaults.smithy @@ -0,0 +1,7 @@ +$version: "2.0" + +namespace com.foo + +union Foo { + bar: String = "hi" +} diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/defaults/unions-do-not-support-defaults.smithy b/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/defaults/unions-do-not-support-defaults.smithy deleted file mode 100644 index 81832fcaa69..00000000000 --- a/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/defaults/unions-do-not-support-defaults.smithy +++ /dev/null @@ -1,8 +0,0 @@ -// Syntax error at line 7, column 17: Expected IDENTIFIER but found EQUAL('=') | Model -$version: "2.0" - -namespace com.foo - -union Foo { - bar: String = "hi" -} diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/lists/list-invalid-member.smithy b/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/lists/list-invalid-member.smithy deleted file mode 100644 index 17c1dcb6915..00000000000 --- a/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/lists/list-invalid-member.smithy +++ /dev/null @@ -1,6 +0,0 @@ -// Syntax error at line 5, column 3: Expected RBRACE('}') but found IDENTIFIER('foo') | Model -namespace com.foo - -list MyList { - foo: smithy.api#String, -} diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/lists/set-invalid-member.smithy b/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/lists/set-invalid-member.smithy deleted file mode 100644 index c02d3ae2def..00000000000 --- a/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/lists/set-invalid-member.smithy +++ /dev/null @@ -1,6 +0,0 @@ -// Syntax error at line 5, column 3: Expected RBRACE('}') but found IDENTIFIER('foo') | Model -namespace com.foo - -set MySet { - foo: smithy.api#String, -} diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/maps/map-empty-members.smithy b/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/maps/map-empty-members.smithy index f0033ef7cfd..1269e4ec787 100644 --- a/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/maps/map-empty-members.smithy +++ b/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/maps/map-empty-members.smithy @@ -1,4 +1,4 @@ -// Missing required member of shape `com.foo#MyMap`: key +// Missing required members of shape `com.foo#MyMap`: key, value namespace com.foo map MyMap {} diff --git a/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/maps/map-invalid-member.smithy b/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/maps/map-invalid-member.smithy deleted file mode 100644 index 3532be6051e..00000000000 --- a/smithy-model/src/test/resources/software/amazon/smithy/model/loader/invalid/maps/map-invalid-member.smithy +++ /dev/null @@ -1,8 +0,0 @@ -// Syntax error at line 7, column 3: Expected RBRACE('}') but found IDENTIFIER('fuzz') | Model -namespace com.foo - -map MyMap { - key: smithy.api#String, - value: smithy.api#String, - fuzz: smithy.api#String, -}