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
)导航到正文
我正在使用 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
)导航到正文