From 99bde2acb3d200dbf5d7cec374ab23e6b13a08b3 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Tue, 10 Mar 2026 13:04:28 -0700 Subject: [PATCH] Refactor `match` parse nodes. (#6870) Use the same node kind for the body of `case` and `default` handlers. We don't need to distinguish these in check, so don't create extra node kinds for them. In order to make the nodes properly delimited, make the label (`case ...` or `default`) nodes be children of the `=>` node rather than siblings. This allows us to use the node kind of the `=>` as the bracketing node for the complete handler, rather than having two different bracketing node kinds, one for each kind of label. --- toolchain/check/handle_match.cpp | 29 ++---- toolchain/check/node_stack.h | 6 +- toolchain/parse/handle_match.cpp | 58 +++++------ toolchain/parse/node_kind.def | 6 +- toolchain/parse/state.def | 19 ++-- .../parse/testdata/auto/match_case.carbon | 34 +++---- .../match/fail_cases_after_default.carbon | 8 +- .../match/fail_missing_case_arrow.carbon | 40 ++++---- .../match/fail_missing_case_pattern.carbon | 17 ++-- .../fail_missing_case_statements_block.carbon | 14 +-- .../match/fail_missing_default_arrow.carbon | 8 +- ...il_missing_default_statements_block.carbon | 8 +- .../fail_missing_guard_close_paren.carbon | 22 ++--- .../fail_missing_guard_open_paren.carbon | 25 ++--- ...sing_guard_parens_only_parse_errors.carbon | 51 +++++----- .../match/fail_missing_matched_expr.carbon | 8 +- ...il_unexpected_tokens_in_cases_block.carbon | 60 ++++++------ toolchain/parse/testdata/match/match.carbon | 90 ++++++++--------- toolchain/parse/testdata/var/unused.carbon | 98 +++++++++---------- toolchain/parse/typed_nodes.h | 47 ++++----- 20 files changed, 310 insertions(+), 338 deletions(-) diff --git a/toolchain/check/handle_match.cpp b/toolchain/check/handle_match.cpp index 63e9aaaba6d0..c7b80bce87a5 100644 --- a/toolchain/check/handle_match.cpp +++ b/toolchain/check/handle_match.cpp @@ -48,16 +48,6 @@ auto HandleParseNode(Context& context, Parse::MatchCaseGuardId node_id) return context.TODO(node_id, "HandleMatchCaseGuard"); } -auto HandleParseNode(Context& context, Parse::MatchCaseEqualGreaterId node_id) - -> bool { - return context.TODO(node_id, "HandleMatchCaseEqualGreater"); -} - -auto HandleParseNode(Context& context, Parse::MatchCaseStartId node_id) - -> bool { - return context.TODO(node_id, "HandleMatchCaseStart"); -} - auto HandleParseNode(Context& context, Parse::MatchCaseId node_id) -> bool { return context.TODO(node_id, "HandleMatchCase"); } @@ -67,20 +57,19 @@ auto HandleParseNode(Context& context, Parse::MatchDefaultIntroducerId node_id) return context.TODO(node_id, "MatchDefaultIntroducer"); } -auto HandleParseNode(Context& context, - Parse::MatchDefaultEqualGreaterId node_id) -> bool { - return context.TODO(node_id, "MatchDefaultEqualGreater"); -} - -auto HandleParseNode(Context& context, Parse::MatchDefaultStartId node_id) - -> bool { - return context.TODO(node_id, "HandleMatchDefaultStart"); -} - auto HandleParseNode(Context& context, Parse::MatchDefaultId node_id) -> bool { return context.TODO(node_id, "HandleMatchDefault"); } +auto HandleParseNode(Context& context, Parse::MatchHandlerStartId node_id) + -> bool { + return context.TODO(node_id, "HandleMatchHandlerStart"); +} + +auto HandleParseNode(Context& context, Parse::MatchHandlerId node_id) -> bool { + return context.TODO(node_id, "HandleMatchHandler"); +} + auto HandleParseNode(Context& context, Parse::MatchStatementId node_id) -> bool { return context.TODO(node_id, "HandleMatchStatement"); diff --git a/toolchain/check/node_stack.h b/toolchain/check/node_stack.h index f776e7a7c181..cc09e63b339e 100644 --- a/toolchain/check/node_stack.h +++ b/toolchain/check/node_stack.h @@ -513,18 +513,16 @@ class NodeStack { case Parse::NodeKind::InlineImportSpecifier: case Parse::NodeKind::InlineImportBody: case Parse::NodeKind::MatchCase: - case Parse::NodeKind::MatchCaseEqualGreater: case Parse::NodeKind::MatchCaseGuard: case Parse::NodeKind::MatchCaseGuardIntroducer: case Parse::NodeKind::MatchCaseGuardStart: case Parse::NodeKind::MatchCaseIntroducer: - case Parse::NodeKind::MatchCaseStart: case Parse::NodeKind::MatchCondition: case Parse::NodeKind::MatchConditionStart: case Parse::NodeKind::MatchDefault: - case Parse::NodeKind::MatchDefaultEqualGreater: case Parse::NodeKind::MatchDefaultIntroducer: - case Parse::NodeKind::MatchDefaultStart: + case Parse::NodeKind::MatchHandlerStart: + case Parse::NodeKind::MatchHandler: case Parse::NodeKind::MatchIntroducer: case Parse::NodeKind::MatchStatementStart: case Parse::NodeKind::NamespaceStart: diff --git a/toolchain/parse/handle_match.cpp b/toolchain/parse/handle_match.cpp index 08cd066fd4d8..053546867d2d 100644 --- a/toolchain/parse/handle_match.cpp +++ b/toolchain/parse/handle_match.cpp @@ -7,9 +7,8 @@ namespace Carbon::Parse { -static auto HandleStatementsBlockStart(Context& context, StateKind finish, - NodeKind equal_greater, NodeKind starter, - NodeKind complete) -> void { +static auto HandleMatchHandlerStart(Context& context, NodeKind label_kind) + -> void { auto state = context.PopState(); if (!context.PositionIs(Lex::TokenKind::EqualGreater)) { @@ -19,14 +18,16 @@ static auto HandleStatementsBlockStart(Context& context, StateKind finish, context.emitter().Emit(*context.position(), ExpectedMatchCaseArrow); } - context.AddLeafNode(equal_greater, *context.position(), /*has_error=*/true); - context.AddNode(starter, *context.position(), /*has_error=*/true); - context.AddNode(complete, *context.position(), /*has_error=*/true); + context.AddNode(label_kind, *context.position(), /*has_error=*/true); + context.AddNode(NodeKind::MatchHandlerStart, *context.position(), + /*has_error=*/true); + context.AddNode(NodeKind::MatchHandler, *context.position(), + /*has_error=*/true); context.SkipPastLikelyEnd(*context.position()); return; } - context.AddLeafNode(equal_greater, context.Consume()); + context.AddLeafNode(label_kind, context.Consume()); if (!context.PositionIs(Lex::TokenKind::OpenCurlyBrace)) { if (!state.has_error) { @@ -35,14 +36,17 @@ static auto HandleStatementsBlockStart(Context& context, StateKind finish, context.emitter().Emit(*context.position(), ExpectedMatchCaseBlock); } - context.AddNode(starter, *context.position(), /*has_error=*/true); - context.AddNode(complete, *context.position(), /*has_error=*/true); + context.AddNode(NodeKind::MatchHandlerStart, *context.position(), + /*has_error=*/true); + context.AddNode(NodeKind::MatchHandler, *context.position(), + /*has_error=*/true); context.SkipPastLikelyEnd(*context.position()); return; } - context.AddNode(starter, context.Consume(), state.has_error); - context.PushState(state, finish); + context.AddNode(NodeKind::MatchHandlerStart, context.Consume(), + state.has_error); + context.PushState(state, StateKind::MatchHandlerFinish); context.PushState(StateKind::StatementScopeLoop); } @@ -144,10 +148,12 @@ auto HandleMatchCaseIntroducer(Context& context) -> void { auto HandleMatchCaseAfterPattern(Context& context) -> void { auto state = context.PopState(); if (state.has_error) { - context.AddNode(NodeKind::MatchCaseStart, *context.position(), - /*has_error=*/true); context.AddNode(NodeKind::MatchCase, *context.position(), /*has_error=*/true); + context.AddNode(NodeKind::MatchHandlerStart, *context.position(), + /*has_error=*/true); + context.AddNode(NodeKind::MatchHandler, *context.position(), + /*has_error=*/true); context.SkipPastLikelyEnd(*context.position()); return; } @@ -175,10 +181,12 @@ auto HandleMatchCaseAfterPattern(Context& context) -> void { context.AddNode(NodeKind::MatchCaseGuard, *context.position(), /*has_error=*/true); state = context.PopState(); - context.AddNode(NodeKind::MatchCaseStart, *context.position(), - /*has_error=*/true); context.AddNode(NodeKind::MatchCase, *context.position(), /*has_error=*/true); + context.AddNode(NodeKind::MatchHandlerStart, *context.position(), + /*has_error=*/true); + context.AddNode(NodeKind::MatchHandler, *context.position(), + /*has_error=*/true); context.SkipPastLikelyEnd(*context.position()); return; } @@ -208,30 +216,18 @@ auto HandleMatchCaseGuardFinish(Context& context) -> void { } auto HandleMatchCaseStart(Context& context) -> void { - HandleStatementsBlockStart(context, StateKind::MatchCaseFinish, - NodeKind::MatchCaseEqualGreater, - NodeKind::MatchCaseStart, NodeKind::MatchCase); -} - -auto HandleMatchCaseFinish(Context& context) -> void { - auto state = context.PopState(); - context.AddNode(NodeKind::MatchCase, - context.ConsumeChecked(Lex::TokenKind::CloseCurlyBrace), - state.has_error); + HandleMatchHandlerStart(context, NodeKind::MatchCase); } auto HandleMatchDefaultIntroducer(Context& context) -> void { context.AddLeafNode(NodeKind::MatchDefaultIntroducer, context.Consume()); - HandleStatementsBlockStart(context, StateKind::MatchDefaultFinish, - NodeKind::MatchDefaultEqualGreater, - NodeKind::MatchDefaultStart, - NodeKind::MatchDefault); + HandleMatchHandlerStart(context, NodeKind::MatchDefault); } -auto HandleMatchDefaultFinish(Context& context) -> void { +auto HandleMatchHandlerFinish(Context& context) -> void { auto state = context.PopState(); - context.AddNode(NodeKind::MatchDefault, + context.AddNode(NodeKind::MatchHandler, context.ConsumeChecked(Lex::TokenKind::CloseCurlyBrace), state.has_error); } diff --git a/toolchain/parse/node_kind.def b/toolchain/parse/node_kind.def index 5b185de4492a..e2ecfa1981f3 100644 --- a/toolchain/parse/node_kind.def +++ b/toolchain/parse/node_kind.def @@ -417,13 +417,11 @@ CARBON_PARSE_NODE_KIND(MatchCaseIntroducer) CARBON_PARSE_NODE_KIND(MatchCaseGuardIntroducer) CARBON_PARSE_NODE_KIND(MatchCaseGuardStart) CARBON_PARSE_NODE_KIND(MatchCaseGuard) -CARBON_PARSE_NODE_KIND(MatchCaseEqualGreater) -CARBON_PARSE_NODE_KIND(MatchCaseStart) CARBON_PARSE_NODE_KIND(MatchCase) CARBON_PARSE_NODE_KIND(MatchDefaultIntroducer) -CARBON_PARSE_NODE_KIND(MatchDefaultEqualGreater) -CARBON_PARSE_NODE_KIND(MatchDefaultStart) CARBON_PARSE_NODE_KIND(MatchDefault) +CARBON_PARSE_NODE_KIND(MatchHandlerStart) +CARBON_PARSE_NODE_KIND(MatchHandler) #undef CARBON_PARSE_NODE_KIND #undef CARBON_PARSE_NODE_KIND_INFIX_OPERATOR diff --git a/toolchain/parse/state.def b/toolchain/parse/state.def index 3ce4f73761e8..31f44c3ccaf8 100644 --- a/toolchain/parse/state.def +++ b/toolchain/parse/state.def @@ -1817,7 +1817,7 @@ CARBON_PARSE_STATE(MatchCaseGuardFinish) // match (...) { case ... => {...} } // ^~~~ // 1. StatementScopeLoop -// 2. MatchCaseFinish +// 2. MatchHandlerFinish // // match (...) { case ... ??? } // ^ @@ -1828,19 +1828,12 @@ CARBON_PARSE_STATE(MatchCaseGuardFinish) // (state done) CARBON_PARSE_STATE(MatchCaseStart) -// Handles `match` case statements block closing `}`. -// -// match (...) { case ... => {...} } -// ^ -// (state done) -CARBON_PARSE_STATE(MatchCaseFinish) - // Handles `match` default introducer, `=>` and `{` opening statements block. // // match (...) { default => {...} } // ^~~~~~~~~~~~ // 1. StatementScopeLoop -// 2. MatchDefaultFinish +// 2. MatchHandlerFinish // // match (...) { default ??? } // ^ @@ -1851,12 +1844,16 @@ CARBON_PARSE_STATE(MatchCaseFinish) // (state done) CARBON_PARSE_STATE(MatchDefaultIntroducer) -// Handles `match` default case statements block closing `}`. +// Handles `match` handler block closing `}`. +// +// match (...) { case ... => {...} } +// ^ +// (state done) // // match (...) { default => {...} } // ^ // (state done) -CARBON_PARSE_STATE(MatchDefaultFinish) +CARBON_PARSE_STATE(MatchHandlerFinish) // Handles `match` cases after the `default` case. // diff --git a/toolchain/parse/testdata/auto/match_case.carbon b/toolchain/parse/testdata/auto/match_case.carbon index 54929b192e24..c91988e3fabd 100644 --- a/toolchain/parse/testdata/auto/match_case.carbon +++ b/toolchain/parse/testdata/auto/match_case.carbon @@ -30,29 +30,29 @@ fn f() -> bool { // CHECK:STDOUT: {kind: 'BoolLiteralTrue', text: 'true'}, // CHECK:STDOUT: {kind: 'MatchCondition', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'MatchStatementStart', text: '{', subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'}, -// CHECK:STDOUT: {kind: 'AutoTypeLiteral', text: 'auto'}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, -// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'x'}, -// CHECK:STDOUT: {kind: 'BoolLiteralTrue', text: 'true'}, -// CHECK:STDOUT: {kind: 'InfixOperatorEqualEqual', text: '==', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, -// CHECK:STDOUT: {kind: 'MatchCaseEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: '{', subtree_size: 12}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'}, +// CHECK:STDOUT: {kind: 'AutoTypeLiteral', text: 'auto'}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, +// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'x'}, +// CHECK:STDOUT: {kind: 'BoolLiteralTrue', text: 'true'}, +// CHECK:STDOUT: {kind: 'InfixOperatorEqualEqual', text: '==', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, +// CHECK:STDOUT: {kind: 'MatchCase', text: '=>', subtree_size: 11}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', subtree_size: 12}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'BoolLiteralTrue', text: 'true'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCase', text: '}', subtree_size: 16}, -// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, -// CHECK:STDOUT: {kind: 'MatchDefaultEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchDefaultStart', text: '{', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', subtree_size: 16}, +// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, +// CHECK:STDOUT: {kind: 'MatchDefault', text: '=>', subtree_size: 2}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', subtree_size: 3}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'BoolLiteralFalse', text: 'false'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchDefault', text: '}', subtree_size: 7}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', subtree_size: 7}, // CHECK:STDOUT: {kind: 'MatchStatement', text: '}', subtree_size: 29}, // CHECK:STDOUT: {kind: 'FunctionDefinition', text: '}', subtree_size: 37}, // CHECK:STDOUT: {kind: 'FileEnd', text: ''}, diff --git a/toolchain/parse/testdata/match/fail_cases_after_default.carbon b/toolchain/parse/testdata/match/fail_cases_after_default.carbon index d921b16dc369..1690c30b9d83 100644 --- a/toolchain/parse/testdata/match/fail_cases_after_default.carbon +++ b/toolchain/parse/testdata/match/fail_cases_after_default.carbon @@ -54,13 +54,13 @@ fn f() -> i32 { // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'x'}, // CHECK:STDOUT: {kind: 'MatchCondition', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'MatchStatementStart', text: '{', subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, -// CHECK:STDOUT: {kind: 'MatchDefaultEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchDefaultStart', text: '{', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, +// CHECK:STDOUT: {kind: 'MatchDefault', text: '=>', subtree_size: 2}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', subtree_size: 3}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '1'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchDefault', text: '}', subtree_size: 7}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', subtree_size: 7}, // CHECK:STDOUT: {kind: 'MatchStatement', text: '}', has_error: yes, subtree_size: 13}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, diff --git a/toolchain/parse/testdata/match/fail_missing_case_arrow.carbon b/toolchain/parse/testdata/match/fail_missing_case_arrow.carbon index 328261afb625..1c00728851d5 100644 --- a/toolchain/parse/testdata/match/fail_missing_case_arrow.carbon +++ b/toolchain/parse/testdata/match/fail_missing_case_arrow.carbon @@ -39,26 +39,26 @@ fn f() -> i32 { // CHECK:STDOUT: {kind: 'IntLiteral', text: '3'}, // CHECK:STDOUT: {kind: 'MatchCondition', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'MatchStatementStart', text: '{', subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'}, -// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseEqualGreater', text: '{', has_error: yes}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: '{', has_error: yes, subtree_size: 6}, -// CHECK:STDOUT: {kind: 'MatchCase', text: '{', has_error: yes, subtree_size: 7}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'}, -// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, -// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'x'}, -// CHECK:STDOUT: {kind: 'IntLiteral', text: '3'}, -// CHECK:STDOUT: {kind: 'InfixOperatorEqualEqual', text: '==', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, -// CHECK:STDOUT: {kind: 'MatchCaseEqualGreater', text: '{', has_error: yes}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: '{', has_error: yes, subtree_size: 12}, -// CHECK:STDOUT: {kind: 'MatchCase', text: '{', has_error: yes, subtree_size: 13}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'}, +// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCase', text: '{', has_error: yes, subtree_size: 5}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', has_error: yes, subtree_size: 6}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '{', has_error: yes, subtree_size: 7}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'}, +// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, +// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'x'}, +// CHECK:STDOUT: {kind: 'IntLiteral', text: '3'}, +// CHECK:STDOUT: {kind: 'InfixOperatorEqualEqual', text: '==', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, +// CHECK:STDOUT: {kind: 'MatchCase', text: '{', has_error: yes, subtree_size: 11}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', has_error: yes, subtree_size: 12}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '{', has_error: yes, subtree_size: 13}, // CHECK:STDOUT: {kind: 'MatchStatement', text: '}', subtree_size: 26}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, diff --git a/toolchain/parse/testdata/match/fail_missing_case_pattern.carbon b/toolchain/parse/testdata/match/fail_missing_case_pattern.carbon index ac96c378476f..036195cc6b7b 100644 --- a/toolchain/parse/testdata/match/fail_missing_case_pattern.carbon +++ b/toolchain/parse/testdata/match/fail_missing_case_pattern.carbon @@ -34,16 +34,17 @@ fn f() -> i32 { // CHECK:STDOUT: {kind: 'IntLiteral', text: '3'}, // CHECK:STDOUT: {kind: 'MatchCondition', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'MatchStatementStart', text: '{', subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: '=>', has_error: yes}, -// CHECK:STDOUT: {kind: 'InvalidParse', text: '=>', has_error: yes}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: '=>', has_error: yes, subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: '=>', has_error: yes, subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchCase', text: '=>', has_error: yes, subtree_size: 6}, -// CHECK:STDOUT: {kind: 'MatchStatement', text: '}', subtree_size: 12}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: '=>', has_error: yes}, +// CHECK:STDOUT: {kind: 'InvalidParse', text: '=>', has_error: yes}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: '=>', has_error: yes, subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCase', text: '=>', has_error: yes, subtree_size: 5}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '=>', has_error: yes, subtree_size: 6}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '=>', has_error: yes, subtree_size: 7}, +// CHECK:STDOUT: {kind: 'MatchStatement', text: '}', subtree_size: 13}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'FunctionDefinition', text: '}', subtree_size: 23}, +// CHECK:STDOUT: {kind: 'FunctionDefinition', text: '}', subtree_size: 24}, // CHECK:STDOUT: {kind: 'FileEnd', text: ''}, // CHECK:STDOUT: ] diff --git a/toolchain/parse/testdata/match/fail_missing_case_statements_block.carbon b/toolchain/parse/testdata/match/fail_missing_case_statements_block.carbon index 2630a5d7c0cc..093c26b81712 100644 --- a/toolchain/parse/testdata/match/fail_missing_case_statements_block.carbon +++ b/toolchain/parse/testdata/match/fail_missing_case_statements_block.carbon @@ -35,13 +35,13 @@ fn f() -> i32 { // CHECK:STDOUT: {kind: 'IntLiteral', text: '3'}, // CHECK:STDOUT: {kind: 'MatchCondition', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'MatchStatementStart', text: '{', subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'}, -// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: 'default', has_error: yes, subtree_size: 6}, -// CHECK:STDOUT: {kind: 'MatchCase', text: 'default', has_error: yes, subtree_size: 7}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'}, +// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCase', text: '=>', subtree_size: 5}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: 'default', has_error: yes, subtree_size: 6}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: 'default', has_error: yes, subtree_size: 7}, // CHECK:STDOUT: {kind: 'MatchStatement', text: '}', subtree_size: 13}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, diff --git a/toolchain/parse/testdata/match/fail_missing_default_arrow.carbon b/toolchain/parse/testdata/match/fail_missing_default_arrow.carbon index b16f59891a68..a3daefccdc48 100644 --- a/toolchain/parse/testdata/match/fail_missing_default_arrow.carbon +++ b/toolchain/parse/testdata/match/fail_missing_default_arrow.carbon @@ -34,10 +34,10 @@ fn f() -> i32 { // CHECK:STDOUT: {kind: 'IntLiteral', text: '3'}, // CHECK:STDOUT: {kind: 'MatchCondition', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'MatchStatementStart', text: '{', subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, -// CHECK:STDOUT: {kind: 'MatchDefaultEqualGreater', text: '{', has_error: yes}, -// CHECK:STDOUT: {kind: 'MatchDefaultStart', text: '{', has_error: yes, subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchDefault', text: '{', has_error: yes, subtree_size: 4}, +// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, +// CHECK:STDOUT: {kind: 'MatchDefault', text: '{', has_error: yes, subtree_size: 2}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', has_error: yes, subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '{', has_error: yes, subtree_size: 4}, // CHECK:STDOUT: {kind: 'MatchStatement', text: '}', subtree_size: 10}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, diff --git a/toolchain/parse/testdata/match/fail_missing_default_statements_block.carbon b/toolchain/parse/testdata/match/fail_missing_default_statements_block.carbon index 324f7a1f0ab1..12162d68b2dd 100644 --- a/toolchain/parse/testdata/match/fail_missing_default_statements_block.carbon +++ b/toolchain/parse/testdata/match/fail_missing_default_statements_block.carbon @@ -34,10 +34,10 @@ fn f() -> i32 { // CHECK:STDOUT: {kind: 'IntLiteral', text: '3'}, // CHECK:STDOUT: {kind: 'MatchCondition', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'MatchStatementStart', text: '{', subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, -// CHECK:STDOUT: {kind: 'MatchDefaultEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchDefaultStart', text: '}', has_error: yes, subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchDefault', text: '}', has_error: yes, subtree_size: 4}, +// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, +// CHECK:STDOUT: {kind: 'MatchDefault', text: '=>', subtree_size: 2}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '}', has_error: yes, subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', has_error: yes, subtree_size: 4}, // CHECK:STDOUT: {kind: 'MatchStatement', text: '}', subtree_size: 10}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, diff --git a/toolchain/parse/testdata/match/fail_missing_guard_close_paren.carbon b/toolchain/parse/testdata/match/fail_missing_guard_close_paren.carbon index 6f7beca8d2ed..c430f5683dcb 100644 --- a/toolchain/parse/testdata/match/fail_missing_guard_close_paren.carbon +++ b/toolchain/parse/testdata/match/fail_missing_guard_close_paren.carbon @@ -38,17 +38,17 @@ fn f() -> i32 { // CHECK:STDOUT: {kind: 'BoolLiteralTrue', text: 'true'}, // CHECK:STDOUT: {kind: 'MatchCondition', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'MatchStatementStart', text: '{', subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'}, -// CHECK:STDOUT: {kind: 'BoolTypeLiteral', text: 'bool'}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, -// CHECK:STDOUT: {kind: 'BoolLiteralFalse', text: 'false'}, -// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: '=>', has_error: yes, subtree_size: 4}, -// CHECK:STDOUT: {kind: 'MatchCaseEqualGreater', text: '}', has_error: yes}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: '}', has_error: yes, subtree_size: 10}, -// CHECK:STDOUT: {kind: 'MatchCase', text: '}', has_error: yes, subtree_size: 11}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'}, +// CHECK:STDOUT: {kind: 'BoolTypeLiteral', text: 'bool'}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, +// CHECK:STDOUT: {kind: 'BoolLiteralFalse', text: 'false'}, +// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: '=>', has_error: yes, subtree_size: 4}, +// CHECK:STDOUT: {kind: 'MatchCase', text: '}', has_error: yes, subtree_size: 9}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '}', has_error: yes, subtree_size: 10}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', has_error: yes, subtree_size: 11}, // CHECK:STDOUT: {kind: 'MatchStatement', text: '}', subtree_size: 17}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, diff --git a/toolchain/parse/testdata/match/fail_missing_guard_open_paren.carbon b/toolchain/parse/testdata/match/fail_missing_guard_open_paren.carbon index b3cff24908bf..4d4eb3ca4a84 100644 --- a/toolchain/parse/testdata/match/fail_missing_guard_open_paren.carbon +++ b/toolchain/parse/testdata/match/fail_missing_guard_open_paren.carbon @@ -38,20 +38,21 @@ fn f() -> i32 { // CHECK:STDOUT: {kind: 'BoolLiteralTrue', text: 'true'}, // CHECK:STDOUT: {kind: 'MatchCondition', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'MatchStatementStart', text: '{', subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'}, -// CHECK:STDOUT: {kind: 'BoolTypeLiteral', text: 'bool'}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: 'false', has_error: yes}, -// CHECK:STDOUT: {kind: 'InvalidParse', text: 'false', has_error: yes}, -// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: 'false', has_error: yes, subtree_size: 4}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: 'false', has_error: yes, subtree_size: 9}, -// CHECK:STDOUT: {kind: 'MatchCase', text: 'false', has_error: yes, subtree_size: 10}, -// CHECK:STDOUT: {kind: 'MatchStatement', text: '}', subtree_size: 16}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'}, +// CHECK:STDOUT: {kind: 'BoolTypeLiteral', text: 'bool'}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: 'false', has_error: yes}, +// CHECK:STDOUT: {kind: 'InvalidParse', text: 'false', has_error: yes}, +// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: 'false', has_error: yes, subtree_size: 4}, +// CHECK:STDOUT: {kind: 'MatchCase', text: 'false', has_error: yes, subtree_size: 9}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: 'false', has_error: yes, subtree_size: 10}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: 'false', has_error: yes, subtree_size: 11}, +// CHECK:STDOUT: {kind: 'MatchStatement', text: '}', subtree_size: 17}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'FunctionDefinition', text: '}', subtree_size: 27}, +// CHECK:STDOUT: {kind: 'FunctionDefinition', text: '}', subtree_size: 28}, // CHECK:STDOUT: {kind: 'FileEnd', text: ''}, // CHECK:STDOUT: ] diff --git a/toolchain/parse/testdata/match/fail_missing_guard_parens_only_parse_errors.carbon b/toolchain/parse/testdata/match/fail_missing_guard_parens_only_parse_errors.carbon index 01ef876473d0..08e3dfac1687 100644 --- a/toolchain/parse/testdata/match/fail_missing_guard_parens_only_parse_errors.carbon +++ b/toolchain/parse/testdata/match/fail_missing_guard_parens_only_parse_errors.carbon @@ -40,33 +40,34 @@ fn f() -> i32 { // CHECK:STDOUT: {kind: 'BoolLiteralTrue', text: 'true'}, // CHECK:STDOUT: {kind: 'MatchCondition', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'MatchStatementStart', text: '{', subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'}, -// CHECK:STDOUT: {kind: 'BoolTypeLiteral', text: 'bool'}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, -// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'x'}, -// CHECK:STDOUT: {kind: 'BoolLiteralFalse', text: 'false'}, -// CHECK:STDOUT: {kind: 'InfixOperatorEqualEqual', text: '==', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: '=>', has_error: yes, subtree_size: 6}, -// CHECK:STDOUT: {kind: 'MatchCaseEqualGreater', text: 'case', has_error: yes}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: 'case', has_error: yes, subtree_size: 12}, -// CHECK:STDOUT: {kind: 'MatchCase', text: 'case', has_error: yes, subtree_size: 13}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'z'}, -// CHECK:STDOUT: {kind: 'BoolTypeLiteral', text: 'bool'}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: 'true', has_error: yes}, -// CHECK:STDOUT: {kind: 'InvalidParse', text: 'true', has_error: yes}, -// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: 'true', has_error: yes, subtree_size: 4}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: 'true', has_error: yes, subtree_size: 9}, -// CHECK:STDOUT: {kind: 'MatchCase', text: 'true', has_error: yes, subtree_size: 10}, -// CHECK:STDOUT: {kind: 'MatchStatement', text: '}', subtree_size: 29}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'x'}, +// CHECK:STDOUT: {kind: 'BoolTypeLiteral', text: 'bool'}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, +// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'x'}, +// CHECK:STDOUT: {kind: 'BoolLiteralFalse', text: 'false'}, +// CHECK:STDOUT: {kind: 'InfixOperatorEqualEqual', text: '==', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: '=>', has_error: yes, subtree_size: 6}, +// CHECK:STDOUT: {kind: 'MatchCase', text: 'case', has_error: yes, subtree_size: 11}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: 'case', has_error: yes, subtree_size: 12}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: 'case', has_error: yes, subtree_size: 13}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'z'}, +// CHECK:STDOUT: {kind: 'BoolTypeLiteral', text: 'bool'}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: 'true', has_error: yes}, +// CHECK:STDOUT: {kind: 'InvalidParse', text: 'true', has_error: yes}, +// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: 'true', has_error: yes, subtree_size: 4}, +// CHECK:STDOUT: {kind: 'MatchCase', text: 'true', has_error: yes, subtree_size: 9}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: 'true', has_error: yes, subtree_size: 10}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: 'true', has_error: yes, subtree_size: 11}, +// CHECK:STDOUT: {kind: 'MatchStatement', text: '}', subtree_size: 30}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'FunctionDefinition', text: '}', subtree_size: 40}, +// CHECK:STDOUT: {kind: 'FunctionDefinition', text: '}', subtree_size: 41}, // CHECK:STDOUT: {kind: 'FileEnd', text: ''}, // CHECK:STDOUT: ] diff --git a/toolchain/parse/testdata/match/fail_missing_matched_expr.carbon b/toolchain/parse/testdata/match/fail_missing_matched_expr.carbon index d0a987b27136..9426fc96796d 100644 --- a/toolchain/parse/testdata/match/fail_missing_matched_expr.carbon +++ b/toolchain/parse/testdata/match/fail_missing_matched_expr.carbon @@ -34,13 +34,13 @@ fn f() -> i32 { // CHECK:STDOUT: {kind: 'InvalidParse', text: '{', has_error: yes}, // CHECK:STDOUT: {kind: 'MatchCondition', text: 'match', has_error: yes, subtree_size: 3}, // CHECK:STDOUT: {kind: 'MatchStatementStart', text: '{', subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, -// CHECK:STDOUT: {kind: 'MatchDefaultEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchDefaultStart', text: '{', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, +// CHECK:STDOUT: {kind: 'MatchDefault', text: '=>', subtree_size: 2}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', subtree_size: 3}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '1'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchDefault', text: '}', subtree_size: 7}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', subtree_size: 7}, // CHECK:STDOUT: {kind: 'MatchStatement', text: '}', subtree_size: 13}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, diff --git a/toolchain/parse/testdata/match/fail_unexpected_tokens_in_cases_block.carbon b/toolchain/parse/testdata/match/fail_unexpected_tokens_in_cases_block.carbon index c7ec31565e76..ec58bc12956c 100644 --- a/toolchain/parse/testdata/match/fail_unexpected_tokens_in_cases_block.carbon +++ b/toolchain/parse/testdata/match/fail_unexpected_tokens_in_cases_block.carbon @@ -75,45 +75,45 @@ fn f() -> i32 { // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'x'}, // CHECK:STDOUT: {kind: 'MatchCondition', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'MatchStatementStart', text: '{', subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'y'}, -// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, -// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'y'}, -// CHECK:STDOUT: {kind: 'IntLiteral', text: '2'}, -// CHECK:STDOUT: {kind: 'InfixOperatorGreater', text: '>', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, -// CHECK:STDOUT: {kind: 'MatchCaseEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: '{', subtree_size: 12}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'y'}, +// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, +// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'y'}, +// CHECK:STDOUT: {kind: 'IntLiteral', text: '2'}, +// CHECK:STDOUT: {kind: 'InfixOperatorGreater', text: '>', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, +// CHECK:STDOUT: {kind: 'MatchCase', text: '=>', subtree_size: 11}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', subtree_size: 12}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '1'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCase', text: '}', subtree_size: 16}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'z'}, -// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, -// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'z'}, -// CHECK:STDOUT: {kind: 'IntLiteral', text: '3'}, -// CHECK:STDOUT: {kind: 'InfixOperatorEqualEqual', text: '==', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, -// CHECK:STDOUT: {kind: 'MatchCaseEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: '{', subtree_size: 12}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', subtree_size: 16}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'z'}, +// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, +// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'z'}, +// CHECK:STDOUT: {kind: 'IntLiteral', text: '3'}, +// CHECK:STDOUT: {kind: 'InfixOperatorEqualEqual', text: '==', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, +// CHECK:STDOUT: {kind: 'MatchCase', text: '=>', subtree_size: 11}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', subtree_size: 12}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '3'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCase', text: '}', subtree_size: 16}, -// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, -// CHECK:STDOUT: {kind: 'MatchDefaultEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchDefaultStart', text: '{', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', subtree_size: 16}, +// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, +// CHECK:STDOUT: {kind: 'MatchDefault', text: '=>', subtree_size: 2}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', subtree_size: 3}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '3'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchDefault', text: '}', subtree_size: 7}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', subtree_size: 7}, // CHECK:STDOUT: {kind: 'MatchStatement', text: '}', has_error: yes, subtree_size: 45}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, diff --git a/toolchain/parse/testdata/match/match.carbon b/toolchain/parse/testdata/match/match.carbon index dcb60ab0af8b..64bbd67b8ac5 100644 --- a/toolchain/parse/testdata/match/match.carbon +++ b/toolchain/parse/testdata/match/match.carbon @@ -45,63 +45,63 @@ fn f() -> i32 { // CHECK:STDOUT: {kind: 'CallExpr', text: ')', subtree_size: 4}, // CHECK:STDOUT: {kind: 'MatchCondition', text: ')', subtree_size: 6}, // CHECK:STDOUT: {kind: 'MatchStatementStart', text: '{', subtree_size: 8}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'TuplePatternStart', text: '('}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'a'}, -// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'PatternListComma', text: ','}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'b'}, -// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'TuplePattern', text: ')', subtree_size: 9}, -// CHECK:STDOUT: {kind: 'MatchCaseEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: '{', subtree_size: 12}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'TuplePatternStart', text: '('}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'a'}, +// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'PatternListComma', text: ','}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'b'}, +// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'TuplePattern', text: ')', subtree_size: 9}, +// CHECK:STDOUT: {kind: 'MatchCase', text: '=>', subtree_size: 11}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', subtree_size: 12}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCase', text: '}', subtree_size: 16}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'TuplePatternStart', text: '('}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'a'}, -// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'TuplePattern', text: ')', subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, -// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'a'}, -// CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, -// CHECK:STDOUT: {kind: 'InfixOperatorLess', text: '<', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, -// CHECK:STDOUT: {kind: 'MatchCaseEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: '{', subtree_size: 14}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', subtree_size: 16}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'TuplePatternStart', text: '('}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'a'}, +// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'TuplePattern', text: ')', subtree_size: 5}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, +// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'a'}, +// CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, +// CHECK:STDOUT: {kind: 'InfixOperatorLess', text: '<', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, +// CHECK:STDOUT: {kind: 'MatchCase', text: '=>', subtree_size: 13}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', subtree_size: 14}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '2'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCase', text: '}', subtree_size: 18}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'a'}, -// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, -// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'a'}, -// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'x'}, -// CHECK:STDOUT: {kind: 'InfixOperatorExclaimEqual', text: '!=', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, -// CHECK:STDOUT: {kind: 'MatchCaseEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: '{', subtree_size: 12}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', subtree_size: 18}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'a'}, +// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, +// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'a'}, +// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'x'}, +// CHECK:STDOUT: {kind: 'InfixOperatorExclaimEqual', text: '!=', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, +// CHECK:STDOUT: {kind: 'MatchCase', text: '=>', subtree_size: 11}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', subtree_size: 12}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '3'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCase', text: '}', subtree_size: 16}, -// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, -// CHECK:STDOUT: {kind: 'MatchDefaultEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchDefaultStart', text: '{', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', subtree_size: 16}, +// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, +// CHECK:STDOUT: {kind: 'MatchDefault', text: '=>', subtree_size: 2}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', subtree_size: 3}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '4'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchDefault', text: '}', subtree_size: 7}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', subtree_size: 7}, // CHECK:STDOUT: {kind: 'MatchStatement', text: '}', subtree_size: 66}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, diff --git a/toolchain/parse/testdata/var/unused.carbon b/toolchain/parse/testdata/var/unused.carbon index 73287a6ea381..a13419341a77 100644 --- a/toolchain/parse/testdata/var/unused.carbon +++ b/toolchain/parse/testdata/var/unused.carbon @@ -331,67 +331,67 @@ var unused (unused y: i32) = (0,); // CHECK:STDOUT: {kind: 'CallExpr', text: ')', subtree_size: 4}, // CHECK:STDOUT: {kind: 'MatchCondition', text: ')', subtree_size: 6}, // CHECK:STDOUT: {kind: 'MatchStatementStart', text: '{', subtree_size: 8}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'TuplePatternStart', text: '('}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'a'}, -// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, -// CHECK:STDOUT: {kind: 'VarBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'PatternListComma', text: ','}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'b'}, -// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, -// CHECK:STDOUT: {kind: 'VarBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'TuplePattern', text: ')', subtree_size: 9}, -// CHECK:STDOUT: {kind: 'VariablePattern', text: 'var', subtree_size: 10}, -// CHECK:STDOUT: {kind: 'UnusedPattern', text: 'unused', subtree_size: 11}, -// CHECK:STDOUT: {kind: 'MatchCaseEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: '{', subtree_size: 14}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'TuplePatternStart', text: '('}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'a'}, +// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, +// CHECK:STDOUT: {kind: 'VarBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'PatternListComma', text: ','}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'b'}, +// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, +// CHECK:STDOUT: {kind: 'VarBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'TuplePattern', text: ')', subtree_size: 9}, +// CHECK:STDOUT: {kind: 'VariablePattern', text: 'var', subtree_size: 10}, +// CHECK:STDOUT: {kind: 'UnusedPattern', text: 'unused', subtree_size: 11}, +// CHECK:STDOUT: {kind: 'MatchCase', text: '=>', subtree_size: 13}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', subtree_size: 14}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCase', text: '}', subtree_size: 18}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'TuplePatternStart', text: '('}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'a'}, -// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, -// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'TuplePattern', text: ')', subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, -// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'a'}, -// CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, -// CHECK:STDOUT: {kind: 'InfixOperatorLess', text: '<', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, -// CHECK:STDOUT: {kind: 'MatchCaseEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: '{', subtree_size: 14}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', subtree_size: 18}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'TuplePatternStart', text: '('}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'a'}, +// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, +// CHECK:STDOUT: {kind: 'LetBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'TuplePattern', text: ')', subtree_size: 5}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, +// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'a'}, +// CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, +// CHECK:STDOUT: {kind: 'InfixOperatorLess', text: '<', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, +// CHECK:STDOUT: {kind: 'MatchCase', text: '=>', subtree_size: 13}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', subtree_size: 14}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '2'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCase', text: '}', subtree_size: 18}, -// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, -// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'a'}, -// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, -// CHECK:STDOUT: {kind: 'VarBindingPattern', text: ':', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'UnusedPattern', text: 'unused', subtree_size: 4}, -// CHECK:STDOUT: {kind: 'VariablePattern', text: 'var', subtree_size: 5}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, -// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, -// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'a'}, -// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'x'}, -// CHECK:STDOUT: {kind: 'InfixOperatorExclaimEqual', text: '!=', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, -// CHECK:STDOUT: {kind: 'MatchCaseEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchCaseStart', text: '{', subtree_size: 14}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', subtree_size: 18}, +// CHECK:STDOUT: {kind: 'MatchCaseIntroducer', text: 'case'}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeSignature', text: 'a'}, +// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, +// CHECK:STDOUT: {kind: 'VarBindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'UnusedPattern', text: 'unused', subtree_size: 4}, +// CHECK:STDOUT: {kind: 'VariablePattern', text: 'var', subtree_size: 5}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardIntroducer', text: 'if'}, +// CHECK:STDOUT: {kind: 'MatchCaseGuardStart', text: '('}, +// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'a'}, +// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'x'}, +// CHECK:STDOUT: {kind: 'InfixOperatorExclaimEqual', text: '!=', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchCaseGuard', text: ')', subtree_size: 6}, +// CHECK:STDOUT: {kind: 'MatchCase', text: '=>', subtree_size: 13}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', subtree_size: 14}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '3'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchCase', text: '}', subtree_size: 18}, -// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, -// CHECK:STDOUT: {kind: 'MatchDefaultEqualGreater', text: '=>'}, -// CHECK:STDOUT: {kind: 'MatchDefaultStart', text: '{', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', subtree_size: 18}, +// CHECK:STDOUT: {kind: 'MatchDefaultIntroducer', text: 'default'}, +// CHECK:STDOUT: {kind: 'MatchDefault', text: '=>', subtree_size: 2}, +// CHECK:STDOUT: {kind: 'MatchHandlerStart', text: '{', subtree_size: 3}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '4'}, // CHECK:STDOUT: {kind: 'ReturnStatement', text: ';', subtree_size: 3}, -// CHECK:STDOUT: {kind: 'MatchDefault', text: '}', subtree_size: 7}, +// CHECK:STDOUT: {kind: 'MatchHandler', text: '}', subtree_size: 7}, // CHECK:STDOUT: {kind: 'MatchStatement', text: '}', subtree_size: 70}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, diff --git a/toolchain/parse/typed_nodes.h b/toolchain/parse/typed_nodes.h index dbfb166d812e..495da810fb3d 100644 --- a/toolchain/parse/typed_nodes.h +++ b/toolchain/parse/typed_nodes.h @@ -904,48 +904,40 @@ struct MatchCaseGuard { Lex::CloseParenTokenIndex token; }; -using MatchCaseEqualGreater = - LeafNode; - -struct MatchCaseStart { - static constexpr auto Kind = NodeKind::MatchCaseStart.Define( - {.bracketed_by = MatchCaseIntroducer::Kind}); +struct MatchCase { + static constexpr auto Kind = + NodeKind::MatchCase.Define({.bracketed_by = MatchCaseIntroducer::Kind}); MatchCaseIntroducerId introducer; AnyPatternId pattern; std::optional guard; - MatchCaseEqualGreaterId equal_greater_token; - Lex::OpenCurlyBraceTokenIndex token; -}; - -struct MatchCase { - static constexpr auto Kind = - NodeKind::MatchCase.Define({.bracketed_by = MatchCaseStart::Kind}); - - MatchCaseStartId head; - llvm::SmallVector statements; - Lex::CloseCurlyBraceTokenIndex token; + Lex::EqualGreaterTokenIndex token; }; using MatchDefaultIntroducer = LeafNode; -using MatchDefaultEqualGreater = - LeafNode; -struct MatchDefaultStart { - static constexpr auto Kind = NodeKind::MatchDefaultStart.Define( - {.bracketed_by = MatchDefaultIntroducer::Kind, .child_count = 2}); +struct MatchDefault { + static constexpr auto Kind = NodeKind::MatchDefault.Define( + {.bracketed_by = MatchDefaultIntroducer::Kind, .child_count = 1}); MatchDefaultIntroducerId introducer; - MatchDefaultEqualGreaterId equal_greater_token; + Lex::EqualGreaterTokenIndex token; +}; + +struct MatchHandlerStart { + static constexpr auto Kind = + NodeKind::MatchHandlerStart.Define({.child_count = 1}); + + NodeIdOneOf label; Lex::OpenCurlyBraceTokenIndex token; }; -struct MatchDefault { +struct MatchHandler { static constexpr auto Kind = - NodeKind::MatchDefault.Define({.bracketed_by = MatchDefaultStart::Kind}); + NodeKind::MatchHandler.Define({.bracketed_by = MatchHandlerStart::Kind}); - MatchDefaultStartId introducer; + MatchHandlerStartId head; llvm::SmallVector statements; Lex::CloseCurlyBraceTokenIndex token; }; @@ -958,8 +950,7 @@ struct MatchStatement { MatchStatementStartId head; - llvm::SmallVector cases; - std::optional default_case; + llvm::SmallVector handlers; Lex::CloseCurlyBraceTokenIndex token; };