clang ASTContext.getParents 总是返回一个空列表

min*_*910 5 c++ llvm clang abstract-syntax-tree

我正在使用基于示例Clang ASTFrontendActions 示例的LibTooling 为 clang 4.0 编写工具。给定当前语句 stmt,我想在 AST 中获取它的直接父级。因此,我尝试使用以下代码转储 stmt 的所有父级(用于测试目的):

bool VisitStmt(Stmt *s) {
    cout <<"Trying to get parents \n";
    const Stmt  currentStmt = *s;
    const auto& parents  = Context->getParents(currentStmt);
    auto it = Context->getParents(currentStmt).begin();
    if(it == Context->getParents(currentStmt).end())
        cout<< "parents not found\n";
    cout<<"parents size "<< parents.size() <<": \n";
    if (!parents.empty()){
        for (int i = 0; i< parents.size(); i++ ){
            cout<<"parent at "<< i <<": \n";
            const Stmt* parentStmt =  parents[i].get<Stmt>();
            parentStmt->dump();
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

ContextASTContext和工作得很好,当我使用它的其他功能,如:Context->getSourceManager()
对于访问的所有语句,结果总是(不管是什么,我把输入):

Trying to get parents 
parents not found
parents size 0: 
Run Code Online (Sandbox Code Playgroud)

我是否错过了使用 getParents 的任何东西(初始化、设置)?

小智 4

问题来自以下行:

const Stmt  currentStmt = *s;
Run Code Online (Sandbox Code Playgroud)

其作用是复制声明。Context->getParents()通过查找将传递的参数作为子节点的节点来工作。但由于currentStmt仅存在于堆栈中,而不是在上下文中,因此它无法找到任何此类节点。

通过引用currentStmts 指向的节点:

const Stmt& currentStmt = *s;
Run Code Online (Sandbox Code Playgroud)

然后,您将向上下文传递它本身具有的实际节点实例,并且 clang 将成功找到父级。