如何使用CDT解析器获取字段的类型

时间:2017-02-04 02:26:53

标签: parsing eclipse-cdt visitor

我试图提取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;
    }
}

2 个答案:

答案 0 :(得分:1)

假设代码实际上是有效的,解析为ProblemType的变量类型表示在运行此代码的任何工具或插件中的配置问题,或者在包含代码的项目/工作空间中它运行了。

在这种情况下,变量info的类型是Info,可能是类或结构类型,或者是typedef。要正确解决它,CDT需要能够看到此类型的声明。

如果此类型未在被分析的同一文件中声明,而是在该文件包含的头文件中声明,则CDT需要使用项目的索引来查找声明。这意味着:

  • AST必须基于索引。例如,如果使用ITranslationUnit.getAST创建AST,则必须使用带有IIndex参数的重载,并且必须为其提供非null参数。

  • 由于IIndex与CDT项目相关联,因此被分析的代码需要成为CDT项目的一部分,并且需要对项目编制索引。

  • 为了让索引器正确解析#include指令,需要正确配置项目的包含路径,以便索引器实际上可以找到要解析的正确头文件。

    < / LI>

其中任何一种情况都不会导致类型解析为ProblemType

答案 1 :(得分:0)

自我反应。 我无法获得绑定对象的原因是AST的类型。

当尝试解析C ++源代码时,我应该使用ICPPASTTranslationUnit。 没有相关的代码,我使用IASTTranslationUnit作为AST的返回类型。

使用ICPPASTTranslationUnit而不是IASTTranslationUnit后,我解决了这个问题。