0

Eclipse jdt/ast を使用して Java メソッドをインライン化しようとしています。

たとえば、私はこのコードを作りたいです

class Hello {
    static void hello() {
        System.out.println("hello");
    }

    public static void main(String[] args) {
        hello();
        System.out.println("z");
        hello();
        System.out.println("h");
        hello();
    }
}

これに。

class Hello {    
    public static void main(String[] args) {
        System.out.println("hello");
        System.out.println("z");
        System.out.println("hello");
        System.out.println("h");
        System.out.println("hello");
    }
}

に格納されている hello() メソッドの本体ブロックを取得できましたBlock bl

main() メソッドの body ブロックも に格納されているBlock blockので、hello(); を削除できます。ExpressionStatementはブロックにあります。

次に、が呼び出されBlock blた場所にを挿入する必要があります。hello();私は試した

block.statements().add(position, bl.getAST());

block.statements().add(position, bl);

wherepositionは statement() のメソッドの場所ですhello()が、どちらもエラーが発生します。

何が間違っている可能性がありますか? そのまま、に挿入できるBlockStatement思います。BlockBlock#statements()

ここに画像の説明を入力

追加した

セブンフォースの回答に基づいて、ブロックを挿入できましたが{}含まれています。

class Hello {
    public static void main(String[] args) {
    {
        System.out.println("hello");
    }
    System.out.println("z");
    {
        System.out.println("hello");
    }
    System.out.println("h");
    {
        System.out.println("hello");
    }
    }
}

それらを削除する方法はありますか?

追加2

このコードで:

ASTNode singleStmt = (ASTNode) bl.statements().get(0);
block.statements().add(position, ASTNode.copySubtree(bl.getAST(), singleStmt));

hello()methodの最初のステートメントのみを示しています。たとえば、

static void hello() {
    System.out.println("hello");
    System.out.println("hello2");
}

私はSystem.out.println("hello");インライン化しただけです。

4

2 に答える 2

2

add例外をスローする理由はいくつかあります。通常、特定の例外からヒントが得られるはずです。たとえば、追加するノードは同じ にある必要がありますAST

あなたの場合、同じオブジェクトを追加しようとしていると思います。これは、ノードでblock既に使用されており、各ノードは親を 1 つだけ持つことができます。MethodDeclarationhello()

それに対する可能な解決策は、ノードをコピーすることです:

block.statements().add(position, ASTNode.copySubtree(bl.getAST(), bl));

単一のステートメントを抽出するには、以下が機能するはずです。

ASTNode singleStmt = (ASTNode) bl.statements().get(0);
block.statements().add(position, ASTNode.copySubtree(bl.getAST(), singleStmt));

ブロックからすべてのステートメントを追加するには、ループするだけです。

for (int i = 0; i < bl.statements().size(); i++) {
     ASTNode singleStmt = (ASTNode) bl.statements().get(i);
     block.statements().add(position + i,
         ASTNode.copySubtree(bl.getAST(), singleStmt));
}
于 2012-10-08T23:06:48.470 に答える
1

ブロックに追加する代わりに、メソッド呼び出しを置き換えることを考えるかもしれません。

final ASTRewrite rewriter = ASTRewrite.create(compilationUnit.getAST());

rewriter.replace(methodInvocationNode, blockNode, null);
于 2012-10-09T06:11:50.533 に答える