0

Acceleo モデルからテキストへの変換で、クラスを含むパッケージ (UML モデルのクラス名前空間) と一貫性のある UML クラスのファイルを作成したいと考えています。私が直面している問題は、[file]コマンドで必要なため、インラインで実行する必要があるため、このようなことを試みていることです

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

しかし、連結でこのエラーが発生しています:

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

これを行う正しい方法は何ですか?

4

1 に答える 1

1

ファイルブロックと同じ行で行うことは必須ではありません。あなたがやろうとしていることを達成するための2つの通常の方法は、

  • ファイル ブロックを 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 」の代わりに「 -> included 」を使用していることに注意してください。もちろん、これは 1 つの式の中にすべてを含めるためだけのものでした。次のように読みやすいかもしれません:

[template private getPackage(c : uml::Class) post(trim())]
    [c.ancestors()->reverse()->sep('/')/]/[c.name/].hpp
[/template]
于 2012-07-09T07:19:05.740 に答える