0

我有一个 LibTooling (TimeFlag),用于为每个 forstmt/whilestmt 添加一个标志。我用来./TimeFlag lalala.cpp --在 lalala.cpp 中插入标志

不幸的是,这个工具也会改变头文件,甚至系统库。

那么有没有一些方法让 LibTooling 只处理输入文件?

4

1 回答 1

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.

于 2017-07-19T15:05:12.247 回答