LibTooling是否有可能不更改标题?



我有一个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.

最新更新