4

我知道JavaParser在 AST 上运行,但我很好奇是否可以在与另一行相同的行上添加新语句。让我举例说明我想要实现的目标。

示例输入X.java(不要介意“逻辑”):

public class X {
    public static void main(String[] args) {
        int a = 1;
        while(a < 100) {
            a *= 2;
        }
    }
}

我想要实现的是System.out.println("End of loop reached");在每个循环体的末尾添加语句 - 但是,如果可能的话,我想在循环体中的最后一个语句旁边添加这个新语句。因此,结果应如下所示:

public class X {
    public static void main(String[] args) {
        int a = 1;
        while(a < 100) {
            a *= 2; System.out.println("End of loop reached");
        }
    }
}

目前我使用以下访问者(用 Kotlin 编写),只是为了了解 JavaParser。然而,这会导致为打印语句添加新行。关于如何指示 JavaParser 在同一行添加新节点的任何想法?

class WhileVisitor : VoidVisitorAdapter<Void>() {
    override fun visit(whileStatement: WhileStmt, arg: Void?) {
        super.visit(whileStatement, arg)
        val oldBody = whileStatement.body
        if (oldBody.isBlockStmt) {
            (oldBody as BlockStmt).addStatement("System.out.println(\"End of loop reached\");")
        } else {
            whileStatement
                .createBlockStatementAsBody()
                .addStatement(oldBody)
                .addStatement("System.out.println(\"End of loop reached\");")
        }
    }
}
4

0 回答 0