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]