Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to traverse all nodes of clang AST?

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.

like image 293
hbn1991 Avatar asked Jun 12 '15 14:06

hbn1991


1 Answers

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;
    }
};
like image 170
rettichschnidi Avatar answered Oct 01 '22 18:10

rettichschnidi