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

Eclipse CDT插件-检索引用的CDTName值-函数体和常量值,eclipse,plugins,eclipse-plugin,eclipse-cdt,Eclipse,Plugins,Eclipse Plugin,Eclipse Cdt,我正在使用ASTVisitor类的实现在代码中检索关于CDT节点的信息。这可以按预期工作,但是我无法确定如何从另一个文件检索CASTFunctionCallExpression节点的BodyStatement节点,或者如何从不同的文件检索任何其他引用的CDTName节点(例如,从另一个文件检索引用的常量,我无法检索该常量的值-我缺少所需的节点) 例如,我有以下代码: main.c 职能.c 现在,我需要检索func1和func2函数的主体,而我的ASTVisitor正在从main.c源文件收集信

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

例如,我有以下代码:

main.c

职能.c

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


是否有任何可能的方法来检索引用的CDTNAME(函数调用、常量等)的值—函数体(CASTCompoundStatements)、常量值?我试着调试引用函数的CASTFunctionCallExpression值,但找不到关于它们的起源以及它们的主体的任何信息。是否有一个查找器类用于此目的?

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

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

假设项目已编制索引,则可以执行以下操作:

  • 导航到文件1的AST中表示函数名称的
    IASTName
    节点
  • 调用
    IASTNode.resolveBinding()
    以获取表示被调用函数的
    IBinding
    对象
  • 使用
    IIndex.findDefinitions(IBinding)
    在项目中查找函数定义的位置。这将为您提供一个
    IIndexName
    ,表示函数定义站点上的名称。
    • 可以使用例如
      IASTTranslationUnit.getIndex()
      获得
      IIndex
      对象
  • 使用
    IIndexName.getFile()
    标识包含定义的文件(以下简称“文件2”)
  • 为文件2生成AST
  • 要在AST中查找文件2的定义,可以使用
    IASTTranslationUnit.getNodeSelector().findName()
    ,从
    IIndexName
  • 将AST从找到的定义(即
    IASTName
    )导航到正文

谢谢你的帮助。但是,我对
IIndex
有一个问题。我尝试从file1传递的
IASTTranslationUnit
对象中检索。但是,即使在我试图更改eclipse的C/C++首选项窗口中的索引器设置时,它也会返回null。你知道我可能做错了什么,或者是否有不同的方法来获取
IIndex
对象吗?我还从
CoreModelUtil.findTranslationUnit(file.getAST()
)检索了AST。实际上,通过使用从这里检索
IIndex
对象的方法解决了这个问题-但是:为文件2构建AST的正确方法是什么?我使用IIndexFile像这样构建AST
itTranslationUnit=(ITranslationUnit)CoreModel.getDefault().create(URIUtil.toPath(fileofffunctiondefinition.getLocation().getURI());
然后只使用了
getAST()
方法。其他一切都正常工作,谢谢!
#include <stdlib.h>
#include <stdio.h>
#include "functions.h"

int main(void) {
    func1();
    func2();
    return 0;
}
void func1(void);
void func2(void);
#include "functions.h"

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

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