如何使用clang工具仅解析用户定义的源文件

如何使用clang工具仅解析用户定义的源文件,clang,llvm-clang,clang-ast-matchers,Clang,Llvm Clang,Clang Ast Matchers,我正在写一个叮当作响的工具,但我对它还很陌生,所以我遇到了一个在文档中找不到的问题 我正在使用great Matchers API查找一些稍后要在AST中操作的节点。问题是,clang工具实际上会解析属于源文件的所有内容,包括iostream等头文件。 因为我的操作可能包括一些重构,所以我绝对不想触及解析器发现的每一件事情 现在我通过比较我匹配的节点的源文件和argv中的参数来处理这个问题,但是不用说,这感觉是错误的,因为它仍然解析所有的iostream代码-它只是在这样做时忽略了它。我简直不敢

我正在写一个叮当作响的工具,但我对它还很陌生,所以我遇到了一个在文档中找不到的问题

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

现在我通过比较我匹配的节点的源文件和argv中的参数来处理这个问题,但是不用说,这感觉是错误的,因为它仍然解析所有的iostream代码-它只是在这样做时忽略了它。我简直不敢相信,没有一种方法可以像这样告诉叮当工具:

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

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

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


提前感谢:)

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


在中有几个使用这些的示例。例如,请参见第34行附近的文件lib/callsite_expander.h,其中
除非(IsExpansionSystemHeader))
用于排除系统头中的调用表达式。另一个例子是lib/function\u signature\u expander.h的第27行,其中相同的用于排除系统头中可能匹配的函数声明。

,然后将整个翻译单元编译成AST。这只意味着将排除源自系统头的AST节点。