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

clang ASTContext.getParents always returns an empty list

本文关键字:一个 列表 getParents astcontext 返回 clang      更新时间:2023-10-16

我正在使用基于示例的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 foundn";
    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();
        }
    }
}

ContextASTContext,当我使用其他功能时工作正常,例如: Context->getSourceManager()
对于所有访问的陈述,结果始终是(无论我在输入中投入什么):

Trying to get parents 
parents not found
parents size 0: 

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

问题来自以下行:

const Stmt  currentStmt = *s;

这是制作声明的副本。Context->getParents()通过寻找小时候通过论证的节点来起作用。但是,由于currentStmt仅生活在您的堆栈上,而不在上下文中,因此无法找到任何此类节点。

通过使currentStmt作为S:

指向的节点的引用
const Stmt& currentStmt = *s;

然后,您将传递到上下文中其自身内部的实际节点实例,Clang将成功找到父母。