Java 如何使用JDT/AST向方法体添加代码段

Java 如何使用JDT/AST向方法体添加代码段,java,code-generation,abstract-syntax-tree,eclipse-jdt,Java,Code Generation,Abstract Syntax Tree,Eclipse Jdt,我正在尝试使用JDT/AST生成Java源代码。现在,我已经并希望向方法体添加一个代码段(来自另一个源代码)。代码段可以包含任何Java代码,甚至语法无效的代码。我就是找不到办法 使用JCodeModel,您将使用 有没有办法用JDT/AST做到这一点?首先需要将代码片段解析为AST。为此,您可以使用API 可以获得编译单元的编译问题(请参阅) 有两种方法可以解决这个问题。我建议您考虑修改方法体的API。 ,因为在应用程序的其余部分中有一个格式良好的树,并且在特定的位置插入非格式良好的文本,几乎

我正在尝试使用JDT/AST生成Java源代码。现在,我已经并希望向方法体添加一个代码段(来自另一个源代码)。代码段可以包含任何Java代码,甚至语法无效的代码。我就是找不到办法

使用JCodeModel,您将使用


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

首先需要将代码片段解析为AST。为此,您可以使用API

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


有两种方法可以解决这个问题。我建议您考虑修改方法体的API。

,因为在应用程序的其余部分中有一个格式良好的树,并且在特定的位置插入非格式良好的文本,几乎不能用标准的树节点插入机制来完成。

重要的是,为有效的程序文本生成文本,并在正确的位置插入片段。其中的某个地方一定有一条逻辑将AST打印为文本。你需要做的是把AST打印成文本,然后在中间的过程中抓住它,在必要的精确点上插入任意的文本。 我们的DMS软件再工程工具包在其预打印器中具有进入/退出打印节点挂钩,以允许此类事情发生

如果JDT/AST中不存在这样的东西,您可以尝试修改它的prettyprinter以提供该钩子。或者,您可以考虑通过添加另一个树节点类型来修改JDT/AST,而该树节点类型不是标准集的一部分,它只保留任意文本,但行为类似于方法节点。假设每个节点控制打印的内容;然后可以为该树节点定义预打印,使其输出文本


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

您可以使用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
}

嗯,我之前检查过API引用,但是我找不到添加任意代码段的方法。考虑代码片段可能包含语法上无效的代码。(我刚刚在原始问题中添加了这个…)您可以解析任意代码段。然后,将生成的AST节点插入方法主体的AST节点。Eclipse解析器在某种程度上容忍语法错误。遗憾的是,“在某种程度上”还不够(我添加我的答案是为了包含获取编译问题的指针。这与检索编译问题无关。询问者希望向AST添加包含编译错误的代码。我相信这不可能使用任何标准JDT操作技术。AST操作通常要求您具有语法有效的树。如果你有无效的方法代码,一般来说,你将没有一个有效的树来插入,你将不能这样做,或者你可以这样做,但结果只得到一个无意义的树。好吧,JST/AST似乎不是正确的工具那么…为什么你需要插入无效的代码?我正在实现教育软件,其中UML活动诊断rams(由学生创建)应翻译为Java源代码。在图表编辑器中,可以使用任意Java代码定义操作节点,这些代码需要按原样显示在生成的代码中。然后,您可以解析代码,如果没有错误,则使用代码,如果没有错误,则将其作为注释插入。