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

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

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

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


答案 1

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

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

我们的DMS软件再造工具包在其漂亮的打印机中具有进入/退出打印节点钩子,以允许这种事情发生。

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

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


答案 2

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

有可能得到编译单元的编译问题(请参阅 CompilationUnit.getProblems())。

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


推荐