如何添加将执行模型到 MS Word 的特定生成阶段?

How to add a specific generation phase that would do Model-To-MS Word?

假设我在 MPS 中开发了一组行为,允许我使用 POI 将描述文字处理器文档的 WordDocument 概念(和子项)的实例转换为 MS Word 文档并且我已经能够在 MPS 插件中执行一个操作,允许我通过右键单击我的根节点来生成我想要的 MS Word 文档。

我想将其添加为生成过程中的一个阶段,以便在模型到模型阶段之后,MPS 的生成过程进行模型到 MS Word 生成而不是模型到文本.

MPS 是否可以通过这种方式自定义,要使用的概念集是什么?

当您运行 在 MPS 中制作或重建模型时,MPS 将在此会话中启动所谓的 MakeSession MPS 执行多个步骤。例如,make 会话中的一个步骤是 "generate",其中 运行 是模型到模型的转换,第二个步骤是 "textgen",然后将生成步骤的结果模型写入通过执行语言的 textgen 定义来磁盘。

这些单独的步骤称为 "facet"。您可以将自己的方面贡献到整个制作过程中。为此,您需要用您的语言创建一个插件方面,然后在其中创建一个方面。在这方面,您可以声明它的依赖性和优先级。在您的情况下,您希望 运行 在 textgen 之前但在生成之后,以便您可以访问生成的结果。

构面可以以声明的方式统计其输入数据。在您的情况下,您需要 GResource 代表生成器方面的输出。然后你可以访问上面的模型和 运行 你的 POI 代码。

一个最小的例子是这样的:

facet RunPoi extends <none> {                                                                                                                                                                     
    Required: Generate, TextGen                                                                                                                                                                     

    <no optional facets>                                                                                                                                                                            
    Targets:                                                                                                                                                                                        
        target genWord overrides <none> weight default { 
            resources policy: transform GResource -> <no output>                                                                                    

        Dependencies:                                                                                                                             
            after generate                                                                                                                          
            before textGen                                                                                                                          
            before textGenToMemory                                                                                                                  

        <no properties>                                                                                                                           
        <no queries>                                                                                                                              
        <no config>                                                                                                                               
        (progressMonitor, input)->void { 
            foreach resource in input { 
                SModel mdl = resource.model; 
                // run poi code with mdl 
            } 
        }   
    }
}