1

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

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

现在我正在通过比较我匹配的节点的源文件与 argv 中的参数来处理这个问题,但不用说,这感觉不对,因为它仍然解析所有iostream代码 - 它只是在这样做时忽略它。我简直不敢相信没有办法只告诉 ClangTool 类似:

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

考虑一下,只有可以为每个源文件单独创建 AST 才有意义,但我确实需要它们彼此了解或共享上下文知识,而且我也没有找到一种方法来做到这一点。

我觉得我在这里遗漏了一些非常明显的东西。

提前致谢 :)

4

1 回答 1

2

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

在Code Analysis and Refactoring with Clang Tools 存储库中有几个使用这些的示例。例如,请参阅第 34 行附近的文件 lib/callsite_expander.h,其中unless(isExpansionInSystemHeader))用于排除系统标头中的调用表达式。另一个示例在 lib/function_signature_expander.h 的第 27 行,其中相同的内容用于排除系统头文件中本来会匹配的函数声明。

于 2018-04-27T05:01:55.080 回答