From b42612bcecfff8f9e6519d49756c6d6d9f036ce4 Mon Sep 17 00:00:00 2001 From: Jon Ross-Perkins Date: Wed, 3 Apr 2024 11:31:16 -0700 Subject: [PATCH] Change tuple/paren expr parsing to use placeholders. (#3849) I've been thinking about this since we decided to add placeholders in the parse tree. This allows a clearer division of work in check handling, where we were doing work for ExprOpenParen that's only necessary for tuples (splitting/renaming handle_paren.cpp accordingly). --- toolchain/check/handle_paren_expr.cpp | 22 +++++++++++++++++++ ...dle_paren.cpp => handle_tuple_literal.cpp} | 21 ++++-------------- toolchain/check/node_stack.h | 3 ++- toolchain/parse/handle_paren_expr.cpp | 11 +++++++--- toolchain/parse/node_kind.def | 13 ++++++----- .../basics/fail_paren_match_regression.carbon | 2 +- .../testdata/basics/function_call.carbon | 2 +- .../testdata/basics/numeric_literals.carbon | 4 ++-- toolchain/parse/testdata/basics/parens.carbon | 8 +++---- toolchain/parse/testdata/let/let_tuple.carbon | 2 +- .../testdata/member_access/compound.carbon | 4 ++-- .../operators/fail_precedence_assign.carbon | 4 ++-- .../operators/infix_with_paren_after.carbon | 2 +- .../operators/infix_with_paren_before.carbon | 2 +- .../operators/precedence_assign.carbon | 2 +- .../testdata/pointer/const_pointer.carbon | 4 ++-- ...e_instead_of_compound_member_access.carbon | 16 +++++++------- toolchain/parse/testdata/tuple/nested.carbon | 8 +++---- .../parse/testdata/tuple/two_entries.carbon | 4 ++-- toolchain/parse/testdata/var/var_tuple.carbon | 2 +- toolchain/parse/typed_nodes.h | 7 +++--- 21 files changed, 80 insertions(+), 63 deletions(-) create mode 100644 toolchain/check/handle_paren_expr.cpp rename toolchain/check/{handle_paren.cpp => handle_tuple_literal.cpp} (64%) diff --git a/toolchain/check/handle_paren_expr.cpp b/toolchain/check/handle_paren_expr.cpp new file mode 100644 index 000000000000..9137e3ea30af --- /dev/null +++ b/toolchain/check/handle_paren_expr.cpp @@ -0,0 +1,22 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#include "toolchain/check/context.h" + +namespace Carbon::Check { + +auto HandleParenExprStart(Context& /*context*/, + Parse::ParenExprStartId /*node_id*/) -> bool { + // The open paren is unused. + return true; +} + +auto HandleParenExpr(Context& context, Parse::ParenExprId node_id) -> bool { + // We re-push because the ParenExpr is valid for member expressions, whereas + // the child expression might not be. + context.node_stack().Push(node_id, context.node_stack().PopExpr()); + return true; +} + +} // namespace Carbon::Check diff --git a/toolchain/check/handle_paren.cpp b/toolchain/check/handle_tuple_literal.cpp similarity index 64% rename from toolchain/check/handle_paren.cpp rename to toolchain/check/handle_tuple_literal.cpp index 640ae4f381d1..6d2b231dcb7e 100644 --- a/toolchain/check/handle_paren.cpp +++ b/toolchain/check/handle_tuple_literal.cpp @@ -6,26 +6,13 @@ namespace Carbon::Check { -auto HandleExprOpenParen(Context& context, Parse::ExprOpenParenId node_id) - -> bool { +auto HandleTupleLiteralStart(Context& context, + Parse::TupleLiteralStartId node_id) -> bool { context.node_stack().Push(node_id); context.param_and_arg_refs_stack().Push(); return true; } -auto HandleParenExpr(Context& context, Parse::ParenExprId node_id) -> bool { - auto value_id = context.node_stack().PopExpr(); - - // This always is always pushed at the open paren. It's only used for tuples, - // not paren exprs, but we still need to clean up. - context.param_and_arg_refs_stack().PopAndDiscard(); - - context.node_stack() - .PopAndDiscardSoloNodeId(); - context.node_stack().Push(node_id, value_id); - return true; -} - auto HandleTupleLiteralComma(Context& context, Parse::TupleLiteralCommaId /*node_id*/) -> bool { context.param_and_arg_refs_stack().ApplyComma(); @@ -35,10 +22,10 @@ auto HandleTupleLiteralComma(Context& context, auto HandleTupleLiteral(Context& context, Parse::TupleLiteralId node_id) -> bool { auto refs_id = context.param_and_arg_refs_stack().EndAndPop( - Parse::NodeKind::ExprOpenParen); + Parse::NodeKind::TupleLiteralStart); context.node_stack() - .PopAndDiscardSoloNodeId(); + .PopAndDiscardSoloNodeId(); const auto& inst_block = context.inst_blocks().Get(refs_id); llvm::SmallVector type_ids; type_ids.reserve(inst_block.size()); diff --git a/toolchain/check/node_stack.h b/toolchain/check/node_stack.h index 421542b0923f..6458f78ccc4b 100644 --- a/toolchain/check/node_stack.h +++ b/toolchain/check/node_stack.h @@ -438,7 +438,6 @@ class NodeStack { case Parse::NodeKind::BuiltinName: case Parse::NodeKind::ClassIntroducer: case Parse::NodeKind::CodeBlockStart: - case Parse::NodeKind::ExprOpenParen: case Parse::NodeKind::FunctionIntroducer: case Parse::NodeKind::IfStatementElse: case Parse::NodeKind::ImplicitParamListStart: @@ -446,11 +445,13 @@ class NodeStack { case Parse::NodeKind::InterfaceIntroducer: case Parse::NodeKind::LetInitializer: case Parse::NodeKind::LetIntroducer: + case Parse::NodeKind::ParenExprStart: case Parse::NodeKind::QualifiedName: case Parse::NodeKind::ReturnedModifier: case Parse::NodeKind::ReturnStatementStart: case Parse::NodeKind::ReturnVarModifier: case Parse::NodeKind::StructLiteralOrStructTypeLiteralStart: + case Parse::NodeKind::TupleLiteralStart: case Parse::NodeKind::TuplePatternStart: case Parse::NodeKind::VariableInitializer: case Parse::NodeKind::VariableIntroducer: diff --git a/toolchain/parse/handle_paren_expr.cpp b/toolchain/parse/handle_paren_expr.cpp index f6e28ecd7c3e..7a495c465102 100644 --- a/toolchain/parse/handle_paren_expr.cpp +++ b/toolchain/parse/handle_paren_expr.cpp @@ -11,7 +11,7 @@ auto HandleOnlyParenExpr(Context& context) -> void { // Advance past the open paren. auto open_paren = context.ConsumeChecked(Lex::TokenKind::OpenParen); - context.AddLeafNode(NodeKind::ExprOpenParen, open_paren); + context.AddLeafNode(NodeKind::ParenExprStart, open_paren); state.token = open_paren; context.PushState(state, State::OnlyParenExprFinish); @@ -46,8 +46,9 @@ auto HandleOnlyParenExprFinish(Context& context) -> void { auto HandleParenExpr(Context& context) -> void { auto state = context.PopState(); - // Advance past the open paren. - context.AddLeafNode(NodeKind::ExprOpenParen, + // Advance past the open paren. The placeholder will be replaced at the end + // based on whether we determine this is a tuple or parenthesized expression. + context.AddLeafNode(NodeKind::Placeholder, context.ConsumeChecked(Lex::TokenKind::OpenParen)); if (context.PositionIs(Lex::TokenKind::CloseParen)) { @@ -96,12 +97,16 @@ auto HandleTupleLiteralElementFinish(Context& context) -> void { auto HandleParenExprFinish(Context& context) -> void { auto state = context.PopState(); + context.ReplacePlaceholderNode(state.subtree_start, NodeKind::ParenExprStart, + state.token); FinishParenExpr(context, state); } auto HandleTupleLiteralFinish(Context& context) -> void { auto state = context.PopState(); + context.ReplacePlaceholderNode(state.subtree_start, + NodeKind::TupleLiteralStart, state.token); context.AddNode(NodeKind::TupleLiteral, context.Consume(), state.subtree_start, state.has_error); } diff --git a/toolchain/parse/node_kind.def b/toolchain/parse/node_kind.def index f09905415b3e..cbb77ba5f102 100644 --- a/toolchain/parse/node_kind.def +++ b/toolchain/parse/node_kind.def @@ -450,12 +450,14 @@ CARBON_PARSE_NODE_KIND_CHILD_COUNT(IndexExprStart, 1, OpenSquareBracket) CARBON_PARSE_NODE_KIND_BRACKET(IndexExpr, IndexExprStart, CloseSquareBracket) // Parenthesized single expressions, such as `(2)`: -// ExprOpenParen +// ParenExprStart // _external_: expression // ParenExpr -// +CARBON_PARSE_NODE_KIND_CHILD_COUNT(ParenExprStart, 0, OpenParen) +CARBON_PARSE_NODE_KIND_BRACKET(ParenExpr, ParenExprStart, CloseParen) + // Tuples, such as `(1, 2)`: -// ExprOpenParen +// TupleLiteralStart // _external_: expression // TupleLiteralComma // _repeated_ @@ -463,10 +465,9 @@ CARBON_PARSE_NODE_KIND_BRACKET(IndexExpr, IndexExprStart, CloseSquareBracket) // // Expressions and TupleLiteralComma may repeat with TupleLiteralComma as a // separator. -CARBON_PARSE_NODE_KIND_CHILD_COUNT(ExprOpenParen, 0, OpenParen) -CARBON_PARSE_NODE_KIND_BRACKET(ParenExpr, ExprOpenParen, CloseParen) +CARBON_PARSE_NODE_KIND_CHILD_COUNT(TupleLiteralStart, 0, OpenParen) CARBON_PARSE_NODE_KIND_CHILD_COUNT(TupleLiteralComma, 0, Comma) -CARBON_PARSE_NODE_KIND_BRACKET(TupleLiteral, ExprOpenParen, CloseParen) +CARBON_PARSE_NODE_KIND_BRACKET(TupleLiteral, TupleLiteralStart, CloseParen) // Call expressions, such as `a()`: // _external_: expression diff --git a/toolchain/parse/testdata/basics/fail_paren_match_regression.carbon b/toolchain/parse/testdata/basics/fail_paren_match_regression.carbon index 54945f94f9b2..9ca9154bf6c5 100644 --- a/toolchain/parse/testdata/basics/fail_paren_match_regression.carbon +++ b/toolchain/parse/testdata/basics/fail_paren_match_regression.carbon @@ -25,7 +25,7 @@ var = (foo {}) // CHECK:STDOUT: {kind: 'InvalidParse', text: '=', has_error: yes}, // CHECK:STDOUT: {kind: 'BindingPattern', text: '=', has_error: yes, subtree_size: 3}, // CHECK:STDOUT: {kind: 'VariableInitializer', text: '='}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'foo'}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', has_error: yes, subtree_size: 3}, // CHECK:STDOUT: {kind: 'VariableDecl', text: ')', has_error: yes, subtree_size: 9}, diff --git a/toolchain/parse/testdata/basics/function_call.carbon b/toolchain/parse/testdata/basics/function_call.carbon index 33427709b67f..b8db6abae9ba 100644 --- a/toolchain/parse/testdata/basics/function_call.carbon +++ b/toolchain/parse/testdata/basics/function_call.carbon @@ -27,7 +27,7 @@ fn F() { // CHECK:STDOUT: {kind: 'IdentifierName', text: 'd'}, // CHECK:STDOUT: {kind: 'MemberAccessExpr', text: '.', subtree_size: 3}, // CHECK:STDOUT: {kind: 'CallExprComma', text: ','}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'e'}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'CallExpr', text: ')', subtree_size: 14}, diff --git a/toolchain/parse/testdata/basics/numeric_literals.carbon b/toolchain/parse/testdata/basics/numeric_literals.carbon index 1189daaaf651..3a7398440115 100644 --- a/toolchain/parse/testdata/basics/numeric_literals.carbon +++ b/toolchain/parse/testdata/basics/numeric_literals.carbon @@ -42,7 +42,7 @@ fn F() { // CHECK:STDOUT: {kind: 'ArrayExpr', text: ']', subtree_size: 5}, // CHECK:STDOUT: {kind: 'BindingPattern', text: ':', subtree_size: 7}, // CHECK:STDOUT: {kind: 'VariableInitializer', text: '='}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'TupleLiteralStart', text: '('}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '8'}, // CHECK:STDOUT: {kind: 'TupleLiteralComma', text: ','}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '9'}, @@ -64,7 +64,7 @@ fn F() { // CHECK:STDOUT: {kind: 'ArrayExpr', text: ']', subtree_size: 5}, // CHECK:STDOUT: {kind: 'BindingPattern', text: ':', subtree_size: 7}, // CHECK:STDOUT: {kind: 'VariableInitializer', text: '='}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'TupleLiteralStart', text: '('}, // CHECK:STDOUT: {kind: 'RealLiteral', text: '0.9'}, // CHECK:STDOUT: {kind: 'TupleLiteralComma', text: ','}, // CHECK:STDOUT: {kind: 'RealLiteral', text: '8.0'}, diff --git a/toolchain/parse/testdata/basics/parens.carbon b/toolchain/parse/testdata/basics/parens.carbon index cede02b71f40..65a4a51bec38 100644 --- a/toolchain/parse/testdata/basics/parens.carbon +++ b/toolchain/parse/testdata/basics/parens.carbon @@ -22,10 +22,10 @@ fn F(n: i32) -> i32 { // CHECK:STDOUT: {kind: 'ReturnType', text: '->', subtree_size: 2}, // CHECK:STDOUT: {kind: 'FunctionDefinitionStart', text: '{', subtree_size: 10}, // CHECK:STDOUT: {kind: 'ReturnStatementStart', text: 'return'}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'n'}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', subtree_size: 5}, diff --git a/toolchain/parse/testdata/let/let_tuple.carbon b/toolchain/parse/testdata/let/let_tuple.carbon index b636341c44b6..705242d1b99f 100644 --- a/toolchain/parse/testdata/let/let_tuple.carbon +++ b/toolchain/parse/testdata/let/let_tuple.carbon @@ -27,7 +27,7 @@ fn F() { // CHECK:STDOUT: {kind: 'BindingPattern', text: ':', subtree_size: 3}, // CHECK:STDOUT: {kind: 'TuplePattern', text: ')', subtree_size: 9}, // CHECK:STDOUT: {kind: 'LetInitializer', text: '='}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'TupleLiteralStart', text: '('}, // CHECK:STDOUT: {kind: 'StringLiteral', text: '"hello"'}, // CHECK:STDOUT: {kind: 'TupleLiteralComma', text: ','}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, diff --git a/toolchain/parse/testdata/member_access/compound.carbon b/toolchain/parse/testdata/member_access/compound.carbon index 5e80ae268e2a..f6ea610bec52 100644 --- a/toolchain/parse/testdata/member_access/compound.carbon +++ b/toolchain/parse/testdata/member_access/compound.carbon @@ -18,13 +18,13 @@ fn F() { // CHECK:STDOUT: {kind: 'TuplePattern', text: ')', subtree_size: 2}, // CHECK:STDOUT: {kind: 'FunctionDefinitionStart', text: '{', subtree_size: 5}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'a'}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'b'}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'MemberAccessExpr', text: '.', subtree_size: 5}, // CHECK:STDOUT: {kind: 'ExprStatement', text: ';', subtree_size: 6}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'a'}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'b'}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'PointerMemberAccessExpr', text: '->', subtree_size: 5}, diff --git a/toolchain/parse/testdata/operators/fail_precedence_assign.carbon b/toolchain/parse/testdata/operators/fail_precedence_assign.carbon index 3a24bfc0648f..1d0ce004fe43 100644 --- a/toolchain/parse/testdata/operators/fail_precedence_assign.carbon +++ b/toolchain/parse/testdata/operators/fail_precedence_assign.carbon @@ -47,12 +47,12 @@ fn F() { // CHECK:STDOUT: {kind: 'BindingPattern', text: ':', subtree_size: 3}, // CHECK:STDOUT: {kind: 'VariableDecl', text: ';', subtree_size: 5}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '1'}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'a'}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', has_error: yes, subtree_size: 3}, // CHECK:STDOUT: {kind: 'InfixOperatorPlus', text: '+', subtree_size: 5}, // CHECK:STDOUT: {kind: 'ExprStatement', text: ';', subtree_size: 6}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'BoolLiteralTrue', text: 'true'}, // CHECK:STDOUT: {kind: 'IfExprIf', text: 'if', subtree_size: 2}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'a'}, diff --git a/toolchain/parse/testdata/operators/infix_with_paren_after.carbon b/toolchain/parse/testdata/operators/infix_with_paren_after.carbon index 636444d291ba..134c15e76429 100644 --- a/toolchain/parse/testdata/operators/infix_with_paren_after.carbon +++ b/toolchain/parse/testdata/operators/infix_with_paren_after.carbon @@ -15,7 +15,7 @@ var n: i8 = 3*(n); // CHECK:STDOUT: {kind: 'BindingPattern', text: ':', subtree_size: 3}, // CHECK:STDOUT: {kind: 'VariableInitializer', text: '='}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '3'}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'n'}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'InfixOperatorStar', text: '*', subtree_size: 5}, diff --git a/toolchain/parse/testdata/operators/infix_with_paren_before.carbon b/toolchain/parse/testdata/operators/infix_with_paren_before.carbon index e9f2cad179e2..9822b77169a0 100644 --- a/toolchain/parse/testdata/operators/infix_with_paren_before.carbon +++ b/toolchain/parse/testdata/operators/infix_with_paren_before.carbon @@ -14,7 +14,7 @@ var n: i8 = (n)*3; // CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i8'}, // CHECK:STDOUT: {kind: 'BindingPattern', text: ':', subtree_size: 3}, // CHECK:STDOUT: {kind: 'VariableInitializer', text: '='}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'n'}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', subtree_size: 3}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '3'}, diff --git a/toolchain/parse/testdata/operators/precedence_assign.carbon b/toolchain/parse/testdata/operators/precedence_assign.carbon index 97a7801e40dc..aa1b5fbf2cd1 100644 --- a/toolchain/parse/testdata/operators/precedence_assign.carbon +++ b/toolchain/parse/testdata/operators/precedence_assign.carbon @@ -50,7 +50,7 @@ fn F(c: bool) { // CHECK:STDOUT: {kind: 'IfExprElse', text: 'else', subtree_size: 6}, // CHECK:STDOUT: {kind: 'InfixOperatorEqual', text: '=', subtree_size: 9}, // CHECK:STDOUT: {kind: 'ExprStatement', text: ';', subtree_size: 10}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'c'}, // CHECK:STDOUT: {kind: 'IfExprIf', text: 'if', subtree_size: 2}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'a'}, diff --git a/toolchain/parse/testdata/pointer/const_pointer.carbon b/toolchain/parse/testdata/pointer/const_pointer.carbon index 3c15a0e373ef..0c4f924e360d 100644 --- a/toolchain/parse/testdata/pointer/const_pointer.carbon +++ b/toolchain/parse/testdata/pointer/const_pointer.carbon @@ -30,7 +30,7 @@ fn C() -> const (i32*) { return C(); } // CHECK:STDOUT: {kind: 'IdentifierName', text: 'B'}, // CHECK:STDOUT: {kind: 'TuplePatternStart', text: '('}, // CHECK:STDOUT: {kind: 'TuplePattern', text: ')', subtree_size: 2}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, // CHECK:STDOUT: {kind: 'PrefixOperatorConst', text: 'const', subtree_size: 2}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', subtree_size: 4}, @@ -47,7 +47,7 @@ fn C() -> const (i32*) { return C(); } // CHECK:STDOUT: {kind: 'IdentifierName', text: 'C'}, // CHECK:STDOUT: {kind: 'TuplePatternStart', text: '('}, // CHECK:STDOUT: {kind: 'TuplePattern', text: ')', subtree_size: 2}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, // CHECK:STDOUT: {kind: 'PostfixOperatorStar', text: '*', subtree_size: 2}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', subtree_size: 4}, diff --git a/toolchain/parse/testdata/pointer/fail_tuple_instead_of_compound_member_access.carbon b/toolchain/parse/testdata/pointer/fail_tuple_instead_of_compound_member_access.carbon index b7eb61897f82..a3e939508792 100644 --- a/toolchain/parse/testdata/pointer/fail_tuple_instead_of_compound_member_access.carbon +++ b/toolchain/parse/testdata/pointer/fail_tuple_instead_of_compound_member_access.carbon @@ -62,49 +62,49 @@ fn F() { // CHECK:STDOUT: {kind: 'TuplePattern', text: ')', subtree_size: 2}, // CHECK:STDOUT: {kind: 'FunctionDefinitionStart', text: '{', subtree_size: 5}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'x'}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'InvalidParse', text: ')', has_error: yes}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', has_error: yes, subtree_size: 3}, // CHECK:STDOUT: {kind: 'MemberAccessExpr', text: '.', subtree_size: 5}, // CHECK:STDOUT: {kind: 'ExprStatement', text: ';', subtree_size: 6}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'y'}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '1'}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', has_error: yes, subtree_size: 3}, // CHECK:STDOUT: {kind: 'MemberAccessExpr', text: '.', subtree_size: 5}, // CHECK:STDOUT: {kind: 'ExprStatement', text: ';', subtree_size: 6}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'z'}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'a'}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', has_error: yes, subtree_size: 3}, // CHECK:STDOUT: {kind: 'MemberAccessExpr', text: '.', subtree_size: 5}, // CHECK:STDOUT: {kind: 'ExprStatement', text: ';', subtree_size: 6}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'w'}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'c'}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', has_error: yes, subtree_size: 3}, // CHECK:STDOUT: {kind: 'MemberAccessExpr', text: '.', subtree_size: 5}, // CHECK:STDOUT: {kind: 'ExprStatement', text: ';', subtree_size: 6}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'v'}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'InvalidParse', text: ')', has_error: yes}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', has_error: yes, subtree_size: 3}, // CHECK:STDOUT: {kind: 'PointerMemberAccessExpr', text: '->', subtree_size: 5}, // CHECK:STDOUT: {kind: 'ExprStatement', text: ';', subtree_size: 6}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'u'}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'f'}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', has_error: yes, subtree_size: 3}, // CHECK:STDOUT: {kind: 'PointerMemberAccessExpr', text: '->', subtree_size: 5}, // CHECK:STDOUT: {kind: 'ExprStatement', text: ';', subtree_size: 6}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 't'}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '2'}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', has_error: yes, subtree_size: 3}, // CHECK:STDOUT: {kind: 'PointerMemberAccessExpr', text: '->', subtree_size: 5}, // CHECK:STDOUT: {kind: 'ExprStatement', text: ';', subtree_size: 6}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 's'}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'ParenExprStart', text: '('}, // CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'g'}, // CHECK:STDOUT: {kind: 'ParenExpr', text: ')', has_error: yes, subtree_size: 3}, // CHECK:STDOUT: {kind: 'PointerMemberAccessExpr', text: '->', subtree_size: 5}, diff --git a/toolchain/parse/testdata/tuple/nested.carbon b/toolchain/parse/testdata/tuple/nested.carbon index 6dfdf4bd942f..0e2ef9ad6db5 100644 --- a/toolchain/parse/testdata/tuple/nested.carbon +++ b/toolchain/parse/testdata/tuple/nested.carbon @@ -11,14 +11,14 @@ var y: ((), (), ()); // CHECK:STDOUT: {kind: 'FileStart', text: ''}, // CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'}, // CHECK:STDOUT: {kind: 'IdentifierName', text: 'y'}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'TupleLiteralStart', text: '('}, +// CHECK:STDOUT: {kind: 'TupleLiteralStart', text: '('}, // CHECK:STDOUT: {kind: 'TupleLiteral', text: ')', subtree_size: 2}, // CHECK:STDOUT: {kind: 'TupleLiteralComma', text: ','}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'TupleLiteralStart', text: '('}, // CHECK:STDOUT: {kind: 'TupleLiteral', text: ')', subtree_size: 2}, // CHECK:STDOUT: {kind: 'TupleLiteralComma', text: ','}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'TupleLiteralStart', text: '('}, // CHECK:STDOUT: {kind: 'TupleLiteral', text: ')', subtree_size: 2}, // CHECK:STDOUT: {kind: 'TupleLiteral', text: ')', subtree_size: 10}, // CHECK:STDOUT: {kind: 'BindingPattern', text: ':', subtree_size: 12}, diff --git a/toolchain/parse/testdata/tuple/two_entries.carbon b/toolchain/parse/testdata/tuple/two_entries.carbon index 9ff4fe7e02db..d28b2fdbbd56 100644 --- a/toolchain/parse/testdata/tuple/two_entries.carbon +++ b/toolchain/parse/testdata/tuple/two_entries.carbon @@ -11,14 +11,14 @@ var x: (i32, i32) = (1, 2); // CHECK:STDOUT: {kind: 'FileStart', text: ''}, // CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'}, // CHECK:STDOUT: {kind: 'IdentifierName', text: 'x'}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'TupleLiteralStart', text: '('}, // CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, // CHECK:STDOUT: {kind: 'TupleLiteralComma', text: ','}, // CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, // CHECK:STDOUT: {kind: 'TupleLiteral', text: ')', subtree_size: 5}, // CHECK:STDOUT: {kind: 'BindingPattern', text: ':', subtree_size: 7}, // CHECK:STDOUT: {kind: 'VariableInitializer', text: '='}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'TupleLiteralStart', text: '('}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '1'}, // CHECK:STDOUT: {kind: 'TupleLiteralComma', text: ','}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '2'}, diff --git a/toolchain/parse/testdata/var/var_tuple.carbon b/toolchain/parse/testdata/var/var_tuple.carbon index e273e0c2818f..64c3c815db75 100644 --- a/toolchain/parse/testdata/var/var_tuple.carbon +++ b/toolchain/parse/testdata/var/var_tuple.carbon @@ -27,7 +27,7 @@ fn F() { // CHECK:STDOUT: {kind: 'BindingPattern', text: ':', subtree_size: 3}, // CHECK:STDOUT: {kind: 'TuplePattern', text: ')', subtree_size: 9}, // CHECK:STDOUT: {kind: 'VariableInitializer', text: '='}, -// CHECK:STDOUT: {kind: 'ExprOpenParen', text: '('}, +// CHECK:STDOUT: {kind: 'TupleLiteralStart', text: '('}, // CHECK:STDOUT: {kind: 'StringLiteral', text: '"hello"'}, // CHECK:STDOUT: {kind: 'TupleLiteralComma', text: ','}, // CHECK:STDOUT: {kind: 'IntLiteral', text: '0'}, diff --git a/toolchain/parse/typed_nodes.h b/toolchain/parse/typed_nodes.h index a1537f6310dd..8efd67e2a940 100644 --- a/toolchain/parse/typed_nodes.h +++ b/toolchain/parse/typed_nodes.h @@ -630,17 +630,18 @@ struct IndexExpr { AnyExprId index; }; -using ExprOpenParen = LeafNode; +using ParenExprStart = LeafNode; // A parenthesized expression: `(a)`. struct ParenExpr { static constexpr auto Kind = NodeKind::ParenExpr.Define(NodeCategory::Expr | NodeCategory::MemberExpr); - ExprOpenParenId left_paren; + ParenExprStartId start; AnyExprId expr; }; +using TupleLiteralStart = LeafNode; using TupleLiteralComma = LeafNode; // A tuple literal: `()`, `(a, b, c)`, or `(a,)`. @@ -648,7 +649,7 @@ struct TupleLiteral { static constexpr auto Kind = NodeKind::TupleLiteral.Define(NodeCategory::Expr); - ExprOpenParenId left_paren; + TupleLiteralStartId start; CommaSeparatedList elements; };