Load EMF Model instance in XTend

后端 未结 1 1402
难免孤独
难免孤独 2020-12-31 12:00

I am building a code generator in XTend where I already have an input model and meta model. That is, I use ATL to generate the input model for my XTend code generator (as pa

相关标签:
1条回答
  • 2020-12-31 12:27

    If you have an XMI and just want to generate code from it, you don't need Xtext at all. Just start with a Java project (I'd use a plug-in project, to reuse the dependency management) and start coding:

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

    The dependencies you need to add to your 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 讨论(0)
提交回复
热议问题