ACCELEO: создание файла в пути в зависимости от структуры модели

При преобразовании модели Acceleo в текст я хотел бы создать файл для класса UML, согласованного с пакетами, содержащими этот класс (пространство имен класса в модели UML). Проблема, с которой я сталкиваюсь, заключается в том, что я должен сделать это в строке, как этого требует команда [file], поэтому я пытаюсь что-то вроде этого

[file ((c.allOwningPackages().name.->sep('/')).concat(c.name.concat('.hpp')),false,'UTF-8')]

но я получаю эту ошибку на concat:

 Cannot find operation (concat(String)) for the type (OclAny)

Как правильно это сделать?

1 ответ

Решение

Это не обязательно делать в той же строке, что и блок файла. Два обычных способа выполнить то, что вы пытаетесь сделать, это

  • вложите блок файла в блок let или
  • извлечь логику в другой шаблон или запрос.

Для вашего примера, б) даст что-то вроде:

[template public myMainTemplate(c : uml::Class)]
    [file (getpackage(c), false, 'UTF-8')]
        ...
    [/file]
[/template]

[template private getPackage(c : uml::Class) post(trim())]
    [c.ancestors()->reverse()->sep('/')->including(c.name.concat('.hpp'))/]
[/template]

Обратите внимание на использование "-> включая" вместо ".concat" для коллекций, поэтому вы получили сообщение об ошибке. Конечно, это должно было быть только в одном выражении. Это может быть более читабельным, как:

[template private getPackage(c : uml::Class) post(trim())]
    [c.ancestors()->reverse()->sep('/')/]/[c.name/].hpp
[/template]
Другие вопросы по тегам