【问题标题】:Load EMF Model instance in XTend在 XTend 中加载 EMF 模型实例
【发布时间】:2015-04-07 17:33:06
【问题描述】:

我正在 XTend 中构建一个代码生成器,其中我已经有一个输入模型和元模型。也就是说,我使用 ATL 为我的 XTend 代码生成器生成输入模型(作为转换序列的一部分,以逐渐降低抽象级别,而不是一次;这就是我不使用 xtext 创建语法的原因) .

所以要非常清楚,我的代码生成器输入模型是 XMI 格式的文件,而不是 xtext 项目的语法(甚至不使用它)!我认为这引起了我的问题/困惑。

我使用现有模型创建了一个新的 XText 项目,右键单击 .text 文件,运行为,生成人工制品,然后我对 mwe2 文件做了同样的事情。

下一步是什么,我做得对吗?如何启动我的代码生成器?所有示例都来自您使用 XText 创建 DSL 的 POV。我有一个 EMF 元模型和一个基于 XMI 的实例。如何使用 XTend 进一步处理?

任何指向教程的提示或指针都是有帮助的。

解决方案:

解决方案正如 Sven 在我接受的答案中所建议的那样,但我还想指出,您需要使用 genmodel 从元模型生成 Java 工件。这个链接显示了如何:http://www.vogella.com/articles/EclipseEMF/article.html,见第 4 节。这可能看起来太合乎逻辑了,但我认为无论如何都值得注意。

【问题讨论】:

    标签: xmi metamodel emf xtend


    【解决方案1】:

    如果您有一个 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);
      }
    
    }
    

    您需要添加到 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
    

    【讨论】:

    • 非常感谢! XMI 是某个元模型的实例,您的代码是否考虑到这一点(即加载此元模型?)。或者 XMI 格式是否具有足够的描述性并以某种方式指向元模型?
    • 所以我可能需要正确的 genmodel 东西,并将该项目作为依赖项添加到这个新创建的插件项目中?
    • 太好了,它有效!哈。你认为把这个例子放在 XTend 网站上可能有用吗?对我来说,这听起来像是 XTend 的一个共同目的(即,将其用作 XPand 的替代品)
    • 哇,一个简单、简约的解决方案也涵盖了我的用例!我也觉得应该多推广!
    猜你喜欢
    • 2015-01-12
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 2015-05-30
    • 2014-03-13
    相关资源
    最近更新 更多