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

时间:2018-04-20 05:27:44

标签: eclipse eclipse-plugin eclipse-cdt

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

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

1 个答案:

答案 0 :(得分:1)

本地变量

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

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

包含的头文件中的变量

这里有两个子类:项目目录中的头文件和项目目录外的头文件。

项目目录中的标题文件有自己的ITranslationUnit,您可以使用ICElement API或AST API来分析它们{{1} }作为一个起点。请注意,不需要在编辑器中打开文件即可获取ITranslationUnit。您可以使用ITranslationUnit之类的内容遍历项目中的所有文件,并以ICElementVisitor作为说明点。

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

编辑:其他提示

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

我可以想到两种方式:

  • 从语法上讲,基于AST的结构。对于函数定义,声明节点的类型将为IIndexFile.findNames()。对于变量声明,它将是IASTFunctionDefintion,其中 decl-specifier IASTSimpleDeclarationIASTSimpleDeclSpecifier(您还需要检查声明符< / em>不是IASTNamedTypeSpecifier,用于过滤掉非定义的函数声明。

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

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

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

3)有没有办法从IFunction.getType().getReturnType()获得ICElement

我所知道的并不是一种简单的方法。但是,您不应该 - 如果您正在遍历AST,则可以在AST中找到您想要的所有信息。