From ffc6d56c4dba1cf38568abd9b945ca4c51a458fa Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sat, 2 Apr 2022 15:47:32 +0200 Subject: [PATCH] Added comment() function support in package diagrams --- src/common/model/package.cc | 13 ---------- src/common/model/package.h | 2 ++ src/package_diagram/model/diagram.cc | 25 ++++++++++++++++++- src/package_diagram/model/diagram.h | 11 +++++++- .../visitor/translation_unit_visitor.cc | 7 ++++-- tests/t30001/.clang-uml | 4 ++- tests/t30001/t30001.cc | 2 ++ tests/t30001/test_case.h | 6 +++++ 8 files changed, 52 insertions(+), 18 deletions(-) diff --git a/src/common/model/package.cc b/src/common/model/package.cc index 27eb8679..b4a6aa7d 100644 --- a/src/common/model/package.cc +++ b/src/common/model/package.cc @@ -37,19 +37,6 @@ std::string package::full_name(bool relative) const return (get_namespace().relative_to(using_namespace()) | name()) .to_string(); - - // auto fn = get_namespace(); - // auto ns = using_namespace(); - // - // if (relative && (fn.size() >= ns.size())) { - // if (fn.starts_with(using_namespace()) - // fn = std::vector(fn.begin() + ns.size(), - // fn.end()); - // } - // - // fn.push_back(name()); - // - // return fmt::format("{}", fmt::join(fn, "::")); } bool package::is_deprecated() const { return is_deprecated_; } diff --git a/src/common/model/package.h b/src/common/model/package.h index 8202b4c2..9b28893e 100644 --- a/src/common/model/package.h +++ b/src/common/model/package.h @@ -48,6 +48,8 @@ public: void set_deprecated(bool deprecated); + void add_package(std::unique_ptr &&p); + private: bool is_deprecated_{false}; }; diff --git a/src/package_diagram/model/diagram.cc b/src/package_diagram/model/diagram.cc index b0eb4030..903609f4 100644 --- a/src/package_diagram/model/diagram.cc +++ b/src/package_diagram/model/diagram.cc @@ -28,10 +28,33 @@ common::model::diagram_t diagram::type() const return common::model::diagram_t::kPackage; } +void diagram::add_package(std::unique_ptr &&p) +{ + LOG_DBG("Adding package: {}, {}", p->name(), p->full_name(true)); + + auto ns = p->get_relative_namespace(); + + packages_.emplace_back(*p); + + add_element(ns, std::move(p)); +} + +type_safe::optional_ref diagram::get_package( + const std::string &name) const +{ + for (const auto &p : packages_) { + if (p.get().full_name(false) == name) { + return {p}; + } + } + + return type_safe::nullopt; +} + type_safe::optional_ref diagram::get( const std::string &full_name) const { - return {}; + return get_package(full_name); } std::string diagram::to_alias(const std::string &full_name) const diff --git a/src/package_diagram/model/diagram.h b/src/package_diagram/model/diagram.h index 81236add..f8c92553 100644 --- a/src/package_diagram/model/diagram.h +++ b/src/package_diagram/model/diagram.h @@ -40,9 +40,18 @@ public: common::model::diagram_t type() const override; - type_safe::optional_ref get( + type_safe::optional_ref get( const std::string &full_name) const; + void add_package(std::unique_ptr &&p); + + type_safe::optional_ref get_package( + const std::string &name) const; + std::string to_alias(const std::string &full_name) const; + +private: + std::vector> + packages_; }; } diff --git a/src/package_diagram/visitor/translation_unit_visitor.cc b/src/package_diagram/visitor/translation_unit_visitor.cc index b0632fc9..3b14a745 100644 --- a/src/package_diagram/visitor/translation_unit_visitor.cc +++ b/src/package_diagram/visitor/translation_unit_visitor.cc @@ -106,9 +106,12 @@ void translation_unit_visitor::operator()(const cppast::cpp_entity &file) p->set_namespace(package_parent); if (ctx.diagram().should_include(*p)) { - if (ns_declaration.comment().has_value()) + if (ns_declaration.comment().has_value()) { + p->set_comment( + ns_declaration.comment().value()); p->add_decorators(decorators::parse( ns_declaration.comment().value())); + } p->set_style(p->style_spec()); @@ -123,7 +126,7 @@ void translation_unit_visitor::operator()(const cppast::cpp_entity &file) if (!p->skip()) { auto rns = p->get_relative_namespace(); - ctx.diagram().add_element(rns, std::move(p)); + ctx.diagram().add_package(std::move(p)); ctx.set_current_package( ctx.diagram().get_element( package_path)); diff --git a/tests/t30001/.clang-uml b/tests/t30001/.clang-uml index d519c601..e025dbc5 100644 --- a/tests/t30001/.clang-uml +++ b/tests/t30001/.clang-uml @@ -17,4 +17,6 @@ diagrams: before: - "' t30001 test package diagram" after: - - 'note right of {{ alias("A::AA::AAA") }}: A AAA note...' \ No newline at end of file + - 'note right of {{ alias("A::AA::AAA") }}: A AAA note...' + - 'note top of {{ alias("A::AA") }} : {{ comment("A::AA") }}' + - 'note top of {{ alias("B::AA") }} : {{ comment("B::AA") }}' diff --git a/tests/t30001/t30001.cc b/tests/t30001/t30001.cc index 822ef9af..c9cbd174 100644 --- a/tests/t30001/t30001.cc +++ b/tests/t30001/t30001.cc @@ -1,6 +1,7 @@ namespace clanguml { namespace t30001 { namespace A { +/// This is namespace AA in namespace A namespace AA { namespace AAA { } // namespace AAA @@ -11,6 +12,7 @@ namespace BB { } // namespace BB } // namespace A namespace B { +/// This is namespace AA in namespace B namespace AA { namespace AAA { } // namespace AAA diff --git a/tests/t30001/test_case.h b/tests/t30001/test_case.h index 15c6a261..2b1b79ee 100644 --- a/tests/t30001/test_case.h +++ b/tests/t30001/test_case.h @@ -42,6 +42,12 @@ TEST_CASE("t30001", "[test-case][package]") REQUIRE_THAT(puml, IsPackage("AAA")); REQUIRE_THAT(puml, IsPackage("AAA")); + // TODO: Fix _A() to handle fully qualified names, right + // now it only finds the first element with unqalified + // name match + REQUIRE_THAT( + puml, HasNote(_A("AA"), "top", "This is namespace AA in namespace A")); + save_puml( "./" + config.output_directory() + "/" + diagram->name + ".puml", puml); }