4

我目前正在使用 eclipse AST 来生成源代码。除了在大多数示例中,我从头开始生成源代码并在一个独立的应用程序中,而不是一个 Eclipse 插件。

当从 ASTParser 读入时,您可以通过调用 激活修改recordModifications(),但是当从头开始创建 AST 时,这不起作用,例如通过调用newCompilationUnit().

Document因此,无法通过 a 将源写入文件TextEdit- 有一个异常表示尚未启用修改记录。
从头开始生成 AST 并写入文件的任何经验?谢谢!

4

5 回答 5

2

为什么不先创建文件,然后从中生成 AST,如下所示:

ICompilationUnit unit = JavaCore.createCompilationUnitFrom(file);
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setResolveBindings(true);
parser.setSource(unit);
// Parse the source code and generate an AST.
CompilationUnit ast = (CompilationUnit) parser.createAST(null);

如果文件是新创建的并且是空白的,那么大概 AST 将是空的,然后您可以替换ast对象的根并将其写入文件。此外,如果您没有绑定到 Eclipse,您可以使用 JSR199 标准做同样的事情,并以正常方式将该 AST 写入文件。请参阅此处了解介绍。

于 2012-04-21T21:52:06.070 回答
1

谢谢你的建议!与此同时,我找到了一种通过内部类“ASTFlatener”发出源代码的方法,该类创建了一个 AST 的字符串表示。这对我来说效果很好......

于 2012-04-23T19:41:04.423 回答
1

我一直在努力寻找同一个问题的答案。根据上面的答案,到目前为止我发现的最优雅的解决方案如下:

ASTParser parser = ASTParser.newParser(AST.JLS4);
parser.setCompilerOptions(....);

Document document = new Document("");
parser.setSource(document.get().toCharArray());
CompilationUnit unit = (CompilationUnit)parser.createAST(null);
unit.recordModifications();

TextEdit edits = unit.rewrite(document, null);
edits.apply(document);

// now write document.get() to file
于 2013-07-15T11:40:50.797 回答
0

如果您从头开始生成源,也许您可​​以编写能够解析到临时文件的最小源,将您的修改应用于 Ast,然后将其作为文本编辑写回该文件,就像您不这样做一样。然后阅读源码。然后,您可以将其转移到您想要的任何地方。

可能有一个更优雅的解决方案,但这可能有效。

于 2012-04-21T19:37:34.087 回答
0

从 AST 创建一个编译单元后,我正在做:

AST ast = AST.newAST(AST.JLS4);    
CompilationUnit unit = ast.newCompilationUnit();

...填充编译单元,然后...

package.createCompilationUnit(className + ".java", unit.toString(), true, null);

其中:
package= IPackageFragment
className= String(生成的类名)
unit=> CompilationUnitast
true=> 强制替换
null=> 进度监视器

于 2013-06-12T14:12:14.877 回答