【问题标题】:How can I programmatically run an Xpand code generator from a Java class?如何以编程方式从 Java 类运行 Xpand 代码生成器?
【发布时间】:2013-03-27 17:40:00
【问题描述】:

我正在尝试通过定义 DSL 并执行 M2M 以及 M2T(代码生成)来实现模型驱动的开发。对于代码生成,我选择使用 XPand 和模板定义。您能否提供示例代码或文档链接来解释如何从 Java 代码调用模板扩展?

附:我发现在 Eclipse 之外以独立模式运行这些东西非常困难,所以我从编写简单的 Java 实用程序开始。

【问题讨论】:

    标签: xpand mwe


    【解决方案1】:

    这里是任何感兴趣的人的代码:

        Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
        Map<String, Object> factoryMap = reg.getExtensionToFactoryMap();
        factoryMap.put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl());
    
        ResourceSet resourceSet = new ResourceSetImpl();
        EPackage PSM_Pkg = MyDSLPackage.eINSTANCE;
        resourceSet.getPackageRegistry().put(PSM_Pkg.getNsURI(), PSM_Pkg);
    
        Resource resource = resourceSet.getResource(Constants.PSM_URI, true);
        EList<EObject> inObjects = resource.getContents();
    
        // Xpand
        URI outURI = URI.createURI("file:///C:/Users/...");
        Output out = new OutputImpl();
        Outlet outlet = new Outlet(outURI.toFileString());
        out.addOutlet(outlet);
        XpandExecutionContextImpl executionContext = new XpandExecutionContextImpl(out, null);
    
        // Configure the metamodels
        EmfMetaModel emfMetaModel = new EmfMetaModel();
        emfMetaModel.setMetaModelPackage(MyDSLlPackage.class.getName());
        executionContext.registerMetaModel(emfMetaModel);
        XpandFacade xpandFacade = XpandFacade.create(executionContext);
        Object[] params = null;
        System.out.println(inObjects.get(0));
        xpandFacade.evaluate("template::Template::main", inObjects.get(0), params);
        System.out.println("Code generated.");
    

    【讨论】:

    • 你导入了什么包?
    猜你喜欢
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多