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