Skip to content

Commit f6da0cf

Browse files
committed
Enable better node-hierarchy metaprogramming; NFC.
1 parent 30066e5 commit f6da0cf

File tree

3 files changed

+63
-41
lines changed

3 files changed

+63
-41
lines changed

clang/utils/TableGen/ASTTableGen.cpp

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,11 @@ std::string clang::tblgen::StmtNode::getId() const {
6161
}
6262

6363
// A map from a node to each of its child nodes.
64-
template <class NodeClass>
65-
using ChildMap = std::multimap<NodeClass, NodeClass>;
64+
using ChildMap = std::multimap<ASTNode, ASTNode>;
6665

67-
template <class NodeClass>
68-
static void visitASTNodeRecursive(NodeClass node, NodeClass base,
69-
const ChildMap<NodeClass> &map,
70-
ASTNodeHierarchyVisitor<NodeClass> visit) {
66+
static void visitASTNodeRecursive(ASTNode node, ASTNode base,
67+
const ChildMap &map,
68+
ASTNodeHierarchyVisitor<ASTNode> visit) {
7169
visit(node, base);
7270

7371
auto i = map.lower_bound(node), e = map.upper_bound(node);
@@ -76,10 +74,9 @@ static void visitASTNodeRecursive(NodeClass node, NodeClass base,
7674
}
7775
}
7876

79-
template <class NodeClass>
8077
static void visitHierarchy(RecordKeeper &records,
8178
StringRef nodeClassName,
82-
ASTNodeHierarchyVisitor<NodeClass> visit) {
79+
ASTNodeHierarchyVisitor<ASTNode> visit) {
8380
// Check for the node class, just as a sanity check.
8481
if (!records.getClass(nodeClassName)) {
8582
PrintFatalError(Twine("cannot find definition for node class ")
@@ -90,9 +87,9 @@ static void visitHierarchy(RecordKeeper &records,
9087
auto nodes = records.getAllDerivedDefinitions(nodeClassName);
9188

9289
// Derive the child map.
93-
ChildMap<NodeClass> hierarchy;
94-
NodeClass root;
95-
for (NodeClass node : nodes) {
90+
ChildMap hierarchy;
91+
ASTNode root;
92+
for (ASTNode node : nodes) {
9693
if (auto base = node.getBase())
9794
hierarchy.insert(std::make_pair(base, node));
9895
else if (root)
@@ -105,26 +102,11 @@ static void visitHierarchy(RecordKeeper &records,
105102
PrintFatalError(Twine("no root node in ") + nodeClassName + " hierarchy");
106103

107104
// Now visit the map recursively, starting at the root node.
108-
visitASTNodeRecursive(root, NodeClass(), hierarchy, visit);
105+
visitASTNodeRecursive(root, ASTNode(), hierarchy, visit);
109106
}
110107

111-
void clang::tblgen::visitASTNodeHierarchy(RecordKeeper &records,
112-
StringRef nodeClassName,
108+
void clang::tblgen::visitASTNodeHierarchyImpl(RecordKeeper &records,
109+
StringRef nodeClassName,
113110
ASTNodeHierarchyVisitor<ASTNode> visit) {
114111
visitHierarchy(records, nodeClassName, visit);
115112
}
116-
117-
void clang::tblgen::visitDeclNodeHierarchy(RecordKeeper &records,
118-
ASTNodeHierarchyVisitor<DeclNode> visit) {
119-
visitHierarchy(records, DeclNodeClassName, visit);
120-
}
121-
122-
void clang::tblgen::visitTypeNodeHierarchy(RecordKeeper &records,
123-
ASTNodeHierarchyVisitor<TypeNode> visit) {
124-
visitHierarchy(records, TypeNodeClassName, visit);
125-
}
126-
127-
void clang::tblgen::visitStmtNodeHierarchy(RecordKeeper &records,
128-
ASTNodeHierarchyVisitor<StmtNode> visit) {
129-
visitHierarchy(records, StmtNodeClassName, visit);
130-
}

clang/utils/TableGen/ASTTableGen.h

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,19 @@ class DeclNode : public ASTNode {
110110
llvm::StringRef getId() const;
111111
std::string getClassName() const;
112112
DeclNode getBase() const { return DeclNode(ASTNode::getBase().getRecord()); }
113+
114+
static llvm::StringRef getASTHierarchyName() {
115+
return "Decl";
116+
}
117+
static llvm::StringRef getASTIdTypeName() {
118+
return "Decl::Kind";
119+
}
120+
static llvm::StringRef getASTIdAccessorName() {
121+
return "getKind";
122+
}
123+
static llvm::StringRef getTableGenNodeClassName() {
124+
return DeclNodeClassName;
125+
}
113126
};
114127

115128
class TypeNode : public ASTNode {
@@ -119,6 +132,19 @@ class TypeNode : public ASTNode {
119132
llvm::StringRef getId() const;
120133
llvm::StringRef getClassName() const;
121134
TypeNode getBase() const { return TypeNode(ASTNode::getBase().getRecord()); }
135+
136+
static llvm::StringRef getASTHierarchyName() {
137+
return "Type";
138+
}
139+
static llvm::StringRef getASTIdTypeName() {
140+
return "Type::TypeClass";
141+
}
142+
static llvm::StringRef getASTIdAccessorName() {
143+
return "getTypeClass";
144+
}
145+
static llvm::StringRef getTableGenNodeClassName() {
146+
return TypeNodeClassName;
147+
}
122148
};
123149

124150
class StmtNode : public ASTNode {
@@ -128,6 +154,19 @@ class StmtNode : public ASTNode {
128154
std::string getId() const;
129155
llvm::StringRef getClassName() const;
130156
StmtNode getBase() const { return StmtNode(ASTNode::getBase().getRecord()); }
157+
158+
static llvm::StringRef getASTHierarchyName() {
159+
return "Stmt";
160+
}
161+
static llvm::StringRef getASTIdTypeName() {
162+
return "Stmt::StmtClass";
163+
}
164+
static llvm::StringRef getASTIdAccessorName() {
165+
return "getStmtClass";
166+
}
167+
static llvm::StringRef getTableGenNodeClassName() {
168+
return StmtNodeClassName;
169+
}
131170
};
132171

133172
/// A visitor for an AST node hierarchy. Note that `base` can be null for
@@ -136,18 +175,19 @@ template <class NodeClass>
136175
using ASTNodeHierarchyVisitor =
137176
llvm::function_ref<void(NodeClass node, NodeClass base)>;
138177

139-
void visitASTNodeHierarchy(llvm::RecordKeeper &records,
140-
llvm::StringRef nodeClassName,
141-
ASTNodeHierarchyVisitor<ASTNode> visit);
142-
143-
void visitDeclNodeHierarchy(llvm::RecordKeeper &records,
144-
ASTNodeHierarchyVisitor<DeclNode> visit);
145-
146-
void visitTypeNodeHierarchy(llvm::RecordKeeper &records,
147-
ASTNodeHierarchyVisitor<TypeNode> visit);
178+
void visitASTNodeHierarchyImpl(llvm::RecordKeeper &records,
179+
llvm::StringRef nodeClassName,
180+
ASTNodeHierarchyVisitor<ASTNode> visit);
148181

149-
void visitStmtNodeHierarchy(llvm::RecordKeeper &records,
150-
ASTNodeHierarchyVisitor<StmtNode> visit);
182+
template <class NodeClass>
183+
void visitASTNodeHierarchy(llvm::RecordKeeper &records,
184+
ASTNodeHierarchyVisitor<NodeClass> visit) {
185+
visitASTNodeHierarchyImpl(records, NodeClass::getTableGenNodeClassName(),
186+
[visit](ASTNode node, ASTNode base) {
187+
visit(NodeClass(node.getRecord()),
188+
NodeClass(base.getRecord()));
189+
});
190+
}
151191

152192
} // end namespace clang::tblgen
153193
} // end namespace clang

clang/utils/TableGen/ClangTypeNodesEmitter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ void TypeNodeEmitter::emitFallbackDefine(StringRef macroName,
137137
void TypeNodeEmitter::emitNodeInvocations() {
138138
TypeNode lastType;
139139

140-
visitTypeNodeHierarchy(Records, [&](TypeNode type, TypeNode base) {
140+
visitASTNodeHierarchy<TypeNode>(Records, [&](TypeNode type, TypeNode base) {
141141
// If this is the Type node itself, skip it; it can't be handled
142142
// uniformly by metaprograms because it doesn't have a base.
143143
if (!base) return;

0 commit comments

Comments
 (0)