clang libTooling: 如何找到 AST 中的一个项来自哪个头文件?

6
在网络上找到的clang工具示例通常都运行在玩具示例上,这些示例通常都是非常简单的C程序。
我正在构建一个对C++代码执行源到源转换的工具,这显然是一个非常具有挑战性的任务,但clang能够胜任。
我现在面临的问题是,clang为使用STL的任何C++代码生成的AST都是巨大的。例如,我有一些C++代码,对于这些代码, clang++ -ast-dump ... | wc -l 是67018行可怕的AST乱码!
其中99%是标准库内容,我希望在我的源到源元编程任务中忽略它们。因此,为了实现这一点,我想要简单地过滤掉文件。假设我只想查看我分析项目中头文件中的类定义(并忽略所有标准库头文件的内容),我将需要确定每个CXXRecordDecl来自哪个头文件!
这可以做到吗?
编辑:希望这个是一种方法。现在正在尝试这个...重要的部分是它必须告诉我decls来自哪个头文件,而不是与翻译单元对应的cpp文件。

我在我的冒险中取得了一些进展——基本上,在这里使用的标准方法是使用替换。 - Steven Lu
2个回答

1
到目前为止,根据我的经验,最好使用位置信息来检索给定AST节点的“源”。例如,每个节点至少都有一个起始位置,在打印出来时,它将包含头文件路径。然后可以使用此路径来确定它是系统库还是您仍然有兴趣检查的应用程序代码的一部分。

0

我正在考虑的一种路线是使用类似于hasName()(如此处所示)的方法来缩小匹配范围。例如:

recordDecl(hasName("MyBaseClass")) // etc.

然而,您上面使用的-ast-dump评论也是我尝试自己了解CLang工具的一种方式。我发现this post非常有帮助。根据他们的建议,我使用clang-check过滤到特定的类名,并将其提供给我的顶级CPP文件。输出是几百行,表示感兴趣的类声明和定义,更易于管理。


在查找特定内容时,Matcher 中的 hasName 是一个很好的使用方式。同样,在使用 ast-dump-filter 时也是如此,尽管我想象一旦你开始检查具有许多类的较大代码库,它可能会变得非常难以处理。希望如果所有内容都封装到单个命名空间中,并且 ast-dump-filter 可以在命名空间上工作,那么你仍然会很幸运。 - Steven Lu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接