2012-10-24 26 views
1

我有xtext文件類似於這裏描述的xtext: (www.ebpml.org/blog2/index.php/2010/11/05/mde-xtext-and-json )Xtext - 生成對象 - 生成更多數據

JSONDataSource: root = Object ; 
Object: '{' firstObject=TerminalObject (',' objects+=TerminalObject)* '}'; 
Array: '['firstItem=ObjectValue (',' items+=ObjectValue)* ']'; 
EmptyObject: isEmpty?= '{}' ; 
EmptyArray: isEmpty?= '[]' ; 
ObjectValue: value=STRING | Object | Array | EmptyObject | EmptyArray ; 
TerminalObject: element=STRING ':' (content = ObjectValue) ; 

所以在生成代碼後,我有所有在java中生成的對象。 現在我想在這些生成的java文件中有更多的方法。

這樣做的最佳方法是什麼?
謝謝:)

+0

請詳細說明在生成的java文件中使用方法是什麼意思?你是否根據這些值編寫了一個生成器?或者你想在數據源文件中寫一個方法嗎? –

+0

爲上述xtext文件生成的代碼是類JSONDataSource,Object,Array,EmptyObject,EmptyArray,ObjectValue,TerminalObject作爲接口,並且正在生成上述的impl類。 例如生成的類是附加的 –

+0

public class ArrayImpl extends ObjectValueImpl implements Array protected ObjectValue firstItem; 保護EList 項目; 保護ArrayImpl(){ 超();} @覆蓋 保護的EClass eStaticClass(){ 返回JsonPackage.Literals.ARRAY;} 公共ObjectValue getFirstItem(){ 返回與firstItem;} 公共NotificationChain basicSetFirstItem(ObjectValue newFirstItem ,NotificationChain消息) {..} 公共無效setFirstItem(ObjectValue newFirstItem) {..} 公共的EList getItems() {..} –

回答

0

那麼,有沒有簡單的方法來定製這些類。基本上可以做兩件事:

  1. 創建您自己的EMF(Ecore)模型,並以重用Ecore模型的方式創建您的語法。這樣,您可以定義新的操作,並手動創建它們的實現。
  2. 您也可以爲Ecore模型生成器設置一個後處理器,用於填充內容。有關詳細信息,請參見http://christiandietrich.wordpress.com/2011/07/22/customizing-xtext-metamodel-inference-using-xtend2/ - 但要有所不同,因爲模型推斷不能直接輸出自定義代碼;有一些基於EMF genmodel-annotation的方式來創建生成代碼的主體(有關詳細信息,請參閱http://jevopisdeveloperblog.blogspot.hu/2011/03/implement-tostring-with-xtexts.html的最後部分)。

總而言之,定製生成的EMF模型非常困難,我不建議這樣做。雖然似乎沒有必要引入新的幫助類,但從技術上講,它更容易做到。

+0

太棒了!謝謝! –

+0

嗨, 我對此有另一個Q. 所以現在我可以成功生成代碼!但我想在另一個範圍內調用一個靜態方法,如何將導入添加到相關包中? –

+0

如果您使用第一種方法,您只需編輯您的EObject實現。如果你正在使用第二種方法,我知道沒有辦法做到這一點。但是,您可以使用完全限定名稱作爲解決方法。 –