通过 XTend 从元模型生成代码

Generate code from Metamodel via XTend

我在现有的 EMF 项目中有一个 Ecore 模型,我想通过 XTend 将所有包含 类 的名称打印到文本文件中。你如何做到这一点? XTend 示例没有展示如何使用模型并从中获取信息。

如果您只需要元模型的 EClass,那么您可以从模型包中获取它们: YourEMFModelPackage.eINSTANCE.getEClassifiers() 其中 returns 个 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 就像上面提到的