在XTend中加载EMF Model实例

Mar*_*ema 10 xmi metamodel xtend emf

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

所以要很清楚,我的代码生成器输入模型是XMI格式的文件,而不是在XTEXT项目的语法(即使不使用)!而且我认为这会给我带来麻烦/困惑.

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

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

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

解:

该解决方案是为斯文在我接受的答案建议,而且我想指出的是您需要使用的genmodel从你的元模型生成Java工件.此链接显示了如何:http://www.vogella.com/articles/EclipseEMF/article.html,请参阅第4节.这可能看起来太符合逻辑,但我认为无论如何都值得注意.

Sve*_*nge 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);
  }

}
Run Code Online (Sandbox Code Playgroud)

您需要添加到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
Run Code Online (Sandbox Code Playgroud)