我有一个LibTooling (TimeFlag),它用于为每个forstmt/whilestmt添加一个标志。并且我使用./TimeFlag lalala.cpp --在lalala.cpp中插入标志
不幸的是,这个工具也会改变头文件,甚至系统库。
那么有没有什么方法可以让LibTooling只处理输入文件呢?
发布于 2017-07-19 23:05:12
这里有两种可能性:如果使用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。
https://stackoverflow.com/questions/45155944
复制相似问题