如何访问局部变量(函数内的变量)和头文件中的变量的ICElements?

How to access the ICElements of local variables(variables inside function) and variables in header file?

Objective是访问eclipse中C文件的元素,检查C元素(全局变量、局部变量、函数声明)的自定义命名规则。 尝试访问 C 文件元素,如下所述。在这种情况下,只能访问.c 文件中的全局变量和函数名。 如何访问局部变量(函数内的变量)和包含的头文件中的变量?

ITranslationUnit tu = CUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy(输入); ICElement[] ele= src.getChildren();

局部变量

ICElement 主要用于表示 CDT 的各种 视图 中的代码元素,例如大纲视图或类型层次结构。因此,局部变量(未出现在这些视图中)没有 ICElement 表示。

对于像这样的代码分析用例,最好使用 AST API。 AST 是文件中整个代码的详细表示。它可以通过 ITranslationUnit.getAST() 访问。然后,您可以使用 ASTVisitor 遍历 AST 并访问您喜欢的任何声明并检查它们的名称。

包含头文件中的变量

这里有两个子类:工程目录内的头文件和工程目录外的头文件。

项目目录中的头文件有自己的ITranslationUnit,您可以使用ICElement API或AST API 以 ITranslationUnit 为起点分析它们。请注意,无需在编辑器中打开文件即可为其获取 ITranslationUnit。您可以使用类似 ICElementVisitor 的方式遍历项目中的所有文件,并以 ICProject 作为声明点。

项目目录外的头文件没有ITranslationUnit,并且没有直接的方法为它们获取AST。但是,假设您的项目的 indexer 已启用,索引器会为它们创建 AST,并将来自这些 AST 的信息存储在项目的 index 中,您可以检查。有索引API可以用来遍历索引;一些相关的是 IIndexManager.getIndex(ICProject)IIndex.getAllFiles()IIndexFile.findNames().

编辑:附加提示

1) 如何区分函数声明和简单声明。

我可以想到两个办法:

  • 语法上,基于 AST 的结构。对于函数定义,声明节点的类型将为 IASTFunctionDefintion。对于变量声明,它将是 IASTSimpleDeclarationdecl-specifierIASTSimpleDeclSpecifierIASTNamedTypeSpecifier(您还想检查 declarator is not an IASTFunctionDeclarator,以过滤掉不是定义的函数声明)。

  • 语义上。如果找到声明的 IASTName,则可以调用 IASTName.resolveBinding(),并检查 returned 绑定是 IFunction 还是 IVariable

2) 如何获取函数的return类型和变量类型?

对于这些任务,您需要获取绑定。变量的类型可以通过 IVariable.getType() 查询,函数的 return 类型可以通过 IFunction.getType().getReturnType().

查询

3) 有没有办法从 IASTSimpleDeclaration 得到 ICElement

没有我所知道的简单方法。但是,您不需要 - 如果您正在遍历 AST,那么您可能需要的所有信息都可以在 AST 中找到。