java - 使用 eclipse jdt/ast 内联 java 代码

标签 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()方法的主体 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()方法的位置,但是两者都会引发错误。

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

enter image description here

添加

根据 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/

相关文章:

java - Java中JOptionPane的ConfirmDialog

java - 将包含外部 CSS 的 SVG 转换为图像 java

java - 将 windows javac 命令转换为 linux

eclipse - “org.gradle.tooling.BuildException: Could not run build action using Gradle distribution”

Java 已启动但返回退出代码 = 13

java - ANTLR 4 和 AST 访问者

java - 无法在我的系统中配置 Struts

java - 如何将eclipse中的静态方法移动到不同的类

java - 在非 Eclipse 环境中使用 Eclipse JDT SDK 生成 AST 时出现异常

python - 如何使用 Python 的 ast 创建类型化返回? - `def f() -> bool: return True`