2012-04-13 176 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