From d00ca79241c006dcc5389898e287faaa0ae27f46 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sun, 9 Jul 2023 11:03:28 +0200 Subject: [PATCH] Add from_to config option --- src/config/config.h | 1 + src/config/yaml_decoders.cc | 1 + src/config/yaml_emitters.cc | 1 + .../plantuml/sequence_diagram_generator.cc | 55 ++++++++++++++++++- .../plantuml/sequence_diagram_generator.h | 2 + 5 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/config/config.h b/src/config/config.h index ea4444b8..66e09771 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -542,6 +542,7 @@ struct sequence_diagram : public diagram { common::model::diagram_t type() const override; option> start_from{"start_from"}; + option>> from_to{"from_to"}; }; /** diff --git a/src/config/yaml_decoders.cc b/src/config/yaml_decoders.cc index f1fd98b7..00880276 100644 --- a/src/config/yaml_decoders.cc +++ b/src/config/yaml_decoders.cc @@ -574,6 +574,7 @@ template <> struct convert { return false; get_option(node, rhs.start_from); + get_option(node, rhs.from_to); get_option(node, rhs.combine_free_functions_into_file_participants); get_option(node, rhs.generate_return_types); get_option(node, rhs.generate_condition_statements); diff --git a/src/config/yaml_emitters.cc b/src/config/yaml_emitters.cc index f653b8d1..94493631 100644 --- a/src/config/yaml_emitters.cc +++ b/src/config/yaml_emitters.cc @@ -348,6 +348,7 @@ YAML::Emitter &operator<<(YAML::Emitter &out, const sequence_diagram &c) out << YAML::BeginMap; out << YAML::Key << "type" << YAML::Value << c.type(); out << c.start_from; + out << c.from_to; out << dynamic_cast(c); out << YAML::EndMap; return out; diff --git a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc index 33accb93..4bbb4b24 100644 --- a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc +++ b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc @@ -415,7 +415,60 @@ void generator::generate_diagram(std::ostream &ostr) const } } - for (const auto &sf : config().start_from()) { + for (const auto &ft : m_config.from_to()) { + // First, find the sequence of activities from 'from' location + // to 'to' location + assert(ft.size() == 2); + + const auto &from_location = ft.front(); + const auto &to_location = ft.back(); + + if (from_location.location_type == location_t::function) { + common::model::diagram_element::id_t from_activity{0}; + common::model::diagram_element::id_t to_activity{0}; + + for (const auto &[k, v] : m_model.sequences()) { + const auto &caller = *m_model.participants().at(v.from()); + std::string vfrom = caller.full_name(false); + if (vfrom == from_location.location) { + LOG_DBG("Found sequence diagram start point: {}", k); + from_activity = k; + break; + } + } + + if (from_activity == 0) { + LOG_WARN("Failed to find participant with {} for start_from " + "condition", + from_location.location); + continue; + } + + for (const auto &[k, v] : m_model.sequences()) { + const auto &caller = *m_model.participants().at(v.from()); + std::string vfrom = caller.full_name(false); + if (vfrom == to_location.location) { + LOG_DBG("Found sequence diagram end point: {}", k); + to_activity = k; + break; + } + } + + if (to_activity == 0) { + LOG_WARN("Failed to find participant with {} for from_to " + "condition", + to_location.location); + continue; + } + + call_chain_t activity_path; + activity_path.push_back(from_activity); + + auto found = search_path_to(activity_path, to_activity); + } + } + + for (const auto &sf : m_config.start_from()) { if (sf.location_type == location_t::function) { common::model::diagram_element::id_t start_from{0}; for (const auto &[k, v] : model().sequences()) { diff --git a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.h b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.h index df1466fe..c6546030 100644 --- a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.h +++ b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.h @@ -42,6 +42,8 @@ template using common_generator = clanguml::common::generators::plantuml::generator; +using call_chain_t = std::vector; + /** * @brief Sequence diagram PlantUML generator */