mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 22:02:23 +01:00
Add initial support for parsing struct patterns (#7446)
Implements parsing of struct patterns as per https://github.com/carbon-language/carbon-lang/issues/6680. This handles the full and short syntax given in the [design doc](https://github.com/carbon-language/carbon-lang/blob/trunk/docs/design/pattern_matching.md#struct-patterns), but the handling of the shorthand syntax may need to change as I move on to implementing Check support (currently the shorthand is represented as one of `LetBindingPattern`, `VarBindingPattern`, or `VariablePattern`). This implementation assumes that the answer to https://github.com/carbon-language/carbon-lang/issues/7404 is that trailing commas are allowed in the struct pattern, except for the case where an `_` is present, in which case the next token must be the closing brace `}`.
This commit is contained in:
@@ -125,6 +125,15 @@ auto HandleBindingPattern(Context& context) -> void {
|
||||
self_token = *self;
|
||||
context.AddLeafNode(NodeKind::SelfValueName, *self);
|
||||
} else if (auto underscore = context.ConsumeIf(Lex::TokenKind::Underscore)) {
|
||||
if (state.in_field_shorthand_pattern) {
|
||||
CARBON_DIAGNOSTIC(
|
||||
AnonymousBindingInStructPattern, Error,
|
||||
"Anonymous binding found in struct pattern. Use `.field = "
|
||||
"_: field_type` or `unused field: field_type`");
|
||||
context.emitter().Emit(*context.position(),
|
||||
AnonymousBindingInStructPattern);
|
||||
state.has_error = true;
|
||||
}
|
||||
context.AddLeafNode(NodeKind::UnderscoreName, *underscore);
|
||||
} else if (context.PositionKind().is_word() &&
|
||||
context.PositionKind(Lookahead::NextToken)
|
||||
|
||||
Reference in New Issue
Block a user