繁体   English   中英

使用Eclipse JDT / AST内联Java代码

[英]Inlining java code using eclipse jdt/ast

我正在尝试使用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()方法的主体块存储在Block block ,并且可以删除hello();。 块中的ExpressionStatement

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

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

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

其中positionhello()方法在statement()中的位置,但是它们都引发错误。

可能是什么问题? 由于BlockStatement ,我猜一个人可以在Block#statements()插入Block

在此处输入图片说明

添加

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

add引发异常有多种原因。 通常,特定的异常应该给您提示。 例如,要添加的节点必须在同一AST

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

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

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

您可能会想到替换方法调用,而不是添加到块中。

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

rewriter.replace(methodInvocationNode, blockNode, null);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM