1

ソース コード内のすべての変数のIField または IJavaElement 参照を取得する必要があります。私はプラグインを使用し、次を使用してすべてのトップレベル オブジェクトを読み取ることができる ICompilationUnit を取得します。

for( IJavaElement i:unit.getTypes()[0].getChildren() )

また

for( IJavaElement i:unit.getAllTypes() )

ローカル変数にアクセスするにはどうすればよいですか? ICompilationUnit を CompilationUnit に解析しようとしましたが、ここで各 field の ASTNode を取得できますが、それを IField に変換することはできません。何か案は?

//編集: 例: クラスの場合:

パブリック クラス テスト {

int グローバル 1; int global2; ボイド a() { global1 = 4; int local1; int local2 = 5; }

}

電話する

for (IType タイプ : unit.getTypes()) { System.out.println("itype "+type); for (IField iField : type.getFields()) { System.out.println("iField "+iField); }}

出力は次のとおりです。

itype class Test [in [作業コピー] Test.java [in [in src [in testowy]]] int global1 int global2 void a() iField int global1 [in Test [in [作業コピー] Test.java [in [ in src [in testowy]]]]] iField int global2 [in Test [in [作業コピー] 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++;
            }

        }

このコードは、すべてのメソッドを検索し (機能する)、メソッドからすべてのローカル変数を取得する (機能しない) ことを期待していました。フィールドでループに入ることはありません。関数宣言を正しく出力するので、すべての変数が表示されると確信しています...

また、INodes の使用に関しては、すべてのノードにアクセスできますが、タイプを Node から必要な IField/IJavaElement に変更するにはどうすればよいですか?

ありがとう :)

4

1 に答える 1

1

タイプのフィールドを取得したいだけの場合は、次のように実行できます。

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

ただし、すべての変数宣言 (フィールドとローカル変数の両方) を見つけたい場合は、ASTVisitorを使用することをお勧めします。これはAST全体を訪問し、必要なAST要素の訪問メソッドを実装するだけで済みます。あなたの場合、それはVariableDeclarationFragmentになると思います。

于 2011-05-14T09:51:08.583 に答える