通过XTend从Metamodel生成代码

时间:2016-08-31 00:09:41

标签: code-generation emf xtend

我在现有的EMF项目中有一个Ecore模型,并希望通过XTend将所有包含类的名称打印到文本文件中。你是如何实现这一目标的? XTend示例未显示如何使用模型并从中获取信息。

1 个答案:

答案 0 :(得分:1)

如果您只需要元模型的EClasses,那么您可以从模型包中获取它们: YourEMFModelPackage.eINSTANCE.getEClassifiers(),返回EList<EClassifier>。由于EClassEClassifier,因此您可以获得所有EClass实现org.eclipse.emf.ecore.impl.EClassImpl。 对于类型安全问题,您可能会检查此列表是否仅包含EClasses,因为您的所有EDataTypes也都是EClassifier

所以这应该是特技: EcoreUtil.getObjectsByType(YourEMFModelPackage.eINSTANCE.getEClassifiers(), EcorePackage.eINSTANCE.getEClass())

或:

List<EClass> allEClasses = YourEMFModelPackage.eINSTANCE.getEClassifiers().stream().filter(p -> EClass.class.isInstance(p)).map(m -> EClass.class.cast(m)).collect(Collectors.toList());

更新: 如果您没有生成模型代码,您仍然可以执行此操作,则只需将Ecore加载到资源中:

    ResourceSet resourceSet = new ResourceSetImpl();
    resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore",
            new EcoreResourceFactoryImpl());
    Resource resource = resourceSet.getResource(
            URI.createFileURI(
                    "../path/to/your/Ecore.ecore"),
            true);
    EPackage model = (EPackage) resource.getContents().get(0);

如果你有EPackage,那么就会得到上面提到的EClass