[英]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);
其中position
是hello()
方法在statement()中的位置,但是它们都引发错误。
可能是什么问题? 由于Block
是Statement
,我猜一个人可以在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");
}
}
}
有什么办法可以删除它们?
使用此代码:
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.