2012-09-17 14 views
10

Estoy construyendo un generador de código en XTend donde ya tengo un modelo de entrada y un metamodelo. Es decir, utilizo ATL para generar el modelo de entrada para mi generador de código XTend (como parte de una secuencia de transformación para reducir gradualmente el nivel de abstracción, en lugar de hacerlo de inmediato, esta es la razón por la que no estoy usando xtext para crear la sintaxis) .Cargar instancia de EMF Model en XTend

Así que, para ser muy claros, mi modelo de entrada para el generador de código es un archivo en formato XMI y NO en la gramática del proyecto xtext (¡ni siquiera usando eso)! Y creo que esto me está causando problemas/confusión.

Creé un nuevo proyecto de XText utilizando modelos existentes, hice clic derecho en el archivo .text, ejecuté como generar artefactos y luego hice lo mismo para el archivo mwe2.

¿Cuál es el siguiente paso, lo estoy haciendo bien? ¿Cómo puedo iniciar mi generador de código? Todos los ejemplos provienen del POV que usa XText para crear una DSL. Tengo un metamodelo EMF y una instancia basada en XMI de eso. ¿Cómo procesar eso más utilizando XTend?

Cualquier sugerencia o puntero a un tutorial es útil.

Solución:

La solución era tan Sven sugirió en mi respuesta aceptada, pero también me gustaría señalar que es necesario utilizar un genmodel para generar artefactos Java a partir de su modelo de meta. Este enlace muestra cómo: http://www.vogella.com/articles/EclipseEMF/article.html, ver la sección 4. Esto puede parecer demasiado lógico, pero creo que vale la pena señalar de todos modos.

Respuesta

19

Si tiene un XMI y solo desea generar código a partir de él, no necesita Xtext en absoluto. Simplemente comienza con un proyecto Java (que haría uso de un proyecto de plug-in, para reutilizar el gestión de la dependencia) y empezar a programar:

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

} 

Las dependencias que hay que añadir a su Manifiesto:

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

¡Muchas gracias! El XMI es una instancia de un determinado metamodelo, ¿su código lo considera (es decir, carga este metamodelo?). ¿O el formato XMI es suficientemente descriptivo y apunta al metamodelo de alguna manera? –

+0

¿Entonces probablemente necesito las cosas genmodel correctas, y agregar ese proyecto como una dependencia a este proyecto de complemento recién creado? –

+1

¡Genial, funciona! Hah. ¿Crees que podría ser útil poner este ejemplo en el sitio de XTend? Para mí, suena como un propósito común de XTend (es decir, usarlo como reemplazo de XP y) –