2017-02-04 106 views
2

我正试图提取C++源代码的信息。 一个是字段的类型。如何通过使用CDT解析器获取字段的类型

当下面的源代码想要在调用info.call()时提取info的Type。

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 "[email protected]" 

     return 3; 
    } 
} 

回答

0

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

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

使用ICPPASTTranslationUnit代替IASTTranslationUnit后,我解决了这个问题。

+0

酷!你如何使用ICPPASTTranslationUnit?我正在使用Eclipse CDT进行独立C++解析,并且还需要解决绑定问题。我写了一些代码,但AST没有正常工作。如果你能分享你的代码,我会很感激。 –

+0

@FelipeGomes解决绑定你需要使用索引器,但索引器已与eclipse studio耦合。 –

1

假设代码就是有效的,变量的类型分辨到ProblemType是在任何工具或插件的配置问题的指示正在运行该代码,或在项目/工作区包含代码在其上它运行。

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

如果这个类型在多数民众赞成被分析的同一文件中声明,而是由该文件中包含头文件,CDT需要使用该项目的指数寻找报关。这意味着:

  • AST必须是基于索引的。例如,如果使用ITranslationUnit.getAST创建AST,则必须使用接受IIndex参数的超载,并且必须为其提供非空参数。

  • 由于一个IIndex与CDT项目相关,所分析的代码需要是CDT项目的一部分,并且该项目需要被编入索引。

  • 为了让索引器正确解析#include指令,需要正确配置项目的包含路径,以便索引器能够真正找到正确的头文件进行解析。

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

+0

是的!我只是把nul值给Index。我认为这是重点。 是否有任何DOC。或例子看看如何使用索引? –

+0

@ Ui-GyunJeong:也许https://wiki.eclipse.org/images/c/c7/CDT_APIs_for_code_introspection.pdf有帮助吗?总的想法是,代码需要在一个项目中,并从项目中获得索引。 – HighCommander4

+0

@ Ui-GyunJeong:这可能也是有用的背景信息:https://wiki.eclipse.org/CDT/designs/Overview_of_Parsing – HighCommander4

相关问题