clang astcontext.getParents总是返回一个空列表
clang ASTContext.getParents always returns an empty list
我正在使用基于示例的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();
}
}
}
Context
是 ASTContext
,当我使用其他功能时工作正常,例如: 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将成功找到父母。
相关文章:
- 链表,将列表复制到另一个列表
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 我如何创建一个列表,然后从中创建两个列表,其中一个用于偶数,另一个用于奇数?
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- 打印一个列表给出错误,指出迭代器不可递减
- C++:从两个包含子类 (typedef) 的列表创建一个列表
- 在 std 列表中查找对象并将其添加到另一个列表
- 在c++中遍历一个列表并在另一个列表中搜索每个元素
- 我在 C++ 中创建了一个列表容器类,但它没有按预期工作
- 如何通过赋值运算符重载将一个列表复制到另一个列表上?C++
- 正在将指针复制到assign运算符中的另一个列表元素
- 在c++中传递一个列表作为返回类型
- 如何在c++中创建一个列表及其内容常量
- C++:如何将迭代器设置为另一个列表中的结构内的列表
- C++ std::sort 引用另一个列表的自定义比较函数
- 如何让数组在下一次输入之前显示数组内容的前一个列表?
- 如果我创建一个列表:<T>:迭代器,有没有办法重载++(增量)运算符?
- 我如何解码一个列表的列表
- 如何在c++中用一个目录中的所有文件夹填充一个列表框
- c++遍历一个列表来调用某个函数