我有一个LibTooling(TimeFlag(,用于为每个forstmt/whilestmt添加一个标志。我用./TimeFlag lalala.cpp --
在拉拉拉中插入旗帜.cpp
不幸的是,此工具还会更改标题,甚至是系统库。
那么有没有办法让 LibTooling 只处理输入文件呢?
下面有两种可能性: 如果使用递归 ASTVisitor,则可以使用 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 filen";
}
SourceManager 中有几个类似的方法,例如isInSystemHeader
来帮助完成此任务。
如果使用 AST 匹配器,则可以使用isExpansionInMainFile
来缩小它匹配的节点范围:
auto matcher = forStmt( isExpansionInMainFile());
有一个类似的匹配器,isExpansionInSystemHeader
.