如何使用clang工具

时间:2018-04-26 10:36:14

标签: clang llvm-clang clang-ast-matchers

我正在写一个clang工具,但我对它很新,所以我遇到了一个问题,我在文档中找不到(还)。

我正在使用伟大的Matchers API来查找我稍后想要在AST中操作的节点。问题是,clang工具实际上会解析属于源文件的所有内容,包括 iostream 等标题。 由于我的操作可能包括一些重构,我绝对不想触及解析器找到的每一件事。

现在我通过比较我匹配的节点的sourceFiles和argv中的争论来处理这个问题,但不用说,这感觉不对,因为它仍然解析所有 iostream 代码 - 它只是在这样做时忽略它。我只是不相信没有办法告诉ClangTool像:

  

“仅匹配节点的位置源文件是用户提供给此工具的东西”

考虑到这一点,只有为每个源文件单独创建AST才有意义,但我确实需要他们相互了解或分享上下文知识,我也没想办法做到这一点任

我觉得我错过了一些非常明显的东西。

提前感谢:)

1 个答案:

答案 0 :(得分:2)

有几个缩小的匹配器可能有所帮助:isExpansionInMainFileisExpansionInSystemHeader。例如,可以将后者与unless组合以限制与不在系统文件中的AST节点的匹配。

Code Analysis and Refactoring with Clang Tools repository中有几个使用这些的例子。例如,请参阅第34行附近的文件lib / callsite_expander.h,其中unless(isExpansionInSystemHeader))用于排除系统标头中的调用表达式。另一个例子是在lib / function_signature_expander.h的第27行,其中同样用于排除系统头中的函数声明,否则这些声明将匹配。