From a602be89e2cefe86b8343a47975cf2231f5c3b92 Mon Sep 17 00:00:00 2001 From: josh11b Date: Thu, 28 Dec 2023 14:29:30 -0800 Subject: [PATCH] Add a `MemberName` parse node category for member access expressions (#3549) Use this new category to replace the unconstrained `NodeId` child of `MemberAccessExpr ` and `PointerMemberAccessExpr`. For now this new category matches `IdentifierName` and `BaseName`, but later this will be expanded to support `a.(b.c)` and `p->(b.c)` syntactic forms. QUESTION: Is it time to make a `node_category.def` x-macro file? ANSWER: Not yet. --- toolchain/parse/node_ids.h | 1 + toolchain/parse/node_kind.cpp | 1 + toolchain/parse/node_kind.h | 9 +++++---- toolchain/parse/typed_nodes.h | 11 +++++------ toolchain/parse/typed_nodes_test.cpp | 2 +- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/toolchain/parse/node_ids.h b/toolchain/parse/node_ids.h index f8ae31910d30..476b42145ee1 100644 --- a/toolchain/parse/node_ids.h +++ b/toolchain/parse/node_ids.h @@ -60,6 +60,7 @@ constexpr NodeIdInCategory NodeIdInCategory::Invalid = // Aliases for `NodeIdInCategory` to describe particular categories of nodes. using AnyDeclId = NodeIdInCategory; using AnyExprId = NodeIdInCategory; +using AnyMemberNameId = NodeIdInCategory; using AnyModifierId = NodeIdInCategory; using AnyNameComponentId = NodeIdInCategory; using AnyPatternId = NodeIdInCategory; diff --git a/toolchain/parse/node_kind.cpp b/toolchain/parse/node_kind.cpp index 72a122f8de3a..f97761a10712 100644 --- a/toolchain/parse/node_kind.cpp +++ b/toolchain/parse/node_kind.cpp @@ -23,6 +23,7 @@ auto operator<<(llvm::raw_ostream& output, NodeCategory category) } CARBON_NODE_CATEGORY(Decl); CARBON_NODE_CATEGORY(Expr); + CARBON_NODE_CATEGORY(MemberName); CARBON_NODE_CATEGORY(Modifier); CARBON_NODE_CATEGORY(NameComponent); CARBON_NODE_CATEGORY(Pattern); diff --git a/toolchain/parse/node_kind.h b/toolchain/parse/node_kind.h index f85e7e6bf48f..36a79edde362 100644 --- a/toolchain/parse/node_kind.h +++ b/toolchain/parse/node_kind.h @@ -22,10 +22,11 @@ LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); enum class NodeCategory : uint32_t { Decl = 1 << 0, Expr = 1 << 1, - Modifier = 1 << 2, - NameComponent = 1 << 3, - Pattern = 1 << 4, - Statement = 1 << 5, + MemberName = 1 << 2, + Modifier = 1 << 3, + NameComponent = 1 << 4, + Pattern = 1 << 5, + Statement = 1 << 6, None = 0, LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/Statement) diff --git a/toolchain/parse/typed_nodes.h b/toolchain/parse/typed_nodes.h index d5972f78baa2..bca34cb3976a 100644 --- a/toolchain/parse/typed_nodes.h +++ b/toolchain/parse/typed_nodes.h @@ -108,7 +108,8 @@ using EmptyDecl = // A name in a non-expression context, such as a declaration. using IdentifierName = - LeafNode; + LeafNode; // A name in an expression context. using IdentifierNameExpr = @@ -125,7 +126,7 @@ using SelfTypeNameExpr = // 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}`. -using BaseName = LeafNode; +using BaseName = LeafNode; // A qualified name: `A.B`. struct QualifiedName { @@ -564,8 +565,7 @@ struct MemberAccessExpr { NodeKind::MemberAccessExpr.Define(NodeCategory::Expr); AnyExprId lhs; - // TODO: Figure out which nodes can appear here - NodeId rhs; + AnyMemberNameId rhs; }; // A simple indirect member access expression: `a->b`. @@ -574,8 +574,7 @@ struct PointerMemberAccessExpr { NodeKind::PointerMemberAccessExpr.Define(NodeCategory::Expr); AnyExprId lhs; - // TODO: Figure out which nodes can appear here - NodeId rhs; + AnyMemberNameId rhs; }; // A prefix operator expression. diff --git a/toolchain/parse/typed_nodes_test.cpp b/toolchain/parse/typed_nodes_test.cpp index ec5e15bd9710..39c5f84ec88f 100644 --- a/toolchain/parse/typed_nodes_test.cpp +++ b/toolchain/parse/typed_nodes_test.cpp @@ -240,7 +240,7 @@ Aggregate [^:]*: success EXPECT_THAT(err2.message(), testing::MatchesRegex( R"Trace(Aggregate [^:]*: begin 2-tuple: begin -NodeId: IdentifierName consumed +NodeIdInCategory MemberName: kind IdentifierName consumed NodeIdInCategory Expr: kind PointerMemberAccessExpr consumed 2-tuple: success Aggregate [^:]*: success