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

时间:2016-11-29 17:21:59

标签: c++ clang llvm abstract-syntax-tree

我正在使用基于示例Clang ASTFrontendActions sample的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的任何内容(初始化,设置)?

1 个答案:

答案 0 :(得分:3)

问题来自以下几行:

const Stmt  currentStmt = *s;

这样做是为了复制该陈述。 Context->getParents()通过查找将传递的参数作为子节点的节点来工作。但由于currentStmt仅存在于您的堆栈上,而不是在上下文中,因此无法找到任何此类节点。

使currentStmt引用s指向的节点:

const Stmt& currentStmt = *s;

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