在XTend中加载EMF模型实例

10

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

所以非常明确,我的代码生成器的输入模型是一个XMI格式的文件,而不是xtext项目的语法(甚至都没有使用)!我认为这导致了我遇到的问题/困惑。

我使用现有模型创建了一个新的XText项目,在.text文件上右键单击,选择“运行为”,生成工件,然后对mwe2文件执行相同的操作。

接下来是什么步骤?我的操作正确吗?如何启动我的代码生成器?所有的例子都是从使用XText创建DSL的角度出发的。我有一个EMF元模型和一个基于XMI的实例。如何使用XTend进一步处理它们?

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

解决方案:

正如Sven在我的已接受答案中建议的那样,解决方案是使用genmodel从您的元模型生成Java工件。此链接显示了如何进行操作:http://www.vogella.com/articles/EclipseEMF/article.html,请参阅第4节。这可能看起来很显而易见,但我认为仍然值得注意。

1个回答

19

如果您有一个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格式足够描述并指向元模型? - Marten Sytema
那么我可能需要 genmodel 相关的东西,然后将该项目作为依赖项添加到这个新创建的插件项目中? - Marten Sytema
1
太好了,它起作用了!哈。你觉得把这个例子放在XTend网站上会有用吗?对我来说,这听起来像是XTend的一个常见目的(即将其用作XPand的替代品)。 - Marten Sytema
哇,一个简单、极简的解决方案,正好符合我的使用情况!我也认为它应该得到更多的推广! - thSoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接