1

問題

コード生成テンプレートの Enterprise Architect 7.1.834 では、クラスがファイル テンプレートのスコープに属するすべての親パッケージを印刷できますか?

これが必要な理由は、会社のコーディング標準に準拠したマルチ インクルード ガードを生成するためです。


うまくいかないこと

私は両方を試しました:

  %list="Namespace__Notes" @separator="-"% 

  %packageName% 

両方の出力は最上位の親パッケージ (Package1) のみを出力しますが、私は見たいと思います:

  Package1-Package2-Package3

誰かがこれを行う方法を見つけましたか?

Namespace__Notes

Namepace__Notes は Namepace タイプのカスタム テンプレートで、内容は次のとおりです。

  %PI=""%
  %packageName%

[編集] ダーティ ソリューション

私の現在の(汚い)解決策は、ファイルパスを壊すことです。 何か不足していますか?

コード:

$l_backslash = %REPLACE("\z","z","")%
$filepath = %filePath%
$upper_filepath = %TO_UPPER($filepath)%
$upper_package_as_path = $l_backslash + %TO_UPPER(packageName)% + $l_backslash
$upper_package_base_len = %LENGTH(packageName)%

$package_path_pos = %FIND($upper_filepath,$upper_package_as_path)%
%if $package_path_pos != "-1" and $package_path_pos != "0"%
$upper_filepath = %MID($upper_filepath,$package_path_pos)%
%endIf%

$file_define =  "_" + $upper_filepath + "__"
$file_define = %REPLACE($file_define,".","_")%
$file_define = %REPLACE($file_define,$l_backslash,"_")%
$file_define = %REPLACE($file_define,"/","_")% 

$body += "/**************************************************************************//**"
$body += "\n * \file         " + %fileName%
$body += "\n *"
$body += "\n * \brief        " + %elemType% + " " + %className% + " header file"
$body += "\n *"
$body += "\n * \author       " + %classAuthor ? value : "<unknown>"%
$body += "\n *"
$body += "\n *****************************************************************************/"
$body += "\n"
$body += "\n#ifndef " + $file_define
$body += "\n#define " + $file_define
$body += "\n"
4

2 に答える 2

0

%packagePath% はドット区切りのパッケージ階層を提供し、%classQualName% は :: 区切りのクラス階層 (内部クラスの場合) を提供します。

これは現在のバージョン用です。これらのマクロが 7.1 まで存在していたかどうかはわかりません。現在のバージョンは 9.3 であり、EA はプロジェクト コンテンツに関して後方互換性があるため、アップグレードを真剣に検討する必要があります。

于 2012-04-25T05:49:42.260 に答える
-1

EA 10 では、%packagePath% もファイル テンプレートの最上位パッケージのみを提供します。

[編集] 別の汚れた部分的な解決策。

新しいカスタム テンプレート Namespace__fullName を作成しました。

$prevName = %list="Namespace__fullName"%
%if $prevName != ""%
%packageName%::$prevName
%else%
%packageName%
%endIf%

; および Class__fullQualName:

%list="Namespace__fullName"%::%classQualName%

これは、ソース ファイルに含まれるクラスが 1 つだけ (おそらくネストされたアイテムを含む) で、名前空間階層が 1 つしかない単純なケースで機能します。

于 2014-04-11T08:17:39.437 に答える