使用eclipse jdt / ast内联java代码

时间:2012-10-08 20:41:22

标签: java eclipse abstract-syntax-tree eclipse-jdt

我正在尝试使用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");
    }
}

我可以将Block bl中存储的hello()方法的主体块。

我还将main()方法的body块存储在Block block中,我可以删除hello(); ExpressionStatement在街区。

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

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

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

其中position是语句()中hello()方法的位置,但它们都引发了错误。

可能有什么问题?由于BlockStatement,我想可以在Block中插入Block#statements()

enter image description here

ADDED

基于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");
    }
    }
}

有没有办法删除它们?

ADDED2

使用此代码:

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");内联。

2 个答案:

答案 0 :(得分:2)

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

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

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

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));

答案 1 :(得分:1)

您可以考虑替换方法调用,而不是添加到块中。

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

rewriter.replace(methodInvocationNode, blockNode, null);