diff --git a/src/common/generators/plantuml/generator.h b/src/common/generators/plantuml/generator.h index e21f474e..44877215 100644 --- a/src/common/generators/plantuml/generator.h +++ b/src/common/generators/plantuml/generator.h @@ -280,10 +280,12 @@ void generator::generate(std::ostream &ostr) const generate_title(ostr); + // Generate PlantUML directives before auto generated content generate_plantuml_directives(ostr, config.puml().before); generate_diagram(ostr); + // Generate PlantUML directives after auto generated content generate_plantuml_directives(ostr, config.puml().after); generate_metadata(ostr); diff --git a/src/common/model/diagram_filter.cc b/src/common/model/diagram_filter.cc index d29db4da..3e807d92 100644 --- a/src/common/model/diagram_filter.cc +++ b/src/common/model/diagram_filter.cc @@ -346,6 +346,35 @@ tvl::value_t element_filter::match(const diagram &d, const element &e) const }); } +tvl::value_t element_filter::match( + const diagram &d, const sequence_diagram::model::participant &p) const +{ + using sequence_diagram::model::method; + using sequence_diagram::model::participant; + + if (d.type() != diagram_t::kSequence) + return {}; + + const auto &sequence_model = + dynamic_cast(d); + return tvl::any_of(elements_.begin(), elements_.end(), + [&sequence_model, &p](const auto &el) { + if (p.type_name() == "method") { + + const auto &m = dynamic_cast(p); + const auto class_id = m.class_id(); + const auto &class_participant = + sequence_model.get_participant(class_id) + .value(); + + return el == p.full_name(false) || + el == class_participant.full_name(false); + } + + return el == p.full_name(false); + }); +} + element_type_filter::element_type_filter( filter_t type, std::vector element_types) : filter_visitor{type} diff --git a/src/common/model/diagram_filter.h b/src/common/model/diagram_filter.h index 81cd25b6..a3b868ae 100644 --- a/src/common/model/diagram_filter.h +++ b/src/common/model/diagram_filter.h @@ -180,6 +180,9 @@ struct element_filter : public filter_visitor { tvl::value_t match(const diagram &d, const element &e) const override; + tvl::value_t match(const diagram &d, + const sequence_diagram::model::participant &p) const override; + private: std::vector elements_; }; diff --git a/src/sequence_diagram/generators/mermaid/sequence_diagram_generator.cc b/src/sequence_diagram/generators/mermaid/sequence_diagram_generator.cc index e35dbb49..9183c894 100644 --- a/src/sequence_diagram/generators/mermaid/sequence_diagram_generator.cc +++ b/src/sequence_diagram/generators/mermaid/sequence_diagram_generator.cc @@ -37,7 +37,7 @@ std::string render_participant_name(std::string name) std::string render_message_text(std::string text) { - util::replace_all(text, ";", "#59;"); + util::replace_all(text, ";", ";"); return text; } @@ -481,6 +481,12 @@ void generator::generate_diagram(std::ostream &ostr) const if (from_activity_id == 0 || to_activity_id == 0) continue; + if (model().participants().count(from_activity_id) == 0) + continue; + + if (model().participants().count(to_activity_id) == 0) + continue; + auto message_chains_unique = model().get_all_from_to_message_chains( from_activity_id, to_activity_id); @@ -522,6 +528,9 @@ void generator::generate_diagram(std::ostream &ostr) const for (const auto &mc : message_chains_unique) { const auto from_activity_id = mc.front().from(); + if (model().participants().count(from_activity_id) == 0) + continue; + const auto &from = model().get_participant(from_activity_id); @@ -547,6 +556,9 @@ void generator::generate_diagram(std::ostream &ostr) const if (sf.location_type == location_t::function) { common::id_t start_from{0}; for (const auto &[k, v] : model().sequences()) { + if (model().participants().count(v.from()) == 0) + continue; + const auto &caller = *model().participants().at(v.from()); std::string vfrom = caller.full_name(false); if (vfrom == sf.location) { @@ -566,6 +578,9 @@ void generator::generate_diagram(std::ostream &ostr) const // Use this to break out of recurrent loops std::vector visited_participants; + if (model().participants().count(start_from) == 0) + continue; + const auto &from = model().get_participant(start_from); diff --git a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc index 2207c95d..7d97a80e 100644 --- a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc +++ b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc @@ -483,6 +483,12 @@ void generator::generate_diagram(std::ostream &ostr) const if (from_activity_id == 0 || to_activity_id == 0) continue; + if (model().participants().count(from_activity_id) == 0) + continue; + + if (model().participants().count(to_activity_id) == 0) + continue; + auto message_chains_unique = model().get_all_from_to_message_chains( from_activity_id, to_activity_id); @@ -530,6 +536,9 @@ void generator::generate_diagram(std::ostream &ostr) const const auto from_activity_id = mc.front().from(); + if (model().participants().count(from_activity_id) == 0) + continue; + const auto &from = model().get_participant(from_activity_id); @@ -553,6 +562,9 @@ void generator::generate_diagram(std::ostream &ostr) const if (sf.location_type == location_t::function) { common::id_t start_from{0}; for (const auto &[k, v] : model().sequences()) { + if (model().participants().count(v.from()) == 0) + continue; + const auto &caller = *model().participants().at(v.from()); std::string vfrom = caller.full_name(false); if (vfrom == sf.location) { @@ -569,6 +581,9 @@ void generator::generate_diagram(std::ostream &ostr) const continue; } + if (model().participants().count(start_from) == 0) + continue; + // Use this to break out of recurrent loops std::vector visited_participants; diff --git a/src/sequence_diagram/model/diagram.cc b/src/sequence_diagram/model/diagram.cc index 176b2253..5edb4220 100644 --- a/src/sequence_diagram/model/diagram.cc +++ b/src/sequence_diagram/model/diagram.cc @@ -413,6 +413,8 @@ void diagram::print() const LOG_TRACE(" --- Activities ---"); for (const auto &[from_id, act] : sequences_) { + if (participants_.count(from_id) == 0) + continue; LOG_TRACE("Sequence id={}:", from_id);