我有一个LibTooling(TimeFlag),用于为每个forstmt / whilestmt添加一个标志。我使用./TimeFlag lalala.cpp --
在lalala.cpp中插入标志
不幸的是,这个工具也会改变标题,甚至是系统库。
那么有一些方法让LibTooling只处理输入文件吗?
答案 0 :(得分:0)
以下是两种可能:如果使用RecursiveASTVisitor,可以使用SourceManager来确定语句或声明的位置是否在主扩展文件中:
clang::SourceManager &sm(astContext->getSourceManager());
bool const inMainFile(
sm.isInMainFile( sm.getExpansionLoc( stmt->getLocStart())));
if(inMainFile){
/* process decl or stmt */
}
else{
std::cout << "'" << stmt->getNameAsString() << "' is not in main file\n";
}
SourceManager中有几种类似的方法,例如isInSystemHeader
来协助完成此任务。
如果您使用AST匹配器,则可以使用isExpansionInMainFile
来缩小匹配的节点:
auto matcher = forStmt( isExpansionInMainFile());
有一个类似的匹配器,isExpansionInSystemHeader
。