[英]Eclipse CDT: Get AST of a C++ project
ITranslationUnit和IASTTranslationUnit接口分别表示单个C / C ++源文件的转换单位和AST。
有什么方法可以获取整个C ++项目的AST,还是我需要从主文件的AST开始并浏览包含指令并为每个源单元生成单独的AST?
谢谢。
CDT的AST并非旨在扩展到整个项目。 一旦您开始进入10000+ LOC范围,它就可能开始表现很差。
为了进行跨文件分析,CDT具有一个索引器 ,该索引器解析项目中的每个文件(一次解析一个文件),并构建一个有关整个项目中的代码信息的数据库(称为index )。 索引是通过接口IIndex
访问的,该接口的实例可以通过在任何AST上调用IASTTranslationUnit.getIndex()
来获取。
大多数代码分析和处理用例属于以下工作流程之一:
只需使用索引。 IIndex
给您很多帮助,例如:
findBindings()
各种重载以查找与名称或名称前缀匹配的绑定 findReferences(binding)
为您提供对绑定的所有引用 findDeclarations(binding)
为您提供绑定的所有声明
还有很多其他 这就是打开声明和呼叫层次结构之类的编辑器导航功能的工作方式。
使用索引可以识别需要AST的少量源文件,然后对其进行解析。 重构就是这样工作的。 例如,重命名重构使用索引来定位要重命名的绑定的用途,然后为包含那些用于执行重构的用途的文件创建AST。
如果以上两种方法都不够好,并且您确实需要项目中每个文件的AST级信息,请一次为项目中的每个文件创建一个AST,然后从每个文件中提取所需的信息。 这就是索引器本身的工作方式。 (请注意,如果选择此选项,则无需导航包含以列出需要解析的所有文件。相反,您可以枚举项目中的所有文件。有关示例,请参见PDOMRebuildTask.createDelegate()
。)
如果您对用例有更多的了解,我也许可以提供更具体的建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.