2017-02-04 108 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

相關問題