Eclipse CDT:获取C ++项目的AST

时间:2016-12-01 11:04:25

标签: c++ eclipse eclipse-cdt

ITranslationUnit和IASTTranslationUnit接口分别代表单个C / C ++源文件的转换单元和AST。

有没有办法获得整个C ++项目的AST,还是我需要从主文件的AST开始并浏览include指令并为每个源单元生成一个单独的AST?

感谢。

1 个答案:

答案 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()一个例子。)

如果您更多地了解您的用例,我可能会提供更具体的建议。