Как добавить определенную фазу генерации, которая бы выполняла 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 
            } 
        }   
    }
}  
Другие вопросы по тегам