From d6552dc62923985bee1ad9dcdc57e32a07b20959 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sun, 2 May 2021 21:02:05 +0200 Subject: [PATCH] Added handling of inline namespaces --- docs/test_cases/t00015.md | 54 +++++++++++++++++++++++++++++++ docs/test_cases/t00015_class.png | Bin 0 -> 11013 bytes src/uml/class_diagram_visitor.cc | 15 +++++++-- tests/t00015/t00015.cc | 10 ++++-- tests/t00015/test_case.h | 6 ++-- 5 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 docs/test_cases/t00015.md create mode 100644 docs/test_cases/t00015_class.png diff --git a/docs/test_cases/t00015.md b/docs/test_cases/t00015.md new file mode 100644 index 00000000..86432f1d --- /dev/null +++ b/docs/test_cases/t00015.md @@ -0,0 +1,54 @@ +# t00015 - Namespace fun +## Config +```yaml +compilation_database_dir: .. +output_directory: puml +diagrams: + t00015_class: + type: class + glob: + - ../../tests/t00015/t00015.cc + using_namespace: + - clanguml::t00015 + include: + namespaces: + - clanguml::t00015 + +``` +## Source code +```cpp +namespace clanguml { +namespace t00015 { + +namespace ns1 { +inline namespace ns2_v1_0_0 { +class A { +}; +} + +namespace ns2_v0_9_0 { +class [[deprecated]] A {}; +} + +namespace { +class Anon final : public A { +}; +} +} + +namespace ns3 { + +namespace ns1::ns2 { +class Anon : public t00015::ns1::A { +}; +} + +class B : public ns1::ns2::Anon { +}; +} +} +} + +``` +## Generated UML diagrams +![t00015_class](./t00015_class.png "Namespace fun") diff --git a/docs/test_cases/t00015_class.png b/docs/test_cases/t00015_class.png new file mode 100644 index 0000000000000000000000000000000000000000..02ca9ee9d757a774fde53e4f111b361d286b491e GIT binary patch literal 11013 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 ICSer(AEmz_{r~^~ literal 0 HcmV?d00001 diff --git a/src/uml/class_diagram_visitor.cc b/src/uml/class_diagram_visitor.cc index cbc44914..c15e6b51 100644 --- a/src/uml/class_diagram_visitor.cc +++ b/src/uml/class_diagram_visitor.cc @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -78,12 +79,22 @@ void tu_visitor::operator()(const cppast::cpp_entity &file) cppast::visitor_info::container_entity_enter) { LOG_DBG("========== Visiting '{}' - {}", e.name(), cppast::to_string(e.kind())); - ctx.namespace_.push_back(e.name()); + + const auto &ns_declaration = + static_cast(e); + if (!ns_declaration.is_anonymous() && + !ns_declaration.is_inline()) + ctx.namespace_.push_back(e.name()); } else { LOG_DBG("========== Leaving '{}' - {}", e.name(), cppast::to_string(e.kind())); - ctx.namespace_.pop_back(); + + const auto &ns_declaration = + static_cast(e); + if (!ns_declaration.is_anonymous() && + !ns_declaration.is_inline()) + ctx.namespace_.pop_back(); } } else if (e.kind() == cppast::cpp_entity_kind::class_t) { diff --git a/tests/t00015/t00015.cc b/tests/t00015/t00015.cc index 968c3a53..a7762cac 100644 --- a/tests/t00015/t00015.cc +++ b/tests/t00015/t00015.cc @@ -1,9 +1,15 @@ namespace clanguml { namespace t00015 { -namespace ns1::ns2 { +namespace ns1 { +inline namespace ns2_v1_0_0 { class A { }; +} + +namespace ns2_v0_9_0 { +class [[deprecated]] A {}; +} namespace { class Anon final : public A { @@ -14,7 +20,7 @@ class Anon final : public A { namespace ns3 { namespace ns1::ns2 { -class Anon : public t00015::ns1::ns2::A { +class Anon : public t00015::ns1::A { }; } diff --git a/tests/t00015/test_case.h b/tests/t00015/test_case.h index 24e034d7..f5f89f1b 100644 --- a/tests/t00015/test_case.h +++ b/tests/t00015/test_case.h @@ -41,8 +41,10 @@ TEST_CASE("t00015", "[test-case][class]") REQUIRE_THAT(puml, StartsWith("@startuml")); REQUIRE_THAT(puml, EndsWith("@enduml\n")); - REQUIRE_THAT(puml, IsClass(_A("ns1::ns2::A"))); - REQUIRE_THAT(puml, IsClass(_A("ns1::ns2::Anon"))); + REQUIRE_THAT(puml, IsClass(_A("ns1::A"))); + REQUIRE_THAT(puml, IsClass(_A("ns1::ns2_v0_9_0::A"))); + REQUIRE_THAT(puml, IsClass(_A("ns1::Anon"))); + REQUIRE_THAT(puml, IsClass(_A("ns3::ns1::ns2::Anon"))); REQUIRE_THAT(puml, IsClass(_A("ns3::B"))); save_puml(