我正在尝试使用 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()方法的主体 block 。
我还将 main() 方法的主体 block 存储在 Block block
中,我可以删除 hello(); block 中的ExpressionStatement
。
然后,我需要将 Block bl
插入到调用 hello();
的位置。
我试过了
block.statements().add(position, bl.getAST());
和
block.statements().add(position, bl);
其中position
是statements()中hello()
方法的位置,但是两者都会引发错误。
可能出了什么问题?由于Block
是Statement
,我想可以在Block#statements()
中插入Block
。
添加
根据 Sevenforce 的回答,我可以插入该 block ,但我包含了 {
和 }
。
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));
<小时/>
要添加 block 中的所有语句,您只需循环即可:
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));
}
关于java - 使用 eclipse jdt/ast 内联 java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12789147/