From fef88325ab05d41e733c308ac7c30ed25fd05ca6 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Fri, 9 Dec 2022 23:05:15 +0100 Subject: [PATCH] Added support for styling static methods in sequence diagrams --- src/sequence_diagram/model/participant.cc | 13 ++++++++++--- src/sequence_diagram/model/participant.h | 5 +++++ .../visitor/translation_unit_visitor.cc | 1 + tests/t20001/t20001.cc | 2 +- tests/t20001/test_case.h | 4 ++-- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/sequence_diagram/model/participant.cc b/src/sequence_diagram/model/participant.cc index 55a5f6fd..f9f15098 100644 --- a/src/sequence_diagram/model/participant.cc +++ b/src/sequence_diagram/model/participant.cc @@ -249,12 +249,15 @@ std::string method::full_name(bool /*relative*/) const std::string method::message_name(message_render_mode mode) const { + const std::string style = is_static() ? "__" : ""; + if (mode == message_render_mode::no_arguments) { - return fmt::format("{}(){}", method_name(), is_const() ? " const" : ""); + return fmt::format("{}{}(){}{}", style, method_name(), + is_const() ? " const" : "", style); } - return fmt::format("{}({}){}", method_name(), fmt::join(parameters(), ","), - is_const() ? " const" : ""); + return fmt::format("{}{}({}){}{}", style, method_name(), + fmt::join(parameters(), ","), is_const() ? " const" : "", style); } class_::diagram_element::id_t method::class_id() const { return class_id_; } @@ -265,6 +268,10 @@ std::string method::to_string() const type_name(), id(), full_name(false), class_id()); } +bool method::is_static() const { return is_static_; } + +void method::is_static(bool s) { is_static_ = s; } + function_template::function_template( const common::model::namespace_ &using_namespace) : function{using_namespace} diff --git a/src/sequence_diagram/model/participant.h b/src/sequence_diagram/model/participant.h index 03d59f4e..3b41fb62 100644 --- a/src/sequence_diagram/model/participant.h +++ b/src/sequence_diagram/model/participant.h @@ -200,10 +200,15 @@ struct method : public function { std::string to_string() const override; + bool is_static() const; + + void is_static(bool s); + private: diagram_element::id_t class_id_; std::string method_name_; std::string class_full_name_; + bool is_static_{false}; }; struct function_template : public function, public template_trait { diff --git a/src/sequence_diagram/visitor/translation_unit_visitor.cc b/src/sequence_diagram/visitor/translation_unit_visitor.cc index 14c1a2e8..bd8624c8 100644 --- a/src/sequence_diagram/visitor/translation_unit_visitor.cc +++ b/src/sequence_diagram/visitor/translation_unit_visitor.cc @@ -314,6 +314,7 @@ bool translation_unit_visitor::VisitCXXMethodDecl(clang::CXXMethodDecl *m) m_ptr->set_name( get_participant(m_ptr->class_id()).value().full_name_no_ns() + "::" + m->getNameAsString()); + m_ptr->is_static(m->isStatic()); for (const auto *param : m->parameters()) { m_ptr->add_parameter(simplify_system_template( diff --git a/tests/t20001/t20001.cc b/tests/t20001/t20001.cc index 98135a05..488c19fe 100644 --- a/tests/t20001/t20001.cc +++ b/tests/t20001/t20001.cc @@ -28,7 +28,7 @@ public: return res; } - void log_result(int r) { } + static void log_result(int r) { } private: detail::C m_c{}; diff --git a/tests/t20001/test_case.h b/tests/t20001/test_case.h index 87f3d4a3..0d6ea695 100644 --- a/tests/t20001/test_case.h +++ b/tests/t20001/test_case.h @@ -38,8 +38,8 @@ TEST_CASE("t20001", "[test-case][sequence]") REQUIRE_THAT(puml, StartsWith("@startuml")); REQUIRE_THAT(puml, EndsWith("@enduml\n")); - REQUIRE_THAT(puml, HasCall(_A("A"), "log_result(int)")); - REQUIRE_THAT(puml, HasCall(_A("B"), _A("A"), "log_result(int)")); + REQUIRE_THAT(puml, HasCall(_A("A"), "__log_result(int)__")); + REQUIRE_THAT(puml, HasCall(_A("B"), _A("A"), "__log_result(int)__")); REQUIRE_THAT( puml, HasCallWithResponse(_A("B"), _A("A"), "add3(int,int,int)")); REQUIRE_THAT(puml, HasCall(_A("A"), "add(int,int)"));