clang libTooling:如何找到一个AST项目出来的头?

问题描述:

在网络上发现的用于clang工具的例子总是在玩具例子上运行,这些例子通常都是非常简单的C程序。clang libTooling:如何找到一个AST项目出来的头?

我正在构建一个在C++代码上执行源代码到源代码转换的工具,这显然是一项非常非常具有挑战性的任务,但是铿锵有力于完成这项任务。

我现在面临的问题是,clang为任何利用STL的C++代码生成的AST是巨大的。例如,我有一些C++代码,其中clang++ -ast-dump ... | wc -l是67,018行恐怖的AST gobbledygook!

99%这是标准库的东西,我打算在源到源元编程任务中忽略它。所以,为了实现这一点,我想简单地过滤掉文件。假设我只想看看我正在分析的项目头文件中的类定义(并忽略所有标准库头文件),我只需要弄清楚我的每个CXXRecordDecl是从哪里来的!

可以这样做吗?

编辑:希望this是一种方式去解决它。现在就试试这个......重要的一点是,它必须告诉我头文件decls已经出来,而不是与翻译单元对应的cpp文件。我期待在

+0

我在冒险中得到了一点进步 - 基本上这里的标准方法是使用替换。 – 2015-01-23 03:31:06

一个路径是有事情要缩小的比赛就像hasName()(如发现here例如:

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

但是上面使用-ast-dump您的评论是我试过,以及让外行我发现this post非常有帮助,用他们的建议武装起来,我用clang-check来过滤到一个特定的类名,并将它提供给我的顶级CPP文件,输出更容易管理代表类别声明和定义的百行代码

+0

匹配器中的Yep'hasName'是一个很好的事情,当你正在寻找特定的东西。与'ast-dump-filter'类似,尽管我会想象一旦你开始用很多类来检查更大的代码库,它可能会很快变得非常笨拙。希望如果它发生所有封装到一个单一的名称空间,并且'ast-dump-filter'在名称空间上工作,那么你仍然会运气好。 – 2015-05-29 15:54:28

以我迄今为止的经验,某些给定AST节点的“源”最好通过使用位置来检索。例如,每个节点至少有一个起始位置,当你打印出来时它将包含头文件路径。

然后,可以使用此路径来决定它是系统库还是您仍然有兴趣检查的应用程序代码的一部分。