LibTooling有可能不改变标题吗?

时间:2017-07-18 01:16:58

标签: clang llvm llvm-clang libtooling

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

不幸的是,这个工具也会改变标题,甚至是系统库。

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

1 个答案:

答案 0 :(得分: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