Eclipse CDT 插件 - 检索引用的 CDT 名称值 - 函数体和常量值

Eclipse CDT plugin - Retrieve referenced CDTName values - function bodies and constant values

我正在使用 ASTVisitor class 的实现来检索我的代码中有关 CDT 节点的信息。这按预期工作,但是我不知道如何从另一个文件或来自不同文件的任何其他引用 CDTName 节点检索 CASTFunctionCallExpression 节点的 BodyStatement 节点(例如来自另一个我无法检索的文件的引用常量)常量的值 - 我缺少所需的节点)。

例如我有这个代码:

main.c

#include <stdlib.h>
#include <stdio.h>
#include "functions.h"

int main(void) {
    func1();
    func2();
    return 0;
}

functions.h

void func1(void);
void func2(void);

functions.c

#include "functions.h"

void func1(void) {
    printf("Function 1!\n"); 
}

void func2(void) {
    printf("Function 2!\n");
}

现在,我需要检索 func1 和 func2 函数的主体,而我的 ASTVisitor 正在从 main.c 源文件中收集信息。

是否有任何可能的方法来检索引用的 CDT 名称(函数调用、常量等)的值 - 函数体 (CASTCompoundStatements)、常量值?我尝试调试引用函数的 CASTFunctionCallExpression 值,但找不到关于它们的起源和主体的信息。可能有查找器 class 吗?

在 CDT 中,AST 是按文件构建的。因此,如果您有文件 1 的 AST,并且它引用了文件 2 中定义的函数,那么该函数的主体将不会出现在文件 1 的 AST 中。

如果需要函数体,还需要为文件 2 构建 AST。

假设您的项目已编入索引,您可以这样做:

  • 导航到代表文件 1 的 AST 中函数名称的 IASTName 节点。
  • 调用IASTNode.resolveBinding()获得一个IBinding表示被调用函数的对象。
  • 使用IIndex.findDefinitions(IBinding)查找函数定义在项目中的位置。这为您提供了一个 IIndexName 代表函数定义站点的名称。
    • IIndex 对象可以使用例如IASTTranslationUnit.getIndex().
  • 使用IIndexName.getFile()来识别包含定义的文件(以后,"file 2")
  • 为文件 2 构建 AST
  • 要在文件 2 的 AST 中查找定义,您可以使用 IASTTranslationUnit.getNodeSelector().findName(),传入 IIndexName
  • 的偏移量和长度
  • 将 AST 从您找到的定义(IASTName)导航到正文