Move child count and bracketing information for parse nodes into the node kind definition. (#4000)

Instead of tracking the bracketing and child count information in the
kind macro in `node_kind.def`, provide it to `NodeKind::Define` in
`typed_nodes.h`. If a node is both bracketed and has a fixed child
count, track both facts and check them both in tree verification, since
it's easy to do so now.

The overall goal here is to reduce `node_kind.def` down to a simple list
of names. I have a slightly different approach in mind for the token
kinds.

---------

Co-authored-by: Jon Ross-Perkins <jperkins@google.com>
Co-authored-by: Carbon Infra Bot <carbon-external-infra@google.com>
This commit is contained in:
Richard Smith
2024-05-29 20:57:51 +00:00
committed by GitHub
co-authored by Jon Ross-Perkins Carbon Infra Bot
parent 512583d744
commit 419d2e39d8
5 changed files with 475 additions and 385 deletions
+182 -227
View File
@@ -10,12 +10,8 @@
// Supported x-macros are:
// - CARBON_PARSE_NODE_KIND(Name)
// Used as a fallback if other macros are missing.
// - CARBON_PARSE_NODE_KIND_BRACKET(Name, BracketName, LexTokenKind)
// Defines a bracketed node kind. BracketName should refer to the node
// kind that is the _start_ of the bracketed range.
// - CARBON_PARSE_NODE_KIND_CHILD_COUNT(Name, ChildCount, LexTokenKind)
// Defines a parse node with a set number of children, often 0. This count
// must be correct even when the node contains errors.
// - CARBON_PARSE_NODE_KIND_WITH_TOKEN(Name, LexTokenKind)
// Defines a parse node kind and specifies its corresponding token kind.
// - CARBON_PARSE_NODE_KIND_PREFIX_OPERATOR(Name)
// Defines a parse node for a prefix operator, with the Name as token.
// - CARBON_PARSE_NODE_KIND_INFIX_OPERATOR(Name)
@@ -39,22 +35,18 @@
// This tree represents the subset relationship between these macros, where if a
// specific x-macro isn't defined, it'll fall back to the parent macro.
//
// Parse nodes are clustered based on language feature. Comments will show their
// relationship in postorder, using indentation for child node relationships.
// Parse nodes are clustered based on language feature. See typed_nodes.h for
// the expected tree structure under each node kind.
#if !(defined(CARBON_PARSE_NODE_KIND) || \
(defined(CARBON_PARSE_NODE_KIND_BRACKET) && \
defined(CARBON_PARSE_NODE_KIND_CHILD_COUNT)))
#if !(defined(CARBON_PARSE_NODE_KIND) || \
defined(CARBON_PARSE_NODE_KIND_WITH_TOKEN))
#error "Must define CARBON_PARSE_NODE_KIND family x-macros to use this file."
#endif
// The BRACKET and CHILD_COUNT macros will use CARBON_PARSE_NODE_KIND by default
// when undefined.
#ifndef CARBON_PARSE_NODE_KIND_BRACKET
#define CARBON_PARSE_NODE_KIND_BRACKET(Name, ...) CARBON_PARSE_NODE_KIND(Name)
#endif
#ifndef CARBON_PARSE_NODE_KIND_CHILD_COUNT
#define CARBON_PARSE_NODE_KIND_CHILD_COUNT(Name, ...) \
// The WITH_TOKEN macro will use CARBON_PARSE_NODE_KIND by default when
// undefined.
#ifndef CARBON_PARSE_NODE_KIND_WITH_TOKEN
#define CARBON_PARSE_NODE_KIND_WITH_TOKEN(Name, LexTokenKind) \
CARBON_PARSE_NODE_KIND(Name)
#endif
@@ -65,7 +57,7 @@
// #define CARBON_PARSE_NODE_KIND_PREFIX_OPERATOR(Name, ...) <code>
#ifndef CARBON_PARSE_NODE_KIND_PREFIX_OPERATOR
#define CARBON_PARSE_NODE_KIND_PREFIX_OPERATOR(Name) \
CARBON_PARSE_NODE_KIND_CHILD_COUNT(PrefixOperator##Name, 1, Name)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(PrefixOperator##Name, Name)
#endif
// This is expected to be used with something like:
@@ -75,7 +67,7 @@
// #define CARBON_PARSE_NODE_KIND_INFIX_OPERATOR(Name, ...) <code>
#ifndef CARBON_PARSE_NODE_KIND_INFIX_OPERATOR
#define CARBON_PARSE_NODE_KIND_INFIX_OPERATOR(Name) \
CARBON_PARSE_NODE_KIND_CHILD_COUNT(InfixOperator##Name, 2, Name)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(InfixOperator##Name, Name)
#endif
// This is expected to be used with something like:
@@ -85,7 +77,7 @@
// #define CARBON_PARSE_NODE_KIND_POSTFIX_OPERATOR(Name, ...) <code>
#ifndef CARBON_PARSE_NODE_KIND_POSTFIX_OPERATOR
#define CARBON_PARSE_NODE_KIND_POSTFIX_OPERATOR(Name) \
CARBON_PARSE_NODE_KIND_CHILD_COUNT(PostfixOperator##Name, 1, Name)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(PostfixOperator##Name, Name)
#endif
// This is expected to be used with something like:
@@ -95,7 +87,7 @@
// #define CARBON_PARSE_NODE_KIND_TOKEN_LITERAL(Name, ...) <code>
#ifndef CARBON_PARSE_NODE_KIND_TOKEN_LITERAL
#define CARBON_PARSE_NODE_KIND_TOKEN_LITERAL(Name, LexTokenKinds) \
CARBON_PARSE_NODE_KIND_CHILD_COUNT(Name, 0, LexTokenKinds)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(Name, LexTokenKinds)
#endif
// This is expected to be used with something like:
@@ -105,49 +97,48 @@
// #define CARBON_PARSE_NODE_KIND_TOKEN_MODIFIER(Name, ...) <code>
#ifndef CARBON_PARSE_NODE_KIND_TOKEN_MODIFIER
#define CARBON_PARSE_NODE_KIND_TOKEN_MODIFIER(Name) \
CARBON_PARSE_NODE_KIND_CHILD_COUNT(Name##Modifier, 0, Name)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(Name##Modifier, Name)
#endif
// The start of the file.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(FileStart, 0, FileStart)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(FileStart, FileStart)
// The end of the file.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(FileEnd, 0, FileEnd)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(FileEnd, FileEnd)
// An invalid parse. Used to balance the parse tree. Always has an error.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(InvalidParse, 0, Error)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(InvalidParse, Error)
// An invalid subtree. Always has an error.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(InvalidParseStart, 0, Error)
CARBON_PARSE_NODE_KIND_BRACKET(InvalidParseSubtree, InvalidParseStart, Error)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(InvalidParseStart, Error)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(InvalidParseSubtree, Error)
// A placeholder node to be replaced; it will never exist in a valid parse tree.
// Its token kind is not enforced even when valid.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(Placeholder, 0, Error)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(Placeholder, Error)
// An empty declaration, such as `;`.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(EmptyDecl, 0, CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(EmptyDecl, CARBON_IF_VALID(Semi))
// An identifier name in a non-expression context, such as a declaration.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(IdentifierName, 0,
CARBON_IF_VALID(Identifier))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(IdentifierName, CARBON_IF_VALID(Identifier))
// An identifier name in an expression context.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(IdentifierNameExpr, 0, Identifier)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(IdentifierNameExpr, Identifier)
// The `self` value and `Self` type identifier keywords. Typically of the form
// `self: Self`.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(SelfValueName, 0, SelfValueIdentifier)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(SelfValueNameExpr, 0, SelfValueIdentifier)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(SelfTypeNameExpr, 0, SelfTypeIdentifier)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(SelfValueName, SelfValueIdentifier)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(SelfValueNameExpr, SelfValueIdentifier)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(SelfTypeNameExpr, SelfTypeIdentifier)
// The `base` value keyword, introduced by `base: B`. Typically referenced in
// an expression, as in `x.base` or `{.base = ...}`, but can also be used as a
// declared name, as in `{.base: partial B}`.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(BaseName, 0, Base)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(BaseName, Base)
// The `package` keyword in an expression.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(PackageExpr, 0, Package)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(PackageExpr, Package)
// ----------------------------------------------------------------------------
@@ -177,8 +168,8 @@ CARBON_PARSE_NODE_KIND_CHILD_COUNT(PackageExpr, 0, Package)
// ----------------------------------------------------------------------------
// The name of a package or library for `package`, `import`, and `library`.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(PackageName, 0, Identifier)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(LibraryName, 0, StringLiteral)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(PackageName, Identifier)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(LibraryName, StringLiteral)
// `package`:
// PackageIntroducer
@@ -186,9 +177,8 @@ CARBON_PARSE_NODE_KIND_CHILD_COUNT(LibraryName, 0, StringLiteral)
// _optional_ _external_: PackageName
// _optional_ _external_: LibrarySpecifier
// PackageDecl
CARBON_PARSE_NODE_KIND_CHILD_COUNT(PackageIntroducer, 0, Package)
CARBON_PARSE_NODE_KIND_BRACKET(PackageDecl, PackageIntroducer,
CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(PackageIntroducer, Package)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(PackageDecl, CARBON_IF_VALID(Semi))
// `import`:
// ImportIntroducer
@@ -196,24 +186,22 @@ CARBON_PARSE_NODE_KIND_BRACKET(PackageDecl, PackageIntroducer,
// _optional_ _external_: PackageName
// _optional_ _external_: LibrarySpecifier
// ImportDecl
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ImportIntroducer, 0, Import)
CARBON_PARSE_NODE_KIND_BRACKET(ImportDecl, ImportIntroducer,
CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ImportIntroducer, Import)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ImportDecl, CARBON_IF_VALID(Semi))
// `library` as declaration:
// LibraryIntroducer
// _repeated_ _external_: modifier
// DefaultLibrary or _external_: LibraryName
// LibraryDecl
CARBON_PARSE_NODE_KIND_CHILD_COUNT(DefaultLibrary, 0, Default)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(LibraryIntroducer, 0, Library)
CARBON_PARSE_NODE_KIND_BRACKET(LibraryDecl, LibraryIntroducer,
CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(DefaultLibrary, Default)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(LibraryIntroducer, Library)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(LibraryDecl, CARBON_IF_VALID(Semi))
// `library` in `package` or `import`:
// _external_: LibraryName or DefaultLibrary
// LibrarySpecifier
CARBON_PARSE_NODE_KIND_CHILD_COUNT(LibrarySpecifier, 1, Library)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(LibrarySpecifier, Library)
// Declaration names.
//
@@ -227,33 +215,30 @@ CARBON_PARSE_NODE_KIND_CHILD_COUNT(LibrarySpecifier, 1, Library)
// _optional_ _external_: ImplicitParamList
// _optional_ _external_: TuplePattern
// NameQualifier
CARBON_PARSE_NODE_KIND_BRACKET(NameQualifier, IdentifierName,
CARBON_IF_VALID(Period))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(NameQualifier, CARBON_IF_VALID(Period))
// `export`:
// ExportIntroducer
// _external_: _declaration name_
// ExportDecl
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ExportIntroducer, 0, Export)
CARBON_PARSE_NODE_KIND_BRACKET(ExportDecl, ExportIntroducer,
CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ExportIntroducer, Export)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ExportDecl, CARBON_IF_VALID(Semi))
// `namespace`:
// NamespaceStart
// _repeated_ _external_: modifier
// _external_: _declaration name_
// Namespace
CARBON_PARSE_NODE_KIND_CHILD_COUNT(NamespaceStart, 0, Namespace)
CARBON_PARSE_NODE_KIND_BRACKET(Namespace, NamespaceStart, CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(NamespaceStart, Namespace)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(Namespace, CARBON_IF_VALID(Semi))
// A code block:
// CodeBlockStart
// _repeated_ _external_: statement
// CodeBlock
CARBON_PARSE_NODE_KIND_CHILD_COUNT(CodeBlockStart, 0,
CARBON_IF_VALID(OpenCurlyBrace))
CARBON_PARSE_NODE_KIND_BRACKET(CodeBlock, CodeBlockStart,
CARBON_IF_VALID(CloseCurlyBrace))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(CodeBlockStart,
CARBON_IF_VALID(OpenCurlyBrace))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(CodeBlock, CARBON_IF_VALID(CloseCurlyBrace))
// `fn` declarations start with a function signature:
//
@@ -277,20 +262,15 @@ CARBON_PARSE_NODE_KIND_BRACKET(CodeBlock, CodeBlockStart,
// BuiltinFunctionDefinitionStart
// BuiltinName
// BuiltinFunctionDefinition
CARBON_PARSE_NODE_KIND_CHILD_COUNT(FunctionIntroducer, 0, Fn)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ReturnType, 1, MinusGreater)
CARBON_PARSE_NODE_KIND_BRACKET(FunctionDefinitionStart, FunctionIntroducer,
OpenCurlyBrace)
CARBON_PARSE_NODE_KIND_BRACKET(FunctionDefinition, FunctionDefinitionStart,
CloseCurlyBrace)
CARBON_PARSE_NODE_KIND_BRACKET(FunctionDecl, FunctionIntroducer,
CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_BRACKET(BuiltinFunctionDefinitionStart,
FunctionIntroducer, Equal)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(BuiltinName, 0, StringLiteral)
CARBON_PARSE_NODE_KIND_BRACKET(BuiltinFunctionDefinition,
BuiltinFunctionDefinitionStart,
CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(FunctionIntroducer, Fn)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ReturnType, MinusGreater)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(FunctionDefinitionStart, OpenCurlyBrace)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(FunctionDefinition, CloseCurlyBrace)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(FunctionDecl, CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(BuiltinFunctionDefinitionStart, Equal)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(BuiltinName, StringLiteral)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(BuiltinFunctionDefinition,
CARBON_IF_VALID(Semi))
// `alias`:
// AliasIntroducer
@@ -299,9 +279,9 @@ CARBON_PARSE_NODE_KIND_BRACKET(BuiltinFunctionDefinition,
// AliasInitializer
// _external_: expression
// Alias
CARBON_PARSE_NODE_KIND_CHILD_COUNT(AliasIntroducer, 0, Alias)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(AliasInitializer, 0, Equal)
CARBON_PARSE_NODE_KIND_BRACKET(Alias, AliasIntroducer, CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(AliasIntroducer, Alias)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(AliasInitializer, Equal)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(Alias, CARBON_IF_VALID(Semi))
// A tuple pattern:
// TuplePatternStart
@@ -312,9 +292,9 @@ CARBON_PARSE_NODE_KIND_BRACKET(Alias, AliasIntroducer, CARBON_IF_VALID(Semi))
//
// Patterns and PatternListComma may repeat with PatternListComma as a
// separator.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(TuplePatternStart, 0, OpenParen)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(PatternListComma, 0, Comma)
CARBON_PARSE_NODE_KIND_BRACKET(TuplePattern, TuplePatternStart, CloseParen)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(TuplePatternStart, OpenParen)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(PatternListComma, Comma)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(TuplePattern, CloseParen)
// An implicit parameter list:
// ImplicitParamListStart
@@ -325,9 +305,8 @@ CARBON_PARSE_NODE_KIND_BRACKET(TuplePattern, TuplePatternStart, CloseParen)
//
// Patterns and PatternListComma may repeat with PatternListComma as a
// separator.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ImplicitParamListStart, 0, OpenSquareBracket)
CARBON_PARSE_NODE_KIND_BRACKET(ImplicitParamList, ImplicitParamListStart,
CloseSquareBracket)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ImplicitParamListStart, OpenSquareBracket)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ImplicitParamList, CloseSquareBracket)
// An array type, such as `[i32; 3]` or `[i32;]`:
// ArrayExprStart
@@ -335,9 +314,9 @@ CARBON_PARSE_NODE_KIND_BRACKET(ImplicitParamList, ImplicitParamListStart,
// ArrayExprSemi
// _optional_ _external_: expression
// ArrayExpr
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ArrayExprStart, 0, OpenSquareBracket)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ArrayExprSemi, 2, CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_BRACKET(ArrayExpr, ArrayExprSemi, CloseSquareBracket)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ArrayExprStart, OpenSquareBracket)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ArrayExprSemi, CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ArrayExpr, CloseSquareBracket)
// A binding pattern, such as `name: Type`:
// IdentifierName or SelfValueName
@@ -345,10 +324,10 @@ CARBON_PARSE_NODE_KIND_BRACKET(ArrayExpr, ArrayExprSemi, CloseSquareBracket)
// [Generic]BindingPattern
// _optional_ Addr
// _optional_ Template
CARBON_PARSE_NODE_KIND_CHILD_COUNT(BindingPattern, 2, CARBON_IF_VALID(Colon))
CARBON_PARSE_NODE_KIND_CHILD_COUNT(CompileTimeBindingPattern, 2, ColonExclaim)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(Addr, 1, Addr)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(Template, 1, Template)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(BindingPattern, CARBON_IF_VALID(Colon))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(CompileTimeBindingPattern, ColonExclaim)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(Addr, Addr)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(Template, Template)
// `let` declarations, including associated constant declarations:
// LetIntroducer
@@ -363,9 +342,9 @@ CARBON_PARSE_NODE_KIND_CHILD_COUNT(Template, 1, Template)
//
// The LetInitializer and following expression are paired: either both will be
// present, or neither will.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(LetIntroducer, 0, Let)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(LetInitializer, 0, Equal)
CARBON_PARSE_NODE_KIND_BRACKET(LetDecl, LetIntroducer, CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(LetIntroducer, Let)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(LetInitializer, Equal)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(LetDecl, CARBON_IF_VALID(Semi))
// `var` and `returned var`:
// VariableIntroducer
@@ -382,37 +361,35 @@ CARBON_PARSE_NODE_KIND_BRACKET(LetDecl, LetIntroducer, CARBON_IF_VALID(Semi))
//
// The VariableInitializer and following expression are paired: either both will
// be present, or neither will.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(VariableIntroducer, 0, CARBON_IF_VALID(Var))
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ReturnedModifier, 0, Returned)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(VariableInitializer, 0, Equal)
CARBON_PARSE_NODE_KIND_BRACKET(VariableDecl, VariableIntroducer,
CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(VariableIntroducer, CARBON_IF_VALID(Var))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ReturnedModifier, Returned)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(VariableInitializer, Equal)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(VariableDecl, CARBON_IF_VALID(Semi))
// An expression statement:
// _external_: expression
// ExprStatement
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ExprStatement, 1, CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ExprStatement, CARBON_IF_VALID(Semi))
// `break`:
// BreakStatementStart
// BreakStatement
CARBON_PARSE_NODE_KIND_CHILD_COUNT(BreakStatementStart, 0, Break)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(BreakStatement, 1, CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(BreakStatementStart, Break)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(BreakStatement, CARBON_IF_VALID(Semi))
// `continue`:
// ContinueStatementStart
// ContinueStatement
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ContinueStatementStart, 0, Continue)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ContinueStatement, 1, CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ContinueStatementStart, Continue)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ContinueStatement, CARBON_IF_VALID(Semi))
// `return`:
// ReturnStatementStart
// _optional_ ReturnVarModifier or _external_: expression
// ReturnStatement
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ReturnStatementStart, 0, Return)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ReturnVarModifier, 0, Var)
CARBON_PARSE_NODE_KIND_BRACKET(ReturnStatement, ReturnStatementStart,
CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ReturnStatementStart, Return)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ReturnVarModifier, Var)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ReturnStatement, CARBON_IF_VALID(Semi))
// `for`:
// ForHeaderStart
@@ -425,12 +402,10 @@ CARBON_PARSE_NODE_KIND_BRACKET(ReturnStatement, ReturnStatementStart,
// ForStatement
//
// Versus a normal `var`, ForIn replaces VariableDecl.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ForHeaderStart, 0,
CARBON_IF_VALID(OpenParen))
CARBON_PARSE_NODE_KIND_BRACKET(ForIn, VariableIntroducer, CARBON_IF_VALID(In))
CARBON_PARSE_NODE_KIND_BRACKET(ForHeader, ForHeaderStart,
CARBON_IF_VALID(CloseParen))
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ForStatement, 2, For)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ForHeaderStart, CARBON_IF_VALID(OpenParen))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ForIn, CARBON_IF_VALID(In))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ForHeader, CARBON_IF_VALID(CloseParen))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ForStatement, For)
// `if` statement + `else`:
// IfConditionStart
@@ -442,12 +417,10 @@ CARBON_PARSE_NODE_KIND_CHILD_COUNT(ForStatement, 2, For)
// IfStatement
//
// IfStatementElse and the following node are optional based on `else` presence.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(IfConditionStart, 0,
CARBON_IF_VALID(OpenParen))
CARBON_PARSE_NODE_KIND_BRACKET(IfCondition, IfConditionStart,
CARBON_IF_VALID(CloseParen))
CARBON_PARSE_NODE_KIND_CHILD_COUNT(IfStatementElse, 0, Else)
CARBON_PARSE_NODE_KIND_BRACKET(IfStatement, IfCondition, If)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(IfConditionStart, CARBON_IF_VALID(OpenParen))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(IfCondition, CARBON_IF_VALID(CloseParen))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(IfStatementElse, Else)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(IfStatement, If)
// `while`:
// WhileConditionStart
@@ -455,26 +428,25 @@ CARBON_PARSE_NODE_KIND_BRACKET(IfStatement, IfCondition, If)
// WhileCondition
// _external_: CodeBlock
// WhileStatement
CARBON_PARSE_NODE_KIND_CHILD_COUNT(WhileConditionStart, 0,
CARBON_IF_VALID(OpenParen))
CARBON_PARSE_NODE_KIND_BRACKET(WhileCondition, WhileConditionStart,
CARBON_IF_VALID(CloseParen))
CARBON_PARSE_NODE_KIND_CHILD_COUNT(WhileStatement, 2, While)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(WhileConditionStart,
CARBON_IF_VALID(OpenParen))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(WhileCondition, CARBON_IF_VALID(CloseParen))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(WhileStatement, While)
// Index expressions, such as `a[1]`:
// _external_: expression
// IndexExprStart
// _external_: expression
// IndexExpr
CARBON_PARSE_NODE_KIND_CHILD_COUNT(IndexExprStart, 1, OpenSquareBracket)
CARBON_PARSE_NODE_KIND_BRACKET(IndexExpr, IndexExprStart, CloseSquareBracket)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(IndexExprStart, OpenSquareBracket)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(IndexExpr, CloseSquareBracket)
// Parenthesized single expressions, such as `(2)`:
// ParenExprStart
// _external_: expression
// ParenExpr
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ParenExprStart, 0, OpenParen)
CARBON_PARSE_NODE_KIND_BRACKET(ParenExpr, ParenExprStart, CloseParen)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ParenExprStart, OpenParen)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ParenExpr, CloseParen)
// Tuples, such as `(1, 2)`:
// TupleLiteralStart
@@ -485,9 +457,9 @@ CARBON_PARSE_NODE_KIND_BRACKET(ParenExpr, ParenExprStart, CloseParen)
//
// Expressions and TupleLiteralComma may repeat with TupleLiteralComma as a
// separator.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(TupleLiteralStart, 0, OpenParen)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(TupleLiteralComma, 0, Comma)
CARBON_PARSE_NODE_KIND_BRACKET(TupleLiteral, TupleLiteralStart, CloseParen)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(TupleLiteralStart, OpenParen)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(TupleLiteralComma, Comma)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(TupleLiteral, CloseParen)
// Call expressions, such as `a()`:
// _external_: expression
@@ -498,23 +470,23 @@ CARBON_PARSE_NODE_KIND_BRACKET(TupleLiteral, TupleLiteralStart, CloseParen)
// CallExpr
//
// Exprs and CallExprComma may repeat with CallExprComma as a separator.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(CallExprStart, 1, OpenParen)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(CallExprComma, 0, Comma)
CARBON_PARSE_NODE_KIND_BRACKET(CallExpr, CallExprStart, CloseParen)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(CallExprStart, OpenParen)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(CallExprComma, Comma)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(CallExpr, CloseParen)
// A member access expression, such as `a.b` or
// `GetObject().(Interface.member)`:
// _external_: lhs expression
// _external_: rhs expression
// MemberAccessExpr
CARBON_PARSE_NODE_KIND_CHILD_COUNT(MemberAccessExpr, 2, Period)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MemberAccessExpr, Period)
// A pointer member access expression, such as `a->b` or
// `GetObject()->(Interface.member)`:
// _external_: lhs expression
// _external_: rhs expression
// PointerMemberAccessExpr
CARBON_PARSE_NODE_KIND_CHILD_COUNT(PointerMemberAccessExpr, 2, MinusGreater)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(PointerMemberAccessExpr, MinusGreater)
// A value literal.
CARBON_PARSE_NODE_KIND_TOKEN_LITERAL(BoolLiteralFalse, False)
@@ -589,10 +561,10 @@ CARBON_PARSE_NODE_KIND_POSTFIX_OPERATOR(Star)
// ShortCircuitOperand(And|Or)
// _external_: expression
// ShortCircuitOperand(And|Or)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ShortCircuitOperandAnd, 1, And)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ShortCircuitOperandOr, 1, Or)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ShortCircuitOperatorAnd, 2, And)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ShortCircuitOperatorOr, 2, Or)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ShortCircuitOperandAnd, And)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ShortCircuitOperandOr, Or)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ShortCircuitOperatorAnd, And)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ShortCircuitOperatorOr, Or)
// `if` expression + `then` + `else`:
// _external_: expression
@@ -601,9 +573,9 @@ CARBON_PARSE_NODE_KIND_CHILD_COUNT(ShortCircuitOperatorOr, 2, Or)
// IfExprThen
// _external_: expression
// IfExprElse
CARBON_PARSE_NODE_KIND_CHILD_COUNT(IfExprIf, 1, If)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(IfExprThen, 1, Then)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(IfExprElse, 3, CARBON_IF_VALID(Else))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(IfExprIf, If)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(IfExprThen, Then)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(IfExprElse, CARBON_IF_VALID(Else))
// Struct literals, such as `{.a = 0}`:
// StructLiteralStart
@@ -631,16 +603,14 @@ CARBON_PARSE_NODE_KIND_CHILD_COUNT(IfExprElse, 3, CARBON_IF_VALID(Else))
// When a valid StructTypeField or StructField cannot be formed, elements
// may be replaced by InvalidParse, which may have a preceding sibling
// StructFieldDesignator if one was successfully parsed.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(StructLiteralStart, 0, OpenCurlyBrace)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(StructTypeLiteralStart, 0, OpenCurlyBrace)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(StructFieldDesignator, 1, Period)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(StructField, 2, Equal)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(StructTypeField, 2, Colon)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(StructComma, 0, Comma)
CARBON_PARSE_NODE_KIND_BRACKET(StructLiteral, StructLiteralStart,
CloseCurlyBrace)
CARBON_PARSE_NODE_KIND_BRACKET(StructTypeLiteral, StructTypeLiteralStart,
CloseCurlyBrace)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(StructLiteralStart, OpenCurlyBrace)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(StructTypeLiteralStart, OpenCurlyBrace)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(StructFieldDesignator, Period)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(StructField, Equal)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(StructTypeField, Colon)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(StructComma, Comma)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(StructLiteral, CloseCurlyBrace)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(StructTypeLiteral, CloseCurlyBrace)
// Various modifiers. These are all a single token.
CARBON_PARSE_NODE_KIND_TOKEN_MODIFIER(Abstract)
@@ -668,22 +638,18 @@ CARBON_PARSE_NODE_KIND_TOKEN_MODIFIER(Virtual)
// The above is the structure for a definition; for a declaration,
// ClassDefinitionStart and later nodes are removed and replaced by
// ClassDecl.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ClassIntroducer, 0, Class)
CARBON_PARSE_NODE_KIND_BRACKET(ClassDefinitionStart, ClassIntroducer,
OpenCurlyBrace)
CARBON_PARSE_NODE_KIND_BRACKET(ClassDefinition, ClassDefinitionStart,
CloseCurlyBrace)
CARBON_PARSE_NODE_KIND_BRACKET(ClassDecl, ClassIntroducer,
CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ClassIntroducer, Class)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ClassDefinitionStart, OpenCurlyBrace)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ClassDefinition, CloseCurlyBrace)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ClassDecl, CARBON_IF_VALID(Semi))
// `adapt`:
// AdaptIntroducer
// _repeated_ _external_: modifier
// _external_: expression
// AdaptDecl
CARBON_PARSE_NODE_KIND_CHILD_COUNT(AdaptIntroducer, 0, Adapt)
CARBON_PARSE_NODE_KIND_BRACKET(AdaptDecl, AdaptIntroducer,
CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(AdaptIntroducer, Adapt)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(AdaptDecl, CARBON_IF_VALID(Semi))
// `base`:
// BaseIntroducer
@@ -691,9 +657,9 @@ CARBON_PARSE_NODE_KIND_BRACKET(AdaptDecl, AdaptIntroducer,
// BaseColon
// _external_: expression
// BaseDecl
CARBON_PARSE_NODE_KIND_CHILD_COUNT(BaseIntroducer, 0, Base)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(BaseColon, 0, Colon)
CARBON_PARSE_NODE_KIND_BRACKET(BaseDecl, BaseIntroducer, CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(BaseIntroducer, Base)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(BaseColon, Colon)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(BaseDecl, CARBON_IF_VALID(Semi))
// `interface`:
// InterfaceIntroducer
@@ -708,13 +674,10 @@ CARBON_PARSE_NODE_KIND_BRACKET(BaseDecl, BaseIntroducer, CARBON_IF_VALID(Semi))
// The above is the structure for a definition; for a declaration,
// InterfaceDefinitionStart and later nodes are removed and replaced by
// InterfaceDecl.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(InterfaceIntroducer, 0, Interface)
CARBON_PARSE_NODE_KIND_BRACKET(InterfaceDefinitionStart, InterfaceIntroducer,
OpenCurlyBrace)
CARBON_PARSE_NODE_KIND_BRACKET(InterfaceDefinition, InterfaceDefinitionStart,
CloseCurlyBrace)
CARBON_PARSE_NODE_KIND_BRACKET(InterfaceDecl, InterfaceIntroducer,
CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(InterfaceIntroducer, Interface)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(InterfaceDefinitionStart, OpenCurlyBrace)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(InterfaceDefinition, CloseCurlyBrace)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(InterfaceDecl, CARBON_IF_VALID(Semi))
// `impl ... as`:
// ImplIntroducer
@@ -730,24 +693,22 @@ CARBON_PARSE_NODE_KIND_BRACKET(InterfaceDecl, InterfaceIntroducer,
// The above is the structure for a definition; for a declaration,
// ImplDefinitionStart and later nodes are removed and replaced by
// ImplDecl.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ImplIntroducer, 0, Impl)
CARBON_PARSE_NODE_KIND_BRACKET(ImplDefinitionStart, ImplIntroducer,
OpenCurlyBrace)
CARBON_PARSE_NODE_KIND_BRACKET(ImplDefinition, ImplDefinitionStart,
CloseCurlyBrace)
CARBON_PARSE_NODE_KIND_BRACKET(ImplDecl, ImplIntroducer, CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ImplIntroducer, Impl)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ImplDefinitionStart, OpenCurlyBrace)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ImplDefinition, CloseCurlyBrace)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ImplDecl, CARBON_IF_VALID(Semi))
// `forall ...`:
// _external_: ImplicitParamList
// ImplForall
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ImplForall, 1, Forall)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ImplForall, Forall)
// `... as`:
// _external_: expression
// TypeImplAs
CARBON_PARSE_NODE_KIND_CHILD_COUNT(TypeImplAs, 1, As)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(TypeImplAs, As)
// `as` without a type before it
CARBON_PARSE_NODE_KIND_CHILD_COUNT(DefaultSelfImplAs, 0, As)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(DefaultSelfImplAs, As)
// `constraint`:
// NamedConstraintIntroducer
@@ -762,13 +723,11 @@ CARBON_PARSE_NODE_KIND_CHILD_COUNT(DefaultSelfImplAs, 0, As)
// The above is the structure for a definition; for a declaration,
// NamedConstraintDefinitionStart and later nodes are removed and replaced by
// NamedConstraintDecl.
CARBON_PARSE_NODE_KIND_CHILD_COUNT(NamedConstraintIntroducer, 0, Constraint)
CARBON_PARSE_NODE_KIND_BRACKET(NamedConstraintDefinitionStart,
NamedConstraintIntroducer, OpenCurlyBrace)
CARBON_PARSE_NODE_KIND_BRACKET(NamedConstraintDefinition,
NamedConstraintDefinitionStart, CloseCurlyBrace)
CARBON_PARSE_NODE_KIND_BRACKET(NamedConstraintDecl, NamedConstraintIntroducer,
CARBON_IF_VALID(Semi))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(NamedConstraintIntroducer, Constraint)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(NamedConstraintDefinitionStart,
OpenCurlyBrace)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(NamedConstraintDefinition, CloseCurlyBrace)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(NamedConstraintDecl, CARBON_IF_VALID(Semi))
// `choice`:
// ChoiceIntroducer
@@ -776,11 +735,11 @@ CARBON_PARSE_NODE_KIND_BRACKET(NamedConstraintDecl, NamedConstraintIntroducer,
// ChoiceDefinitionStart
// _optional_ _external_: ChoiceAlternativeList
// ChoiceDefinition
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ChoiceIntroducer, 0, Choice)
CARBON_PARSE_NODE_KIND_BRACKET(ChoiceDefinitionStart, ChoiceIntroducer,
CARBON_IF_VALID(OpenCurlyBrace))
CARBON_PARSE_NODE_KIND_BRACKET(ChoiceDefinition, ChoiceDefinitionStart,
CARBON_IF_VALID(CloseCurlyBrace))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ChoiceIntroducer, Choice)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ChoiceDefinitionStart,
CARBON_IF_VALID(OpenCurlyBrace))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ChoiceDefinition,
CARBON_IF_VALID(CloseCurlyBrace))
// Choice alternative list:
// _external_: IdentifierName
@@ -788,7 +747,7 @@ CARBON_PARSE_NODE_KIND_BRACKET(ChoiceDefinition, ChoiceDefinitionStart,
// _optional_: ChoiceAlternativeListComma
// _repeated_
// ChoiceAlternativeList
CARBON_PARSE_NODE_KIND_CHILD_COUNT(ChoiceAlternativeListComma, 0, Comma)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(ChoiceAlternativeListComma, Comma)
// `match`:
// MatchIntroducer
@@ -799,15 +758,14 @@ CARBON_PARSE_NODE_KIND_CHILD_COUNT(ChoiceAlternativeListComma, 0, Comma)
// _repeated_ _external_: MatchCase
// _optional_ _external_: MatchStatementDefault
// MatchStatement
CARBON_PARSE_NODE_KIND_CHILD_COUNT(MatchIntroducer, 0, Match)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(MatchConditionStart, 0,
CARBON_IF_VALID(OpenParen))
CARBON_PARSE_NODE_KIND_BRACKET(MatchCondition, MatchConditionStart,
CARBON_IF_VALID(CloseParen))
CARBON_PARSE_NODE_KIND_BRACKET(MatchStatementStart, MatchIntroducer,
CARBON_IF_VALID(OpenCurlyBrace))
CARBON_PARSE_NODE_KIND_BRACKET(MatchStatement, MatchStatementStart,
CARBON_IF_VALID(CloseCurlyBrace))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchIntroducer, Match)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchConditionStart,
CARBON_IF_VALID(OpenParen))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchCondition, CARBON_IF_VALID(CloseParen))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchStatementStart,
CARBON_IF_VALID(OpenCurlyBrace))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchStatement,
CARBON_IF_VALID(CloseCurlyBrace))
// `case`:
// MatchCaseIntroducer
@@ -820,18 +778,16 @@ CARBON_PARSE_NODE_KIND_BRACKET(MatchStatement, MatchStatementStart,
// MatchCaseStart
// _repeated_ _external_: statement
// MatchCase
CARBON_PARSE_NODE_KIND_CHILD_COUNT(MatchCaseIntroducer, 0, Case)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(MatchCaseGuardIntroducer, 0, If)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(MatchCaseGuardStart, 0,
CARBON_IF_VALID(OpenParen))
CARBON_PARSE_NODE_KIND_BRACKET(MatchCaseGuard, MatchCaseGuardIntroducer,
CARBON_IF_VALID(CloseParen))
CARBON_PARSE_NODE_KIND_CHILD_COUNT(MatchCaseEqualGreater, 0,
CARBON_IF_VALID(EqualGreater))
CARBON_PARSE_NODE_KIND_BRACKET(MatchCaseStart, MatchCaseIntroducer,
CARBON_IF_VALID(OpenCurlyBrace))
CARBON_PARSE_NODE_KIND_BRACKET(MatchCase, MatchCaseStart,
CARBON_IF_VALID(CloseCurlyBrace))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchCaseIntroducer, Case)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchCaseGuardIntroducer, If)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchCaseGuardStart,
CARBON_IF_VALID(OpenParen))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchCaseGuard, CARBON_IF_VALID(CloseParen))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchCaseEqualGreater,
CARBON_IF_VALID(EqualGreater))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchCaseStart,
CARBON_IF_VALID(OpenCurlyBrace))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchCase, CARBON_IF_VALID(CloseCurlyBrace))
// `default`:
// MatchDefaultIntroducer
@@ -839,17 +795,16 @@ CARBON_PARSE_NODE_KIND_BRACKET(MatchCase, MatchCaseStart,
// MatchDefaultStart
// _repeated_ _external_: statement
// MatchDefault
CARBON_PARSE_NODE_KIND_CHILD_COUNT(MatchDefaultIntroducer, 0, Default)
CARBON_PARSE_NODE_KIND_CHILD_COUNT(MatchDefaultEqualGreater, 0,
CARBON_IF_VALID(EqualGreater))
CARBON_PARSE_NODE_KIND_BRACKET(MatchDefaultStart, MatchDefaultIntroducer,
CARBON_IF_VALID(OpenCurlyBrace))
CARBON_PARSE_NODE_KIND_BRACKET(MatchDefault, MatchDefaultStart,
CARBON_IF_VALID(CloseCurlyBrace))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchDefaultIntroducer, Default)
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchDefaultEqualGreater,
CARBON_IF_VALID(EqualGreater))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchDefaultStart,
CARBON_IF_VALID(OpenCurlyBrace))
CARBON_PARSE_NODE_KIND_WITH_TOKEN(MatchDefault,
CARBON_IF_VALID(CloseCurlyBrace))
#undef CARBON_PARSE_NODE_KIND
#undef CARBON_PARSE_NODE_KIND_BRACKET
#undef CARBON_PARSE_NODE_KIND_CHILD_COUNT
#undef CARBON_PARSE_NODE_KIND_WITH_TOKEN
#undef CARBON_PARSE_NODE_KIND_INFIX_OPERATOR
#undef CARBON_PARSE_NODE_KIND_POSTFIX_OPERATOR
#undef CARBON_PARSE_NODE_KIND_PREFIX_OPERATOR