我正在尝试使用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()
方法的位置,但它们都引发了错误。
可能有什么问题?由于Block
为Statement
,我想可以在Block
中插入Block#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");
}
}
}
有没有办法删除它们?
使用此代码:
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");
内联。
答案 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);