Eclipse CDT插件-检索引用的CDTName值-函数体和常量值
我正在使用ASTVisitor类的实现在代码中检索关于CDT节点的信息。这可以按预期工作,但是我无法确定如何从另一个文件检索CASTFunctionCallExpression节点的BodyStatement节点,或者如何从不同的文件检索任何其他引用的CDTName节点(例如,从另一个文件检索引用的常量,我无法检索该常量的值-我缺少所需的节点) 例如,我有以下代码: main.c 职能.c 现在,我需要检索func1和func2函数的主体,而我的ASTVisitor正在从main.c源文件收集信息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源文件收集信
是否有任何可能的方法来检索引用的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
- 可以使用例如
- 使用
标识包含定义的文件(以下简称“文件2”)IIndexName.getFile()
- 为文件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像这样构建ASTitTranslationUnit=(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");
}