Как добавить определенную фазу генерации, которая бы выполняла Word-модель-MS-Word?
Предположим, что я разработал набор поведений в MPS, которые позволяют мне преобразовать экземпляр WordDocument
концепция (и дочерние элементы), которая описывает документ текстового процессора, в документ MS Word с использованием POI, и что я смог реализовать действие в плагине MPS, который позволяет мне генерировать нужный документ MS Word, щелкнув правой кнопкой мыши на моем корневой узел.
Я хотел бы добавить это в качестве фазы в процессе генерации, чтобы после фаз от модели к модели процесс генерации MPS выполнял генерацию "Модель в MS Word" вместо "Модель в текст".
Настраивается ли MPS таким образом, и какой набор концепций использовать?
1 ответ
Когда вы запускаете make или пересобираете модели в MPS, MPS запускает так называемый MakeSession
в этом сеансе MPS выполняет несколько шагов. Одним шагом в сеансе make является, например, "create", который запускает преобразование модели в модель, а вторым является "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
}
}
}
}