clang-uml
YAML 構成ファイルによって駆動される、C++ から UML への自動クラス、シーケンス、パッケージ、およびインクルード ダイアグラム ジェネレーターです。このプロジェクトの背後にある主なアイデアは、コードベース内で最新の図を簡単に維持したり、レガシー コードを文書化したりすることです。 clang-uml
の構成ファイルは、生成される各図のタイプと内容を定義します。図は、PlantUML、MermaidJS、および JSON 形式で生成できます。
clang-uml
現在、C および Objective-C に加えて、バージョン 20 までの C++ をサポートしています。
完全なドキュメントは、clang-uml.github.io にあります。
clang-uml
何ができるかを確認するには、ここで単体テスト ケース用に生成された図を確認するか、clang-uml-examples リポジトリの例を確認してください。
これまでにサポートされている主な機能は次のとおりです。
より包括的なドキュメントは、clang-uml.github.io にあります。
Linux
、 macos
、 Windows
のインストール手順については、こちらを参照してください。
clang-uml
、ソース コードのコンパイルに使用されるコマンドのリストが含まれる最新のcompile_commands.json ファイルが必要です。
既存の C++ ビルド システムの一部を使用して、 compile_commands.json
生成する方法については、ここを参照してください。
デフォルトでは、 clang-uml
、構成ファイル.clang-uml
とコンパイル データベースのcompile_commands.json
ファイルが現在のディレクトリにあると想定するため、これらのファイルがプロジェクトの最上位ディレクトリにある場合は、次のコマンドを実行するだけです。
clang-uml
図の出力パスとコンパイル データベースの別の場所は、 .clang-uml
構成ファイルまたはコマンド ライン パラメーターで指定できます。
他のオプションについては、ヘルプを参照してください。
clang-uml --help
構成ファイルは YAML で記述され、 clang-uml
によって生成される図の定義を提供します。基本的な例は次のとおりです。
compilation_database_dir : .
output_directory : diagrams
diagrams :
myproject_class :
type : class
glob :
- src/*.cc
using_namespace : myproject
include :
namespaces :
- myproject
exclude :
namespaces :
- myproject::detail
plantuml :
after :
- ' note left of {{ alias("MyProjectMain") }}: Main class of myproject library. '
詳細な構成ファイルのリファレンス ガイドについては、ここを参照してください。
clang-uml
何ができるかを確認するには、ここでテスト ケースのドキュメントを参照してください。
clang-uml
自体の図を表示するには、独自の設定に基づいて次のコマンドを実行します。
make clanguml_diagrams
docs/diagrams
フォルダー内の SVG 図を開きます。
次の C++ コード:
template < typename T, typename P> struct A {
T t;
P p;
};
struct B {
std::string value;
};
template < typename T> using AString = A<T, std::string>;
template < typename T> using AStringPtr = A<T, std::unique_ptr<std::string>>;
template < typename T>
using PairPairBA = std::pair<std::pair<B, A< long , T>>, long >;
template < class T > using VectorPtr = std::unique_ptr<std::vector<T>>;
template < class T > using APtr = std::unique_ptr<A< double , T>>;
template < class T > using ASharedPtr = std::shared_ptr<A< double , T>>;
template < class T , class U >
using AAPtr = std::unique_ptr<std::pair<A< double , T>, A< long , U>>>;
template < typename T> using SimpleCallback = std::function< void (T, int )>;
template < typename ... T> using GenericCallback = std::function< void (T..., int )>;
using VoidCallback = GenericCallback< void *>;
using BVector = std::vector<B>;
using BVector2 = BVector;
using AIntString = AString< int >;
using ACharString = AString< char >;
using AStringString = AString<std::string>;
using BStringString = AStringString;
template < typename T> class R {
using AWCharString = AString< wchar_t >;
PairPairBA< bool > bapair;
APtr< bool > abool;
AAPtr< bool , float > aboolfloat;
ASharedPtr< float > afloat;
A< bool , std::string> boolstring;
AStringPtr< float > floatstring;
AIntString intstring;
AStringString stringstring;
BStringString bstringstring;
AAPtr<T, float > atfloat;
protected:
BVector bs;
public:
BVector2 bs2;
SimpleCallback<ACharString> cb;
GenericCallback<AWCharString> gcb;
VoidCallback vcb;
VectorPtr<B> vps;
};
結果は次の図になります (PlantUML 経由)。
ここで生の画像を開き、ホバー ツールチップとクラスとメソッドへのハイパーリンクを確認してください。
次の C++ コード:
# include < atomic >
# include < functional >
# include < iostream >
# include < memory >
# include < string >
namespace clanguml {
namespace t20029 {
std::string encode_b64 (std::string &&content) { return std::move (content); }
template < typename T> class Encoder : public T {
public:
bool send (std::string &&msg)
{
return T::send ( std::move (
// Encode the message using Base64 encoding and pass it to the next
// layer
encode ( std::move (msg))));
}
protected:
std::string encode (std::string &&msg) { return encode_b64 ( std::move (msg)); }
};
template < typename T> class Retrier : public T {
public:
bool send (std::string &&msg)
{
std::string buffer{ std::move (msg)};
int retryCount = 5 ;
// Repeat until send() succeeds or retry count is exceeded
while (retryCount--) {
if ( T::send (buffer))
return true ;
}
return false ;
}
};
class ConnectionPool {
public:
void connect ()
{
if (!is_connected_. load ())
connect_impl ();
}
bool send ( const std::string &msg) { return true ; }
private:
void connect_impl () { is_connected_ = true ; }
std::atomic< bool > is_connected_;
};
int tmain ()
{
auto pool = std::make_shared<Encoder<Retrier<ConnectionPool>>>();
// Establish connection to the remote server synchronously
pool-> connect ();
// Repeat for each line in the input stream
for (std::string line; std::getline (std::cin, line);) {
if (!pool-> send ( std::move (line)))
break ;
}
return 0 ;
}
}
}
結果は次の図になります (PlantUML 経由)。
次の C++ コード:
namespace clanguml {
namespace t30003 {
namespace ns1 {
namespace ns2_v1_0_0 {
class A {
};
}
namespace [ [deprecated]] ns2_v0_9_0 {
class A {
};
}
namespace {
class Anon final {
};
}
}
namespace [ [deprecated]] ns3 {
namespace ns1 ::ns2 {
class Anon : public t30003 ::ns1::ns2_v1_0_0::A {
};
}
class B : public ns1 ::ns2::Anon {
};
}
}
}
結果は次の図になります (PlantUML 経由)。
インクルード グラフを視覚化して分析するためのよりシンプルなツールをお探しの場合は、私の他のツール、clang-include-graph をチェックしてください。
次の C++ コード構造:
tests/t40001
├── include
│ ├── lib1
│ │ └── lib1.h
│ └── t40001_include1.h
└── src
└── t40001.cc
コード内の include ディレクティブに基づいて、次の図 (PlantUML 経由) が生成されます。
UML | プラントUML | マーメイドJS |
---|---|---|
継承 | ||
協会 | ||
依存 | ||
集計 | ||
構成 | ||
テンプレートの特殊化/インスタンス化 | ||
ネスト (内部クラス/列挙型) | ||
含める (ローカル) | ||
含める(システム) |
一般的なコード ベースの場合、コード全体または単一の名前空間から生成された単一の図は、ドキュメントの一部として使用するには大きすぎる可能性があります。 clang-uml
使用すると、単純な YAML 構成を使用して、各図に含めるコンテンツと除外するコンテンツを指定できます。
include :
# Include only elements from these namespaces
namespaces :
- clanguml::common
- clanguml::config
# Include all subclasses of ClassA (including ClassA)
subclasses :
- clanguml::common::ClassA
# and specializations of template Class<T> (including Class<T>)
specializations :
- clanguml::common::ClassT<T>
# and all classes depending on Class D
dependants :
- clanguml::common::ClassD
# and all dependencies of ClassE
dependencies :
- clanguml::common::ClassE
# and classes in direct relation to ClassB (including ClassB)
context :
- clanguml::common::ClassB
# Include only inheritance relationships
relationships :
- inheritance
exclude :
# Exclude all elements from detail namespace
namespaces :
- clanguml::common::detail
# and also exclude ClassF
elements :
- clanguml::common::ClassF
詳細については、ダイアグラム フィルターのドキュメント セクションを参照してください。
clang-uml
の単体テストに使用される組み込みテスト ケースは、ここで参照できます。
このプロジェクトは、次の優れたツールに依存しています。
プロジェクトに貢献したい場合は、貢献ガイドラインを確認してください。
Copyright 2021-present Bartek Kryza <[email protected]>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.