在Clang AST中查找声明的父节点

10
我正在使用clang进行分析,需要找到AST中声明的父级。例如,在以下代码中,我有int x,我想获取其父级,应该是函数声明:

int main(int x) { return 0 }

我知道在此链接http://comments.gmane.org/gmane.comp.compilers.clang.devel/2152中提到了ParentMap类来跟踪父节点。然而,这只表示从Stmt* -> Stmt*的映射,我需要找到声明的父级。有人知道我该如何做吗?

3个回答

8
您可以使用AstContext::getParents()来查找AST节点的父节点。 示例代码如下:
    const Stmt* ST = str;

    while (true) {
        //get parents
        const auto& parents = pContext->getParents(*ST);
        if ( parents.empty() ) {
            llvm::errs() << "Can not find parent\n";
            return false;
        }
        llvm::errs() << "find parent size=" << parents.size() << "\n";
        ST = parents[0].get<Stmt>();
        if (!ST)
            return false;
        ST->dump();
        if (isa<CompoundStmt>(ST))
            break;
    } 

AstContext::getParents() 方法可以接受 stmt 参数或 decl 参数。

你有检查过这个解决方案吗?作者需要找到一个声明的父级。 - Thien Tran
如果我正确理解文档的话,现在可以获取除 Decls 和 Stmts 之外的其他 AST 节点的父节点了:'NodeT' 可以是 Decl、Stmt、Type、TypeLoc、NestedNameSpecifier 或者 NestedNameSpecifierLoc。 - Brent Pappas

4
这正是你所寻找的,与链接线程中描述的一样,ParentMap。在clang特定声明中,所有继承自clang::Decl,它提供了。
virtual Stmt* getBody() const;

或者您可能会满意于现成的AST匹配器,它们使得在AST上创建查询变得更加容易。clang-tidy检查程序广泛使用它们,并且很容易跟踪,可以参见源代码[git]


1
关于FunctionDecl的父节点,有一些需要注意的地方:Function的声明可能是类的成员,也可能是“独立”的声明。
如果FunctionDecl是类的成员,则FunctionDecl是CXXMethodDecl,您可以通过以下方式进行检查:
isa<CXXMethodDecl>(FunctionDecl *FD).

然后你可以使用getParent()方法获取CXXMethodDecl的父级。这个方法在FunctionDecl中不存在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接