0

在 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)

这样做的正确方法是什么?

4

1 回答 1

1

不必在与文件块相同的行上执行此操作。完成您正在尝试做的事情的两种常用方法是

  • 将文件块嵌套到 let 块中或
  • 将逻辑提取到另一个模板或查询中。

对于您的示例, b) 会给出以下内容:

[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]
于 2012-07-09T07:19:05.740 回答