繁体   English   中英

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

[英]clang ASTContext.getParents always returns an empty list

我正在基于示例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();
        }

    }
}

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将设法成功找到父节点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM