如何访问局部变量(函数内的变量)和头文件中的变量的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
。对于变量声明,它将是 IASTSimpleDeclaration
,decl-specifier 是 IASTSimpleDeclSpecifier
或 IASTNamedTypeSpecifier
(您还想检查 declarator is not an IASTFunctionDeclarator
,以过滤掉不是定义的函数声明)。
语义上。如果找到声明的 IASTName
,则可以调用 IASTName.resolveBinding()
,并检查 returned 绑定是 IFunction
还是 IVariable
。
2) 如何获取函数的return类型和变量类型?
对于这些任务,您需要获取绑定。变量的类型可以通过 IVariable.getType()
查询,函数的 return 类型可以通过 IFunction.getType().getReturnType()
.
查询
3) 有没有办法从 IASTSimpleDeclaration
得到 ICElement
?
没有我所知道的简单方法。但是,您不需要 - 如果您正在遍历 AST,那么您可能需要的所有信息都可以在 AST 中找到。
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
。对于变量声明,它将是IASTSimpleDeclaration
,decl-specifier 是IASTSimpleDeclSpecifier
或IASTNamedTypeSpecifier
(您还想检查 declarator is not anIASTFunctionDeclarator
,以过滤掉不是定义的函数声明)。语义上。如果找到声明的
IASTName
,则可以调用IASTName.resolveBinding()
,并检查 returned 绑定是IFunction
还是IVariable
。
2) 如何获取函数的return类型和变量类型?
对于这些任务,您需要获取绑定。变量的类型可以通过 IVariable.getType()
查询,函数的 return 类型可以通过 IFunction.getType().getReturnType()
.
3) 有没有办法从 IASTSimpleDeclaration
得到 ICElement
?
没有我所知道的简单方法。但是,您不需要 - 如果您正在遍历 AST,那么您可能需要的所有信息都可以在 AST 中找到。