From f93cbe8ff25c417e8e3598fecc9b5aa5532f0f9b Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sat, 10 Sep 2022 19:28:19 +0200 Subject: [PATCH] Fixed handling of nested classes in relative namespaces --- src/class_diagram/model/class.h | 2 +- src/class_diagram/visitor/translation_unit_visitor.cc | 8 ++++---- src/common/model/element.h | 2 ++ tests/t00004/t00004.cc | 10 ++++++++++ tests/t00004/test_case.h | 4 ++++ 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/class_diagram/model/class.h b/src/class_diagram/model/class.h index 2b2abb49..a894ada6 100644 --- a/src/class_diagram/model/class.h +++ b/src/class_diagram/model/class.h @@ -70,7 +70,7 @@ public: std::string full_name(bool relative = true) const override; - std::string full_name_no_ns() const; + std::string full_name_no_ns() const override; bool is_abstract() const; diff --git a/src/class_diagram/visitor/translation_unit_visitor.cc b/src/class_diagram/visitor/translation_unit_visitor.cc index 199e3700..01fbb9cb 100644 --- a/src/class_diagram/visitor/translation_unit_visitor.cc +++ b/src/class_diagram/visitor/translation_unit_visitor.cc @@ -176,7 +176,7 @@ bool translation_unit_visitor::VisitEnumDecl(clang::EnumDecl *enm) assert(parent_class); e.set_namespace(ns); - e.set_name(parent_class.value().full_name(true) + "##" + + e.set_name(parent_class.value().full_name_no_ns() + "##" + enm->getNameAsString()); e.set_id(common::to_id(e.full_name(false))); e.add_relationship({relationship_t::kContainment, *id_opt}); @@ -462,19 +462,19 @@ std::unique_ptr translation_unit_visitor::create_class_declaration( const auto &[label, hint, access] = anonymous_struct_relationships_[cls->getID()]; - c.set_name(parent_class.value().full_name(true) + "##" + + c.set_name(parent_class.value().full_name_no_ns() + "##" + fmt::format("({})", label)); parent_class.value().add_relationship( {hint, common::to_id(c.full_name(false)), access, label}); } else - c.set_name(parent_class.value().full_name(true) + "##" + + c.set_name(parent_class.value().full_name_no_ns() + "##" + fmt::format( "(anonymous_{})", std::to_string(cls->getID()))); } else { - c.set_name(parent_class.value().full_name(true) + "##" + + c.set_name(parent_class.value().full_name_no_ns() + "##" + cls->getNameAsString()); } diff --git a/src/common/model/element.h b/src/common/model/element.h index e4655b43..6348d78c 100644 --- a/src/common/model/element.h +++ b/src/common/model/element.h @@ -60,6 +60,8 @@ public: return name_and_ns(); } + virtual std::string full_name_no_ns() const { return name(); } + void set_using_namespaces(const namespace_ &un); const namespace_ &using_namespace() const; diff --git a/tests/t00004/t00004.cc b/tests/t00004/t00004.cc index 3ccd4592..e81c8fab 100644 --- a/tests/t00004/t00004.cc +++ b/tests/t00004/t00004.cc @@ -35,5 +35,15 @@ public: enum class CC { CC_1, CC_2 }; }; +namespace detail { +class D { +public: + enum class AA { AA_1, AA_2, AA_3 }; + + class DD { + }; +}; +} + } } diff --git a/tests/t00004/test_case.h b/tests/t00004/test_case.h index d6bc5bc2..23bb1b94 100644 --- a/tests/t00004/test_case.h +++ b/tests/t00004/test_case.h @@ -58,6 +58,10 @@ TEST_CASE("t00004", "[test-case][class]") REQUIRE_THAT(puml, IsInnerClass(_A("C"), _A("C::CC"))); REQUIRE_THAT(puml, IsInnerClass(_A("C::AA"), _A("C::AA::CCC"))); + REQUIRE_THAT(puml, IsClass(_A("detail::D"))); + REQUIRE_THAT(puml, IsClass(_A("detail::D::DD"))); + REQUIRE_THAT(puml, IsEnum(_A("detail::D::AA"))); + save_puml( "./" + config.output_directory() + "/" + diagram->name + ".puml", puml); }