ITranslationUnit和IASTTranslationUnit接口分别代表单个C / C ++源文件的转换单元和AST。
有没有办法获得整个C ++项目的AST,还是我需要从主文件的AST开始并浏览include指令并为每个源单元生成一个单独的AST?
感谢。
答案 0 :(得分:3)
CDT的AST并非旨在扩展到整个项目。一旦你开始进入10000+ LOC范围,它可能会开始表现得非常糟糕。
为了进行跨文件分析,CDT有一个索引器,它解析项目中的每个文件(一次一个),并构建一个有关项目代码信息的数据库,整体(称为索引)。通过接口IIndex
访问索引,可以通过在任何AST上调用IASTTranslationUnit.getIndex()
来获取其实例(例如)。
大多数代码分析和操作用例都属于以下工作流程之一:
只需使用索引即可。 IIndex
为您提供了很多帮助,例如:
findBindings()
的各种重载,以查找与名称或名称前缀匹配的绑定findReferences(binding)
为您提供绑定的所有引用findDeclarations(binding)
为您提供绑定的所有声明
和许多其他人。这就是编辑器导航功能如Open Declaration和Call Hierarchy的工作方式。
使用索引标识需要AST的一小组源文件,然后解析它们。这就是重构的工作方式。例如,重命名重构使用索引来定位正在重命名的绑定的使用,然后为包含这些用于执行重构的用途的文件创建AST。
如果以上两者都不够好并且您确实需要项目中每个文件的AST级信息,请为项目中的每个文件创建一个AST,一次一个,并提取您需要的信息从每一个。这就是索引器本身的工作方式。 (请注意,如果选择此选项,则不需要导航包括列出需要解析的所有文件。相反,您只需枚举项目中的所有文件。请参阅PDOMRebuildTask.createDelegate()
一个例子。)
如果您更多地了解您的用例,我可能会提供更具体的建议。