我正在尝试使用JDT / AST生成Java源代码。我现在有MethodDeclaration并且想要将代码片段(来自其他来源)添加到方法主体。代码段可以包含任何Java代码,甚至语法无效代码。我找不到这样做的方法。
使用JCodeModel,您可以使用JBlock#directStatement(String s) method。
有没有办法用JDT / AST做到这一点?
答案 0 :(得分:9)
由于您有一个格式良好的树用于应用程序的其余部分,并且您希望在特定位置插入非格式良好的文本,因此您几乎无法使用标准树节点插入机制来执行此操作。
重要的是,您为有效的程序文本生成文本,并将片段插入到正确的位置。在某处必须有一段逻辑将AST打印为文本。您需要做的是要求将AST打印为文本,并在该过程的中间,在必要的精确点处捕获它,以插入您的任意文本。
我们的DMS软件重新设计工具包在其prettyprinter中进入/退出打印节点挂钩,以允许发生这种情况。
如果JDT / AST中不存在这样的东西,你可以尝试修改它的prettyprinter来为你提供这个钩子。或者,您可以考虑通过添加另一个不属于标准集的树节点类型来修改JDT / AST,该节点类型只包含任意文本,但其作用类似于方法节点。据推测,每个节点控制打印的内容;然后你可以为那个树节点定义漂亮印刷,使它输出文本。
最终真正的hacky解决方案:在任意文本的位置插入一个完全有效的AST,其中包含一个具有唯一名称的虚假标识符,例如ZZZ。然后,将AST打印到字符串,并对字符串进行后处理,以将包含唯一名称的伪树替换为实际用户文本。
答案 1 :(得分:3)
首先需要将代码段解析为AST。您可以使用ASTParser
API来实现此目的。
可以获得编译单元的编译问题(参见CompilationUnit.getProblems()
)。
modify Java code using JDT有两种方法。我建议您考虑使用ASTRewrite
API来修改方法的主体。
答案 2 :(得分:0)
您可以使用ASTParser API操作AST-甚至不必编译输出。
以下是您的案例的一个例子:
String textToInsert = "Some text";
StringLiteral stringLiteral = methodDeclaration.getAST().newStringLiteral();
rewriter.set(stringLiteral, StringLiteral.ESCAPED_VALUE_PROPERTY, textToInsert, null);
ListRewrite methodStatements = rewriter.getListRewrite(methodDeclaration.getBody(), Block.STATEMENTS_PROPERTY);
methodStatements.insertFirst(stringLiteral, null);
结果:
public void myMethod() {
Some text
}