2012-09-17 3 views
10

Je construis un générateur de code dans XTend où j'ai déjà un modèle d'entrée et un méta-modèle. Autrement dit, j'utilise ATL pour générer le modèle d'entrée de mon générateur de code XTend (dans le cadre d'une séquence de transformation pour réduire graduellement le niveau d'abstraction, et non la fois, c'est pourquoi je n'utilise pas xtext pour créer la syntaxe) . Pour être très clair, mon modèle d'entrée pour le générateur de code est un fichier au format XMI et PAS dans la grammaire du projet xtext (même pas en utilisant ça)! Et je pense que cela me cause des problèmes/de la confusion.Charger une instance de modèle EMF dans XTend

J'ai créé un nouveau projet XText à l'aide de modèles existants, j'ai cliqué avec le bouton droit sur le fichier .text, j'ai exécuté un fichier, généré des artefacts, puis j'ai fait de même pour le fichier mwe2.

Quelle est la prochaine étape, est-ce que je le fais bien? Comment puis-je démarrer mon générateur de code? Tous les exemples proviennent du POV que vous utilisez XText pour créer un DSL. J'ai un méta-modèle EMF, et une instance basée sur XMI de cela. Comment traiter cela en utilisant XTend? Un indice ou un pointeur vers un didacticiel est utile.

Solution:

La solution était que Sven a suggéré dans ma réponse acceptée, mais aussi je voudrais noter que vous devez utiliser un genmodel pour générer des artefacts Java à partir de votre méta-modèle. Ce lien montre comment: http://www.vogella.com/articles/EclipseEMF/article.html, voir la section 4. Cela peut sembler tout à fait logique, mais je pense qu'il vaut la peine de noter quand même.

Répondre

19

Si vous avez un XMI et que vous voulez simplement générer du code, vous n'avez pas du tout besoin de Xtext. Il suffit de commencer par un projet Java (j'utiliser un projet de plug-in, de réutiliser la gestion des dépendances) et commencer à coder:

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

} 

Les dépendances vous devez ajouter à votre Manifest:

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

Merci beaucoup! Le XMI est l'instance d'un certain méta-modèle, est-ce que votre code considère ceci (c'est-à-dire, charge ce méta-modèle?). Ou le format XMI est-il assez descriptif et pointe-t-il en quelque sorte vers le métamodèle? –

+0

Donc, j'ai probablement besoin de la bonne chose genmodel, et ajouter ce projet en tant que dépendance à ce projet de plugin nouvellement créé? –

+1

Super, ça marche! Hah. Pensez-vous qu'il pourrait être utile de mettre cet exemple sur le site XTend? Pour moi, cela ressemble à un objectif commun de XTend (à savoir l'utiliser comme un remplacement de XPand) –

Questions connexes