diff --git a/src/class_diagram/visitor/translation_unit_visitor.cc b/src/class_diagram/visitor/translation_unit_visitor.cc index 31d57736..e15d6d26 100644 --- a/src/class_diagram/visitor/translation_unit_visitor.cc +++ b/src/class_diagram/visitor/translation_unit_visitor.cc @@ -1069,8 +1069,6 @@ void translation_unit_visitor::process_class_bases( cp.set_name(name_and_ns.to_string()); - base.getType().dump(); - if (const auto *tsp = base.getType()->getAs(); tsp != nullptr) { @@ -2227,9 +2225,8 @@ void translation_unit_visitor::find_instantiation_relationships( common::model::template_element &template_instantiation_base, const std::string &full_name, common::id_t templated_decl_id) { - class_diagram::model::class_ &template_instantiation = - dynamic_cast( - template_instantiation_base); + auto &template_instantiation = dynamic_cast( + template_instantiation_base); // First try to find the best match for this template in partially // specialized templates diff --git a/src/common/clang_utils.cc b/src/common/clang_utils.cc index ceefbaad..8ce1a351 100644 --- a/src/common/clang_utils.cc +++ b/src/common/clang_utils.cc @@ -932,14 +932,12 @@ bool is_struct(const clang::NamedDecl *decl) if (decl == nullptr) return false; - if (const clang::CXXRecordDecl *record = - clang::dyn_cast(decl); + if (const auto *record = clang::dyn_cast(decl); record) { return record->isStruct(); } - if (const clang::TagDecl *tag = clang::dyn_cast(decl); - tag) { + if (const auto *tag = clang::dyn_cast(decl); tag) { return tag->isStruct(); } diff --git a/src/common/model/template_element.h b/src/common/model/template_element.h index ad70eaab..338bb64f 100644 --- a/src/common/model/template_element.h +++ b/src/common/model/template_element.h @@ -29,7 +29,7 @@ class template_element : public element, public template_trait { public: using element::element; - virtual ~template_element() = default; + ~template_element() override = default; /** * Whether or not the class is a template. @@ -76,4 +76,4 @@ private: bool is_template_{false}; }; -} \ No newline at end of file +} // namespace clanguml::common::model \ No newline at end of file diff --git a/src/common/visitor/template_builder.h b/src/common/visitor/template_builder.h index 07e16976..25b00df9 100644 --- a/src/common/visitor/template_builder.h +++ b/src/common/visitor/template_builder.h @@ -25,7 +25,6 @@ namespace clanguml::common::visitor { -// using class_diagram::model::class_; using common::model::namespace_; using common::model::relationship_t; using common::model::template_parameter; @@ -540,4 +539,4 @@ private: on_argument_base_found_t on_argument_base_found_; }; -} // namespace clanguml::class_diagram::visitor \ No newline at end of file +} // namespace clanguml::common::visitor \ No newline at end of file diff --git a/src/config/config.cc b/src/config/config.cc index 829c1361..012ebfcc 100644 --- a/src/config/config.cc +++ b/src/config/config.cc @@ -226,8 +226,15 @@ std::string inheritable_diagram_options::simplify_template_type( type_aliases_longer_first_t aliases; aliases.insert(type_aliases().begin(), type_aliases().end()); - for (const auto &[pattern, replacement] : aliases) { - util::replace_all(full_name, pattern, replacement); + bool matched{true}; + while (matched) { + auto matched_in_iteration{false}; + for (const auto &[pattern, replacement] : aliases) { + matched_in_iteration = + util::replace_all(full_name, pattern, replacement) || + matched_in_iteration; + } + matched = matched_in_iteration; } return full_name; diff --git a/src/config/config.h b/src/config/config.h index 32944fdd..029e934a 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -458,8 +458,18 @@ struct relationship_hint_t { using relationship_hints_t = std::map; using type_aliases_t = std::map; + +struct type_aliases_longer_first_comparator { + bool operator()(const std::string &a, const std::string &b) const + { + if (a.size() == b.size()) + return a > b; + + return a.size() > b.size(); + } +}; using type_aliases_longer_first_t = - std::map>; + std::map; enum class location_t { marker, fileline, function }; diff --git a/src/sequence_diagram/generators/mermaid/sequence_diagram_generator.cc b/src/sequence_diagram/generators/mermaid/sequence_diagram_generator.cc index af403651..e35dbb49 100644 --- a/src/sequence_diagram/generators/mermaid/sequence_diagram_generator.cc +++ b/src/sequence_diagram/generators/mermaid/sequence_diagram_generator.cc @@ -378,10 +378,13 @@ void generator::generate_participant( print_debug(class_participant, ostr); + auto participant_name = + config().using_namespace().relative(config().simplify_template_type( + class_participant.full_name(false))); + common::ensure_lambda_type_is_relative(config(), participant_name); + ostr << indent(1) << "participant " << class_participant.alias() - << " as " - << render_participant_name(config().using_namespace().relative( - class_participant.full_name(false))); + << " as " << render_participant_name(participant_name); ostr << '\n'; @@ -418,9 +421,12 @@ void generator::generate_participant( else { print_debug(participant, ostr); + auto participant_name = config().using_namespace().relative( + config().simplify_template_type(participant.full_name(false))); + common::ensure_lambda_type_is_relative(config(), participant_name); + ostr << indent(1) << "participant " << participant.alias() << " as " - << config().using_namespace().relative( - participant.full_name(false)); + << render_participant_name(participant_name); ostr << '\n'; generated_participants_.emplace(participant_id); diff --git a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc index 598b0b0f..2207c95d 100644 --- a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc +++ b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc @@ -370,10 +370,13 @@ void generator::generate_participant( print_debug(class_participant, ostr); - ostr << "participant \"" - << render_name(config().using_namespace().relative( - class_participant.full_name(false))) - << "\" as " << class_participant.alias(); + auto participant_name = + config().using_namespace().relative(config().simplify_template_type( + class_participant.full_name(false))); + common::ensure_lambda_type_is_relative(config(), participant_name); + + ostr << "participant \"" << render_name(participant_name) << "\" as " + << class_participant.alias(); if (config().generate_links) { common_generator::generate_link( @@ -416,10 +419,12 @@ void generator::generate_participant( else { print_debug(participant, ostr); - ostr << "participant \"" - << config().using_namespace().relative( - participant.full_name(false)) - << "\" as " << participant.alias(); + auto participant_name = config().using_namespace().relative( + config().simplify_template_type(participant.full_name(false))); + common::ensure_lambda_type_is_relative(config(), participant_name); + + ostr << "participant \"" << render_name(participant_name) << "\" as " + << participant.alias(); if (config().generate_links) { common_generator::generate_link( diff --git a/src/util/util.h b/src/util/util.h index c56c2ceb..d547fa18 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -164,7 +164,7 @@ template std::unique_ptr unique_pointer_cast(std::unique_ptr &&p) noexcept { if (T *const converted = dynamic_cast(p.get())) { - p.release(); + p.release(); // NOLINT return std::unique_ptr{converted}; }