如何使用JDT / AST将代码段添加到方法体

我正在尝试使用JDT / AST生成Java源代码。 我现在有MethodDeclaration,并希望将代码片段(来自其他来源)添加到方法体。 代码段可以包含任何Java代码, 甚至是语法无效的代码 。 我只是找不到这样做的方法。

使用JCodeModel,您将使用JBlock#directStatement(String s)方法 。

有没有办法用JDT / AST做到这一点?

由于您有一个格式良好的树用于应用程序的其余部分,并且您希望在特定位置插入非格式良好的文本,因此您几乎无法使用标准树节点插入机制来执行此操作。

重要的是,您为有效的程序文本生成文本,并将片段插入到正确的位置。 在某处必须有一段逻辑将AST打印为文本。 您需要做的是要求将AST打印为文本,并在该过程的中间,在必要的精确点处捕获它,以插入您的任意文本。

我们的DMS软件重新设计工具包在其prettyprinter中进入/退出打印节点挂钩,以允许发生这种情况。

如果JDT / AST中不存在这样的东西,你可以尝试修改它的prettyprinter来为你提供这个钩子。 或者,您可以考虑通过添加另一个不属于标准集的树节点类型来修改JDT / AST,该节点类型只包含任意文本,但其作用类似于方法节点。 据推测,每个节点控制打印的内容; 然后你可以为那个树节点定义漂亮的打印,使它输出它的文本。

最后一个真正的hacky解决方案:在任意文本的位置插入一个完全有效的AST,其中包含一个具有唯一名称的虚假标识符,例如ZZZ。 然后,将AST打印到字符串,并对字符串进行后处理,以使用实际用户文本替换包含唯一名称的伪树。

首先需要将代码段解析为AST。 您可以使用ASTParser API来实现此目的。

可以获得编译单元的编译问题(请参阅CompilationUnit.getProblems() )。

有几种方法可以使用JDT修改Java代码 。 我建议您考虑使用ASTRewrite API来修改方法体。