clang ASTContext.getParents 总是 returns 一个空列表
clang ASTContext.getParents always returns an empty list
我正在基于示例 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();
}
}
}
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 将设法成功找到父节点。
我正在基于示例 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();
}
}
}
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 将设法成功找到父节点。