【问题标题】:Is it possible LibTooling doesn't change headers?LibTooling 是否可能不会更改标题?
【发布时间】:2017-07-18 01:16:58
【问题描述】:

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

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

那么有没有办法让 LibTooling 只处理输入文件?

【问题讨论】:

    标签: clang llvm llvm-clang libtooling


    【解决方案1】:

    这里有两种可能性:如果使用 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。

    【讨论】:

    • 非常感谢你。事实上,我正在使用文件路径来识别系统头文件,这看起来很愚蠢。我将使用 isInSystemHeader 来改进我的代码。再次感谢你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2014-12-20
    相关资源
    最近更新 更多