From 4eab1e62b59e5fcc30af2c3cbb171c3ab96f5b1a Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Wed, 16 Feb 2022 19:54:49 +0100 Subject: [PATCH] Refactored sequence diagram generator --- src/common/generators/plantuml/generator.cc | 12 ++++++ src/common/generators/plantuml/generator.h | 4 +- src/common/model/enums.cc | 12 ++++++ src/common/model/enums.h | 5 +++ .../plantuml/sequence_diagram_generator.cc | 38 ++++--------------- .../plantuml/sequence_diagram_generator.h | 18 ++++----- src/sequence_diagram/model/diagram.cc | 5 +++ src/sequence_diagram/model/diagram.h | 2 + src/sequence_diagram/model/enums.h | 24 ------------ src/sequence_diagram/model/message.h | 4 +- .../visitor/translation_unit_visitor.cc | 2 +- 11 files changed, 57 insertions(+), 69 deletions(-) delete mode 100644 src/sequence_diagram/model/enums.h diff --git a/src/common/generators/plantuml/generator.cc b/src/common/generators/plantuml/generator.cc index 8cc60542..139a04b8 100644 --- a/src/common/generators/plantuml/generator.cc +++ b/src/common/generators/plantuml/generator.cc @@ -56,4 +56,16 @@ std::string to_plantuml(scope_t scope) } } +std::string to_plantuml(message_t r) +{ + switch (r) { + case message_t::kCall: + return "->"; + case message_t::kReturn: + return "-->"; + default: + return ""; + } +} + } diff --git a/src/common/generators/plantuml/generator.h b/src/common/generators/plantuml/generator.h index 21ee64e7..46febef1 100644 --- a/src/common/generators/plantuml/generator.h +++ b/src/common/generators/plantuml/generator.h @@ -18,7 +18,6 @@ #pragma once #include "config/config.h" -#include "generator.h" #include "util/error.h" #include "util/util.h" @@ -26,12 +25,13 @@ namespace clanguml::common::generators::plantuml { +using clanguml::common::model::message_t; using clanguml::common::model::relationship_t; using clanguml::common::model::scope_t; std::string to_plantuml(relationship_t r, std::string style); - std::string to_plantuml(scope_t scope); +std::string to_plantuml(message_t r); template class generator { public: diff --git a/src/common/model/enums.cc b/src/common/model/enums.cc index a0c88f6a..df734e6d 100644 --- a/src/common/model/enums.cc +++ b/src/common/model/enums.cc @@ -78,4 +78,16 @@ std::string to_string(access_t a) assert(false); } } + +std::string to_string(message_t r) +{ + switch (r) { + case message_t::kCall: + return "call"; + case message_t::kReturn: + return "return"; + default: + assert(false); + } +} } diff --git a/src/common/model/enums.h b/src/common/model/enums.h index 86a6a210..2b553562 100644 --- a/src/common/model/enums.h +++ b/src/common/model/enums.h @@ -38,9 +38,14 @@ enum class relationship_t { kDependency }; +enum class message_t { kCall, kReturn }; + std::string to_string(relationship_t r); std::string to_string(scope_t r); std::string to_string(access_t r); + +std::string to_string(message_t r); + } diff --git a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc index 6bb06a4c..6e126966 100644 --- a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc +++ b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc @@ -25,12 +25,10 @@ namespace clanguml::sequence_diagram::generators::plantuml { -using diagram_model = clanguml::sequence_diagram::model::diagram; -using diagram_config = clanguml::config::sequence_diagram::diagram; +using clanguml::common::model::message_t; using clanguml::config::source_location; using clanguml::sequence_diagram::model::activity; using clanguml::sequence_diagram::model::message; -using clanguml::sequence_diagram::model::message_t; using clanguml::sequence_diagram::visitor::translation_unit_context; using namespace clanguml::util; @@ -40,31 +38,18 @@ using namespace clanguml::util; generator::generator( clanguml::config::sequence_diagram &config, diagram_model &model) - : m_config(config) - , m_model(model) + : common_generator{config, model} { } -std::string generator::to_string(message_t r) const -{ - switch (r) { - case message_t::kCall: - return "->"; - case message_t::kReturn: - return "<--"; - default: - return ""; - } -} - void generator::generate_call(const message &m, std::ostream &ostr) const { const auto from = ns_relative(m_config.using_namespace(), m.from); const auto to = ns_relative(m_config.using_namespace(), m.to); ostr << '"' << from << "\" " - << "->" - << " \"" << to << "\" : " << m.message << "()" << std::endl; + << common::generators::plantuml::to_plantuml(message_t::kCall) << " \"" + << to << "\" : " << m.message << "()" << std::endl; } void generator::generate_return(const message &m, std::ostream &ostr) const @@ -76,7 +61,7 @@ void generator::generate_return(const message &m, std::ostream &ostr) const const auto to = ns_relative(m_config.using_namespace(), m.to); ostr << '"' << to << "\" " - << "-->" + << common::generators::plantuml::to_plantuml(message_t::kReturn) << " \"" << from << "\"" << std::endl; } } @@ -98,8 +83,7 @@ void generator::generate(std::ostream &ostr) const { ostr << "@startuml" << std::endl; - for (const auto &b : m_config.puml().before) - ostr << b << std::endl; + generate_plantuml_directives(ostr, m_config.puml().before); for (const auto &sf : m_config.start_from()) { if (sf.location_type == source_location::location_t::function) { @@ -117,18 +101,12 @@ void generator::generate(std::ostream &ostr) const continue; } } - for (const auto &a : m_config.puml().after) - ostr << a << std::endl; + + generate_plantuml_directives(ostr, m_config.puml().after); ostr << "@enduml" << std::endl; } -std::ostream &operator<<(std::ostream &os, const generator &g) -{ - g.generate(os); - return os; -} - clanguml::sequence_diagram::model::diagram generate( cppast::libclang_compilation_database &db, const std::string &name, clanguml::config::sequence_diagram &diagram) diff --git a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.h b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.h index f54fc42a..b47aa630 100644 --- a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.h +++ b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.h @@ -17,6 +17,7 @@ */ #pragma once +#include "common/generators/plantuml/generator.h" #include "config/config.h" #include "cx/compilation_database.h" #include "sequence_diagram/model/diagram.h" @@ -36,13 +37,16 @@ namespace sequence_diagram { namespace generators { namespace plantuml { +using diagram_config = clanguml::config::sequence_diagram; using diagram_model = clanguml::sequence_diagram::model::diagram; -class generator { -public: - generator(clanguml::config::sequence_diagram &config, diagram_model &model); +template +using common_generator = + clanguml::common::generators::plantuml::generator; - std::string to_string(clanguml::sequence_diagram::model::message_t r) const; +class generator : public common_generator { +public: + generator(diagram_config &config, diagram_model &model); void generate_call(const clanguml::sequence_diagram::model::message &m, std::ostream &ostr) const; @@ -54,12 +58,6 @@ public: std::ostream &ostr) const; void generate(std::ostream &ostr) const; - - friend std::ostream &operator<<(std::ostream &os, const generator &g); - -private: - clanguml::config::sequence_diagram &m_config; - clanguml::sequence_diagram::model::diagram &m_model; }; clanguml::sequence_diagram::model::diagram generate( diff --git a/src/sequence_diagram/model/diagram.cc b/src/sequence_diagram/model/diagram.cc index 6204153b..b83869ce 100644 --- a/src/sequence_diagram/model/diagram.cc +++ b/src/sequence_diagram/model/diagram.cc @@ -29,4 +29,9 @@ namespace clanguml::sequence_diagram::model { +std::string diagram::to_alias(const std::string &full_name) const +{ + return full_name; +} + } diff --git a/src/sequence_diagram/model/diagram.h b/src/sequence_diagram/model/diagram.h index e6ddf2cf..240a0b1b 100644 --- a/src/sequence_diagram/model/diagram.h +++ b/src/sequence_diagram/model/diagram.h @@ -25,6 +25,8 @@ namespace clanguml::sequence_diagram::model { struct diagram { + std::string to_alias(const std::string &full_name) const; + bool started{false}; std::string name; diff --git a/src/sequence_diagram/model/enums.h b/src/sequence_diagram/model/enums.h deleted file mode 100644 index 05a808e7..00000000 --- a/src/sequence_diagram/model/enums.h +++ /dev/null @@ -1,24 +0,0 @@ -/** - * src/sequence_diagram/model/enums.h - * - * Copyright (c) 2021-2022 Bartek Kryza - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#pragma once - -namespace clanguml::sequence_diagram::model { - -enum class message_t { kCall, kReturn }; - -} diff --git a/src/sequence_diagram/model/message.h b/src/sequence_diagram/model/message.h index 8c790eab..cbe7cbfd 100644 --- a/src/sequence_diagram/model/message.h +++ b/src/sequence_diagram/model/message.h @@ -17,7 +17,7 @@ */ #pragma once -#include "enums.h" +#include "common/model/enums.h" #include #include @@ -25,7 +25,7 @@ namespace clanguml::sequence_diagram::model { struct message { - message_t type; + common::model::message_t type; std::string from; std::uint_least64_t from_usr; std::string to; diff --git a/src/sequence_diagram/visitor/translation_unit_visitor.cc b/src/sequence_diagram/visitor/translation_unit_visitor.cc index 7091dafd..65244d07 100644 --- a/src/sequence_diagram/visitor/translation_unit_visitor.cc +++ b/src/sequence_diagram/visitor/translation_unit_visitor.cc @@ -36,10 +36,10 @@ translation_unit_visitor::translation_unit_visitor( void translation_unit_visitor::process_activities(const cppast::cpp_function &e) { + using clanguml::common::model::message_t; using clanguml::sequence_diagram::model::activity; using clanguml::sequence_diagram::model::diagram; using clanguml::sequence_diagram::model::message; - using clanguml::sequence_diagram::model::message_t; using cppast::cpp_entity; using cppast::cpp_entity_kind; using cppast::cpp_function;