mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-02 22:02:51 +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:
@@ -11,22 +11,28 @@ auto HandlePattern(Context& context) -> void {
|
||||
auto state = context.PopState();
|
||||
switch (context.PositionKind()) {
|
||||
case Lex::TokenKind::OpenParen:
|
||||
context.PushStateForPattern(StateKind::PatternListAsTuple,
|
||||
state.in_var_pattern, state.in_unused_pattern,
|
||||
state.binding_context,
|
||||
state.ambient_precedence);
|
||||
context.PushStateForPattern(
|
||||
StateKind::PatternListAsTuple, state.in_var_pattern,
|
||||
state.in_unused_pattern, state.in_field_shorthand_pattern,
|
||||
state.binding_context, state.ambient_precedence);
|
||||
break;
|
||||
case Lex::TokenKind::OpenCurlyBrace:
|
||||
context.PushStateForPattern(
|
||||
StateKind::PatternListAsStruct, state.in_var_pattern,
|
||||
state.in_unused_pattern, state.in_field_shorthand_pattern,
|
||||
state.binding_context, state.ambient_precedence);
|
||||
break;
|
||||
case Lex::TokenKind::Var:
|
||||
context.PushStateForPattern(StateKind::VariablePattern,
|
||||
state.in_var_pattern, state.in_unused_pattern,
|
||||
state.binding_context,
|
||||
state.ambient_precedence);
|
||||
context.PushStateForPattern(
|
||||
StateKind::VariablePattern, state.in_var_pattern,
|
||||
state.in_unused_pattern, state.in_field_shorthand_pattern,
|
||||
state.binding_context, state.ambient_precedence);
|
||||
break;
|
||||
case Lex::TokenKind::Unused:
|
||||
context.PushStateForPattern(StateKind::UnusedPattern,
|
||||
state.in_var_pattern, state.in_unused_pattern,
|
||||
state.binding_context,
|
||||
state.ambient_precedence);
|
||||
context.PushStateForPattern(
|
||||
StateKind::UnusedPattern, state.in_var_pattern,
|
||||
state.in_unused_pattern, state.in_field_shorthand_pattern,
|
||||
state.binding_context, state.ambient_precedence);
|
||||
break;
|
||||
case Lex::TokenKind::Template:
|
||||
case Lex::TokenKind::Generic:
|
||||
@@ -35,10 +41,10 @@ auto HandlePattern(Context& context) -> void {
|
||||
// `self` is always a binding, even when its type is omitted (and so is not
|
||||
// followed by a `:`).
|
||||
case Lex::TokenKind::SelfValueIdentifier:
|
||||
context.PushStateForPattern(StateKind::BindingPattern,
|
||||
state.in_var_pattern, state.in_unused_pattern,
|
||||
state.binding_context,
|
||||
state.ambient_precedence);
|
||||
context.PushStateForPattern(
|
||||
StateKind::BindingPattern, state.in_var_pattern,
|
||||
state.in_unused_pattern, state.in_field_shorthand_pattern,
|
||||
state.binding_context, state.ambient_precedence);
|
||||
break;
|
||||
default:
|
||||
if (context.PositionKind().is_word() &&
|
||||
@@ -46,11 +52,14 @@ auto HandlePattern(Context& context) -> void {
|
||||
.is_binding_pattern_operator()) {
|
||||
context.PushStateForPattern(
|
||||
StateKind::BindingPattern, state.in_var_pattern,
|
||||
state.in_unused_pattern, state.binding_context,
|
||||
state.ambient_precedence);
|
||||
state.in_unused_pattern, state.in_field_shorthand_pattern,
|
||||
state.binding_context, state.ambient_precedence);
|
||||
break;
|
||||
}
|
||||
context.PushState(StateKind::ExprPattern);
|
||||
context.PushStateForPattern(
|
||||
StateKind::ExprPattern, state.in_var_pattern, state.in_unused_pattern,
|
||||
state.in_field_shorthand_pattern, state.binding_context,
|
||||
state.ambient_precedence);
|
||||
context.PushStateForExpr(state.ambient_precedence);
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user