2012-09-17 72 views
10

我在XTend中構建了一個代碼生成器,其中已經有一個輸入模型和元模型。也就是說,我使用ATL爲我的XTend代碼生成器生成輸入模型(作爲轉換序列的一部分,逐步降低抽象級別,而不是立即;這是我沒有使用xtext創建語法的原因) 。在XTend中加載EMF模型實例

所以要很清楚,我的代碼生成器輸入模型是XMI格式的文件,而不是在XTEXT項目的語法(甚至沒有使用)!而且我認爲這導致了我的問題/困惑。

我使用現有的車型創造了一個新的項目XTEXT,右擊的的.text文件,運行爲,產生假象,然後我做了mwe2文件相同。

下一步是什麼,我做對了嗎?我如何啓動我的代碼生成器?所有的例子都來自您使用XText創建DSL的POV。我有一個EMF元模型和一個基於XMI的實例。如何使用XTend進一步處理?

任何提示或指向教程的指針都很有幫助。

解決方案:

的解決方案是爲斯文在我接受的答案建議,而且我想指出的是您需要使用的genmodel從你的元模型生成Java工件。此鏈接顯示:http://www.vogella.com/articles/EclipseEMF/article.html,請參閱第4節。這看起來可能太合乎邏輯了,但我認爲這值得注意。

回答

19

如果你有一個XMI,只是想從其生成的代碼,你並不需要的Xtext在所有。 與Java項目剛開始(我會使用一個插件項目,重用依賴關係管理),並開始編碼:

import org.eclipse.emf.common.util.URI 
import org.eclipse.emf.ecore.EPackage 
import org.eclipse.emf.ecore.resource.Resource$Factory$Registry 
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl 
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl 

class MyCodeGenerator { 

    def static void main(String[] args) { 
    new MyCodeGenerator().generate("mymodel.xmi") 
    } 

    def generate(String file) { 
    doEMFSetup 
    val resourceSet = new ResourceSetImpl 
    val resource = resourceSet.getResource(URI.createURI(file), true) 
    for (content : resource.contents) { 
     generateCode(content) 
    } 
    } 

    def dispatch generateCode(MySpecialType it) ''' 
    public class «name» { 
     «FOR member : members» 
     «ENDFOR» 
    } 
    ''' 

    def dispatch generateCode(MyMember it) ''' 
    private «type» «name»; 
    ... 
    ''' 

    def doEMFSetup() { 
// EPackage$Registry.INSTANCE.put(MyPackage.eINSTANCE.nsURI, MyPackage.eINSTANCE) 
    Resource$Factory.Registry.INSTANCE.extensionToFactoryMap.put("xmi", new XMIResourceFactoryImpl); 
    } 

} 

你需要添加到您的清單中的依存關係:

Require-Bundle: org.eclipse.xtend.lib, 
com.google.guava, 
org.eclipse.xtext.xbase.lib, 
org.eclipse.emf.common, 
org.eclipse.emf.ecore, 
org.eclipse.emf.ecore.xmi 
+0

非常感謝! XMI是某個元模型的實例,你的代碼是否考慮過這個(即加載這個元模型?)。或者XMI格式足夠描述,並以某種方式指向元模型? –

+0

所以我可能需要genmodel的東西是正確的,並添加該項目作爲這個新創建的插件項目的依賴項? –

+1

很好,它的工作原理!哈。你認爲將這個例子放在XTend網站上可能有用嗎?對我來說,這聽起來像XTend的一個共同目的(即使用它作爲XP的替代品)。 –