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.
This commit is contained in:
josh11b
2023-12-28 22:29:30 +00:00
committed by GitHub
parent 83b5db9c1e
commit a602be89e2
5 changed files with 13 additions and 11 deletions
+1
View File
@@ -60,6 +60,7 @@ constexpr NodeIdInCategory<Category> NodeIdInCategory<Category>::Invalid =
// Aliases for `NodeIdInCategory` to describe particular categories of nodes.
using AnyDeclId = NodeIdInCategory<NodeCategory::Decl>;
using AnyExprId = NodeIdInCategory<NodeCategory::Expr>;
using AnyMemberNameId = NodeIdInCategory<NodeCategory::MemberName>;
using AnyModifierId = NodeIdInCategory<NodeCategory::Modifier>;
using AnyNameComponentId = NodeIdInCategory<NodeCategory::NameComponent>;
using AnyPatternId = NodeIdInCategory<NodeCategory::Pattern>;
+1
View File
@@ -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);
+5 -4
View File
@@ -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)
+5 -6
View File
@@ -108,7 +108,8 @@ using EmptyDecl =
// A name in a non-expression context, such as a declaration.
using IdentifierName =
LeafNode<NodeKind::IdentifierName, NodeCategory::NameComponent>;
LeafNode<NodeKind::IdentifierName,
NodeCategory::NameComponent | NodeCategory::MemberName>;
// 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<NodeKind::BaseName>;
using BaseName = LeafNode<NodeKind::BaseName, NodeCategory::MemberName>;
// 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.
+1 -1
View File
@@ -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