假设我在 MPS 中开发了一组行为,允许我WordDocument
使用 POI 将描述 Word 处理器文档的概念(和子项)的实例转换为 MS Word 文档,并且我已经能够实现一个动作在一个 MPS 插件中,它允许我通过右键单击我的根节点来生成我想要的 MS Word 文档。
我想将此作为生成过程中的一个阶段添加,以便在模型到模型阶段之后,MPS 的生成过程执行模型到 MS 字的生成,而不是模型到文本。
MPS 是否可以通过这种方式进行定制,要使用的概念集是什么?
假设我在 MPS 中开发了一组行为,允许我WordDocument
使用 POI 将描述 Word 处理器文档的概念(和子项)的实例转换为 MS Word 文档,并且我已经能够实现一个动作在一个 MPS 插件中,它允许我通过右键单击我的根节点来生成我想要的 MS Word 文档。
我想将此作为生成过程中的一个阶段添加,以便在模型到模型阶段之后,MPS 的生成过程执行模型到 MS 字的生成,而不是模型到文本。
MPS 是否可以通过这种方式进行定制,要使用的概念集是什么?
MakeSession
当您在 MPS 中对模型运行 make 或重新构建时,MPS 将在此会话中启动一个所谓的 MPS 执行多个步骤。例如,make 会话中的一个步骤是“generate”,它运行模型到模型的转换,第二个是“textgen”,然后通过执行语言的 textgen 定义将生成步骤的结果模型写入磁盘.
这些单独的步骤称为“方面”。您可以将自己的方面贡献到整个制作过程中。为此,您需要用您的语言创建一个插件方面,然后在其中创建一个方面。在方面,您可以声明它的依赖关系和优先级。在您的情况下,您希望在 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
}
}
}
}