2012-09-17 17 views
10

Sto costruendo un generatore di codice in XTend in cui ho già un modello di input e un meta modello. Cioè, io uso ATL per generare il modello di input per il mio generatore di codice XTend (come parte di una sequenza di trasformazione per abbassare gradualmente il livello di astrazione, invece che allo stesso tempo, questo è il motivo per cui non sto usando xtext per creare la sintassi) .Carica istanza del modello EMF in XTend

Quindi, per essere molto chiaro, il mio modello di input per il generatore di codice è un file in formato XMI e NON nella grammatica del progetto xtext (nemmeno usando quello)! E penso che questo mi stia causando problemi/confusione.

Ho creato un nuovo progetto XText utilizzando i modelli esistenti, facendo clic con il pulsante destro sul file .text, eseguito come, genera artefatti e quindi ho fatto lo stesso per il file mwe2.

Qual è il prossimo passo, lo sto facendo bene? Come posso avviare il mio generatore di codice? Tutti gli esempi provengono dal POV che usi XText per creare un DSL. Ho un meta modello EMF e un'istanza basata su XMI. Come elaborarlo ulteriormente utilizzando XTend?

Qualsiasi suggerimento o puntatore a un tutorial è utile.

Soluzione:

La soluzione era come Sven suggerito nella mia risposta accettata, ma anche vorrei sottolineare che è necessario utilizzare un genmodel per generare artefatti Java dal meta-modello. Questo link mostra come: http://www.vogella.com/articles/EclipseEMF/article.html, vedere la sezione 4. Questo può sembrare tutto troppo logico, ma penso che valga la pena di notarlo comunque.

risposta

19

Se si dispone di una XMI e si desidera semplicemente generare codice da essa, non è necessario alcun Xtext. Basta partire con un progetto Java (userei un progetto plug-in, di riutilizzare la gestione delle dipendenze) e iniziare a scrivere codice:

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); 
    } 

} 

Le dipendenze è necessario aggiungere al vostro manifesto:

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

Grazie mille! L'XMI è l'istanza di un certo meta-modello, il tuo codice lo considera (ad esempio, carica questo metamodello?). O il formato XMI è abbastanza descrittivo e punta al metamodello in qualche modo? –

+0

Quindi probabilmente ho bisogno delle cose di genmodel e aggiungo quel progetto come dipendenza da questo progetto di plugin appena creato? –

+1

Ottimo, funziona! Hah. Pensi che potrebbe essere utile mettere questo esempio sul sito XTend? Per me sembra uno scopo comune di XTend (ad esempio usarlo come sostituzione di XP e) –