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:
oli-ej
2026-07-30 16:37:46 +00:00
committed by GitHub
parent 8f224222a1
commit a683fb574b
21 changed files with 1999 additions and 57 deletions
@@ -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)