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 00000000..02ca9ee9 Binary files /dev/null and b/docs/test_cases/t00015_class.png differ 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(