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()
が、どちらもエラーが発生します。
何が間違っている可能性がありますか? そのまま、に挿入できるBlock
とStatement
思います。Block
Block#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");
インライン化しただけです。