我正在使用 ASTVisitor 类的实现来检索有关代码中 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);
函数.c
#include "functions.h"
void func1(void) {
printf("Function 1!\n");
}
void func2(void) {
printf("Function 2!\n");
}
现在,我需要检索 func1 和 func2 函数的主体,而我的 ASTVisitor 正在从 main.c 源文件收集信息。
有没有可能的方法来检索引用的 CDTNames 的值(函数调用、常量等)- 函数体(CASTCompoundStatements)、常量值?我尝试调试引用函数的 CASTFunctionCallExpression 值,但找不到有关其来源和主体的任何信息。可能有一个查找器类吗?
请您参考如下方法:
在 CDT 中,AST 是按文件构建的。因此,如果您有文件 1 的 AST,并且它引用文件 2 中定义的函数,则该函数的主体将不会出现在文件 1 的 AST 中。
如果您需要函数主体,则还需要为文件 2 构建 AST。
假设您的项目已被索引,您可以执行以下操作:
- 导航到
IASTName节点,该节点表示文件 1 的 AST 中的函数名称。 - 调用
IASTNode.resolveBinding()以获取表示被调用函数的IBinding对象。 - 使用
IIndex.findDefinitions(IBinding)查找函数定义在项目中的位置。这将为您提供一个IIndexName,表示函数定义站点处的名称。IIndex对象可以使用以下方式获取:IASTTranslationUnit.getIndex()。
- 使用
IIndexName.getFile()识别包含定义的文件(以下称为“文件 2”) - 为文件 2 构建 AST
- 要在 AST 中查找文件 2 的定义,您可以使用
IASTTranslationUnit.getNodeSelector().findName(),传入IIndexName的偏移量和长度 - 将 AST 从您找到的定义(
IASTName)导航到正文
