2012-04-13 172 views
4

我目前正在使用eclipse AST来生成源代码。除了大多数示例以外,我正在从头开始生成源代码,并在独立应用程序中生成源代码,而不是eclipse插件。Eclipse JDT AST:如何将生成的AST写入java文件?

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

因此,通过DocumentTextEdit将源文件写入文件是不可能的 - 有一个例外情况说修改记录尚未启用。
从头开始生成AST并写入文件的任何经验? 谢谢!

+0

丰富的经验以漂亮的AST的编译为Java,但不使用Eclipse。 Eclipse是你的问题的一个要求吗? – 2012-04-13 22:44:55

+0

为什么要将“生成的AST”写入文件?也许它只是短语,但我得到一个印象,你想写一个漂亮的源文本到一个文件中,那个源文本是从AST生成的。 – 2012-04-13 23:16:22

+0

那么,我使用Eclipse是因为它被广泛使用,并且“Java开发工具”(JDT)AST实现允许往返工程,因此您可以从内存中的AST生成代码,或者可以修改现有的源代码做了最小的变化。在这种情况下,“生成”意味着AST以编程方式构建在内存中。 – 2012-04-14 10:51:18

回答

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写入文件。有关介绍,请参阅here

+0

您可以举个例子来说:“您可以替换ast对象的根目录并将其写入文件。”部分? – sevenforce 2012-07-20 13:10:57

+0

嗯。我不确定在那里我是否很清楚。如果你已经生成了Java代码文件,那么上面的代码中的'file'就是一个真正的Java文件,那么我在这里给出的代码应该正确地解析它,并给你一个你可以使用的AST ... – snim2 2012-07-20 16:56:46

0

如果您是从头开始生成源代码,也许您可​​以编写能够解析为临时文件的最小源代码,将修改应用于Ast,然后将其作为文本编辑回写到该文件中否则。然后阅读来源。然后,您可以将其传输到任何你想要的地方。

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

2

谢谢您的建议! 与此同时,我发现了一种通过内部类“ASTFlattener”发出源代码的方法,该类创建AST的字符串表示形式。这工作得很好,我....

+0

这是最好的答案,因为你得到一个字符串,因此回答了更多的一般问题“如何从AST获取字符串?”。如果完全不需要文件(用于测试,作为中间结果,..),它尤其有用。 – sevenforce 2012-07-20 13:15:44

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 =>CompilationUnit AST
true =>力取代
null =>进度监视器

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