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() 方法的主体块存储在 中Block block,我可以删除 hello(); ExpressionStatements 在块中。

然后,我需要将 插入Block blhello();调用的位置。我试过

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

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

whereposition是 statements() 中方法的位置hello(),但它们都会引发错误。

可能有什么问题?Block照原样,Statement我猜一个可以插入BlockBlock#statements()

在此处输入图像描述

添加

基于sevenforce的回答,我可以插入块,但我已经{包含了}

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()。例如,与

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

我只System.out.println("hello");内联。

4

2 回答 2

2

add抛出异常有几个原因。通常,特定的异常应该给你一个提示。例如要添加的节点必须在同一个AST.

在您的情况下,我猜您尝试添加相同的block对象,该对象已在MethodDeclaration节点中使用,hello()并且每个节点只允许有一个父节点。

一个可能的解决方案是复制节点:

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 回答