我有一个 LibTooling (TimeFlag),用于为每个 forstmt/whilestmt 添加一个标志。我用来./TimeFlag lalala.cpp --
在 lalala.cpp 中插入标志
不幸的是,这个工具也会改变头文件,甚至系统库。
那么有没有一些方法让 LibTooling 只处理输入文件?
我有一个 LibTooling (TimeFlag),用于为每个 forstmt/whilestmt 添加一个标志。我用来./TimeFlag lalala.cpp --
在 lalala.cpp 中插入标志
不幸的是,这个工具也会改变头文件,甚至系统库。
那么有没有一些方法让 LibTooling 只处理输入文件?
这里有两种可能性:如果使用 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
.