通过 XTend 从元模型生成代码
Generate code from Metamodel via XTend
我在现有的 EMF 项目中有一个 Ecore 模型,我想通过 XTend 将所有包含 类 的名称打印到文本文件中。你如何做到这一点? XTend 示例没有展示如何使用模型并从中获取信息。
如果您只需要元模型的 EClass,那么您可以从模型包中获取它们:
YourEMFModelPackage.eINSTANCE.getEClassifiers()
其中 returns 个 EList<EClassifier>
。由于 EClass
是 EClassifier
,因此您将获得所有 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
就像上面提到的
我在现有的 EMF 项目中有一个 Ecore 模型,我想通过 XTend 将所有包含 类 的名称打印到文本文件中。你如何做到这一点? XTend 示例没有展示如何使用模型并从中获取信息。
如果您只需要元模型的 EClass,那么您可以从模型包中获取它们:
YourEMFModelPackage.eINSTANCE.getEClassifiers()
其中 returns 个 EList<EClassifier>
。由于 EClass
是 EClassifier
,因此您将获得所有 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
就像上面提到的