Загрузить экземпляр экземпляра EMF в XTend

Я создаю генератор кода в XTend, где у меня уже есть модель ввода и метамодель. То есть я использую ATL для создания входной модели для моего генератора кода XTend (как часть последовательности преобразований, чтобы постепенно понижать уровень абстракции, а не сразу, поэтому я не использую xtext для создания синтаксиса).

Поэтому, чтобы быть очень ясным, моя модель ввода для генератора кода - это файл в формате XMI и НЕ в грамматике проекта xtext (даже не используя это)! И я думаю, что это вызывает у меня проблемы/путаницу.

Я создал новый проект XText с использованием существующих моделей, щелкнул правой кнопкой мыши на .text файле, запустил как, сгенерировал артефакты, а затем сделал то же самое для файла mwe2.

Какой следующий шаг я делаю правильно? Как я могу запустить генератор кода? Все примеры из POV, которые вы используете XText для создания DSL. У меня есть метамодель EMF и экземпляр на основе XMI. Как обрабатывать это, используя XTend?

Полезно любое указание или указатель на учебник.

Решение:

Решение было предложено Свеном в моем принятом ответе, но также хотелось бы отметить, что вам нужно использовать genmodel для генерации артефактов Java из вашей метамодели. Эта ссылка показывает, как: http://www.vogella.com/articles/EclipseEMF/article.html, см. Раздел 4. Это может показаться слишком логичным, но я думаю, что все равно стоит его отмечать.

Ответ 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);
  }

}

Зависимости, которые необходимо добавить в манифест:

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