【问题标题】:How to parse only user defined source files with clang tools如何使用 clang 工具仅解析用户定义的源文件
【发布时间】:2018-04-26 10:36:14
【问题描述】:

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

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

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

“只匹配节点,哪个位置的源文件是用户提供给这个工具的东西”

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

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

提前感谢:)

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这仍然不会阻止解析例如系统头文件,对吧?
    • 没错——系统头文件像往常一样被预处理器包含在内,然后整个翻译单元被编译成AST。这只是意味着将排除源自系统标头的 AST 节点。
    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多