我试图提取c ++源代码的信息。 一个是现场的类型。
当像我这样的源代码想要在调用info.call()时提取信息类型时。
Info info;
//skip
info.call(); //<- from here
通过访问访问IASTName节点的访问者,我尝试提取类似于下的类型信息。
public class CDTVisitor extends ASTVisitor {
public CDTVisitor(boolean visitNodes) {
super(true);
}
public int visit(IASTName node){
if(node.resolveBinding().getName().toString().equals("info"))
System.out.println(((IField)node.getBinding()).getType());
// this not work properly.
//result is "org.eclipse.cdt.internal.core.dom.parser.ProblemType@86be70a"
return 3;
}
}
答案 0 :(得分:1)
假设代码实际上是有效的,解析为ProblemType
的变量类型表示在运行此代码的任何工具或插件中的配置问题,或者在包含代码的项目/工作空间中它运行了。
在这种情况下,变量info
的类型是Info
,可能是类或结构类型,或者是typedef。要正确解决它,CDT需要能够看到此类型的声明。
如果此类型未在被分析的同一文件中声明,而是在该文件包含的头文件中声明,则CDT需要使用项目的索引来查找声明。这意味着:
AST必须基于索引。例如,如果使用ITranslationUnit.getAST
创建AST,则必须使用带有IIndex
参数的重载,并且必须为其提供非null参数。
由于IIndex
与CDT项目相关联,因此被分析的代码需要成为CDT项目的一部分,并且需要对项目编制索引。
为了让索引器正确解析#include
指令,需要正确配置项目的包含路径,以便索引器实际上可以找到要解析的正确头文件。
其中任何一种情况都不会导致类型解析为ProblemType
。
答案 1 :(得分:0)
自我反应。 我无法获得绑定对象的原因是AST的类型。
当尝试解析C ++源代码时,我应该使用ICPPASTTranslationUnit。 没有相关的代码,我使用IASTTranslationUnit作为AST的返回类型。
使用ICPPASTTranslationUnit而不是IASTTranslationUnit后,我解决了这个问题。