2011-05-14 15 views
1

我需要得到對於我的源代碼中的所有變量,IField或IJavaElement引用。我使用的插件,獲取從中我能用來讀取所有頂級對象ICompilationUnit:所有變量的IFields來自CompilationUnit

爲(IJavaElement我:unit.getTypes()[0] .getChildren())

爲(IJavaElement我:unit.getAllTypes())

如何訪問局部變量?我試圖解析ICompilationUnit CompilationUnit,其中我可以得到每個字段的ASTNode,但然後我無法將其轉換信息IField。有任何想法嗎?

//編輯: 例如: 對於一類:

公共類測試{

INT GLOBAL1; int global2; void a() {global} = 4; int local1; int local2 = 5; }

}

我打電話

爲(ITYPE類型:unit.getTypes()){ 的System.out.println( 「ITYPE」 +型);對於(IField iField:type.getFields()){ System.out.println(「iField」+ iField); }}

,輸出是:

ITYPE類測試[在[工作副本] Test.java [在[src中[在 testowy]]]] INT GLOBAL1 INT global2無效a()iField int global1 [in Test [in [工作副本] Test.java [in [in src [in testowy]]]]] iField int global2 [in Test [in [Working copy] Test .java [in [in src [in testowy]]]]]

因此,沒有局部變量被發現......

//添加 - 還在掙扎: 其實這不是我所期待的行爲。

for(IMethod i:unit.getAllTypes()[0].getMethods()) 
     { 
     System.out.println("index to h:"+h+" type "+i.getSource()+" name: "+i.getElementName()); 
     h++; 
     int o =0; 
     for(IJavaElement j: i.getChildren()) 
      { 
       System.out.println("index to o: "+o+j+" type "+j.getElementType()+" name: "+j.getElementName()); 
       o++; 
      } 

     } 

此代碼我希望能夠找到的所有方法(的作品),並從方法的所有局部變量(即不工作)。它永遠不會進入字段循環。它正確打印函數聲明,所以我確信它可以看到所有變量...

至於使用INode,我可以訪問所有節點,但我怎麼能改變從節點到我需要的IField/IJavaElement類型?

謝謝:)

回答

1

如果你只想得到一個類型的字段,你可以做這樣的:

for (IType type : iCompilationUnit.getTypes()) { 
    for (IField iField : type.getFields()) { 
     .... 
    } 
} 

但是,如果你想找到的所有變量聲明(這兩個領域和局部變量),你最好使用ASTVisitor。這將訪問你的整個AST,你只需要實現所需AST元素的訪問方法,在你的情況下,我想這將是VariableDeclarationFragment的。

+0

感謝您的提示:)。不幸的是它不起作用。它仍然只訪問全局變量。我在我的問題中添加了更多細節。 – 2011-05-14 10:13:54

+0

這是預期的行爲,那些不是'IField'的。也爲答案添加了其他信息。 – wjans 2011-05-14 11:22:21