Refactor NodeKind to take advantage of a parse node only having one token kind. (#3486)

This builds on the series of changes to NodeKinds, aiming to simplify
the NodeKind implementation a little, also making it clearer that
there's a single associated token for each parse node (or, for
placeholders/invalid parses, not validated).

Note that prior to the relevant changes, there were nodes with multiple
tokens. This change is also locking in the approach of one token per
parse node, by refactoring macros to stop supporting multiple.
This commit is contained in:
Jon Ross-Perkins
2023-12-13 21:03:44 +00:00
committed by GitHub
parent 550559e30e
commit add31eb4e3
4 changed files with 190 additions and 262 deletions
+5 -5
View File
@@ -24,6 +24,11 @@ class NodeKind : public CARBON_ENUM_BASE(NodeKind) {
#define CARBON_PARSE_NODE_KIND(Name) CARBON_ENUM_CONSTANT_DECL(Name)
#include "toolchain/parse/node_kind.def"
// Validates that a `parse_node_kind` parser node can be generated for a
// `lex_token_kind` lexer token.
auto CheckMatchesTokenKind(Lex::TokenKind lex_token_kind, bool has_error)
-> void;
// Returns true if the node is bracketed; otherwise, child_count is used.
auto has_bracket() const -> bool;
@@ -45,11 +50,6 @@ class NodeKind : public CARBON_ENUM_BASE(NodeKind) {
// We expect the parse node kind to fit compactly into 8 bits.
static_assert(sizeof(NodeKind) == 1, "Kind objects include padding!");
// Validates that a `parse_node_kind` parser node can be generated for a
// `lex_token_kind` lexer token.
void CheckNodeMatchesLexerToken(NodeKind parse_node_kind,
Lex::TokenKind lex_token_kind, bool has_error);
} // namespace Carbon::Parse
#endif // CARBON_TOOLCHAIN_PARSE_NODE_KIND_H_