问题
I can traverse the specific subtrees of clang AST using the recursivevisitor class but what I want to do is to traverse the clang AST node by node.
I'd be really grateful if anybody can help me with this.
Thanks in advance.
回答1:
RecursiveASTVisitor can do what you need.
Implementing the member methods TraverseDecl(Decl *x)
, TraverseStmt(Stmt *x)
and TraverseType(QualType x)
for your RecursiveASTVisitor`-derived class (e.g. MyClass) will do the trick. Combined, those three methods will take you to each and every node in your AST.
Example:
class MyClass : public RecursiveASTVisitor<MyClass> {
public:
bool TraverseDecl(Decl *D) {
// your logic here
RecursiveASTVisitor<MyClass>::TraverseDecl(D); // Forward to base class
return true; // Return false to stop the AST analyzing
}
bool TraverseStmt(Stmt *x) {
// your logic here
RecursiveASTVisitor<MyClass>::TraverseStmt(x);
return true;
}
bool TraverseType(QualType x) {
// your logic here
RecursiveASTVisitor<MyClass>::TraverseType(x);
return true;
}
};
来源:https://stackoverflow.com/questions/30805595/how-to-traverse-clang-ast-manually