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

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

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

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

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

Любая подсказка или указатель на учебник полезны.

Решение:

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


person Marten Sytema    schedule 17.09.2012    source источник


Ответы (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
person Sven Efftinge    schedule 18.09.2012
comment
Большое спасибо! XMI является экземпляром определенной метамодели, учитывает ли это ваш код (т.е. загружает эту метамодель?). Или формат XMI достаточно описателен и каким-то образом указывает на метамодель? - person Marten Sytema; 18.09.2012
comment
Так что мне, вероятно, нужен правильный материал genmodel, и добавить этот проект в качестве зависимости к этому недавно созданному проекту плагина? - person Marten Sytema; 18.09.2012
comment
Отлично, это работает! Ха. Как вы думаете, было бы полезно разместить этот пример на сайте XTend? Для меня это звучит как общая цель XTend (т.е. использовать его как замену XPand) - person Marten Sytema; 18.09.2012
comment
Вау, простое минималистичное решение, которое подходит и для моего варианта использования! Я также думаю, что это должно быть продвинуто больше! - person thSoft; 19.06.2013