From 9376b856ccd9a4fb9d95902edea45fabcaa437aa Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Mon, 22 Jan 2024 09:50:47 +0100 Subject: [PATCH] Fixed template specialization handling in subclass filter --- src/class_diagram/model/diagram.cc | 4 ++ .../visitor/translation_unit_visitor.cc | 37 ++++++++++--------- src/common/model/diagram_filter.cc | 3 +- uml/class/nested_trait_hierarchy_class.yml | 3 +- uml/sequence/template_builder_sequence.yml | 8 ++-- 5 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/class_diagram/model/diagram.cc b/src/class_diagram/model/diagram.cc index 50aa49c6..a062cad2 100644 --- a/src/class_diagram/model/diagram.cc +++ b/src/class_diagram/model/diagram.cc @@ -141,6 +141,10 @@ void diagram::get_parents( if (found) found_new = true; } + else { + LOG_WARN("Couldn't find class representing base class: {} [{}]", + pp.name(), pp.id()); + } } } diff --git a/src/class_diagram/visitor/translation_unit_visitor.cc b/src/class_diagram/visitor/translation_unit_visitor.cc index af0a154d..31d57736 100644 --- a/src/class_diagram/visitor/translation_unit_visitor.cc +++ b/src/class_diagram/visitor/translation_unit_visitor.cc @@ -277,9 +277,6 @@ bool translation_unit_visitor::VisitTypeAliasTemplateDecl( tbuilder().build( *template_specialization_ptr, cls, *template_type_specialization_ptr); - if (!template_specialization_ptr) - return true; - if (diagram().should_include(*template_specialization_ptr)) { const auto name = template_specialization_ptr->full_name(); const auto id = template_specialization_ptr->id(); @@ -1072,22 +1069,28 @@ void translation_unit_visitor::process_class_bases( cp.set_name(name_and_ns.to_string()); - if (const auto *record_type = - base.getType()->getAs(); - record_type != nullptr) { - cp.set_name(record_type->getDecl()->getQualifiedNameAsString()); - cp.set_id(common::to_id(*record_type->getDecl())); - } - else if (const auto *tsp = - base.getType()->getAs(); - tsp != nullptr) { + base.getType().dump(); + + if (const auto *tsp = + base.getType()->getAs(); + tsp != nullptr) { auto template_specialization_ptr = std::make_unique(config().using_namespace()); tbuilder().build(*template_specialization_ptr, cls, *tsp, {}); - if (template_specialization_ptr) { - cp.set_id(template_specialization_ptr->id()); + + cp.set_id(template_specialization_ptr->id()); + cp.set_name(template_specialization_ptr->full_name(false)); + + if (diagram().should_include(*template_specialization_ptr)) { + add_class(std::move(template_specialization_ptr)); } } + else if (const auto *record_type = + base.getType()->getAs(); + record_type != nullptr) { + cp.set_name(record_type->getDecl()->getQualifiedNameAsString()); + cp.set_id(common::to_id(*record_type->getDecl())); + } else // This could be a template parameter - we don't want it here continue; @@ -1333,8 +1336,7 @@ void translation_unit_visitor::process_method( unaliased_type->getTemplateName().getAsTemplateDecl(), *unaliased_type, &c); - if (diagram().should_include( - template_specialization_ptr->get_namespace())) { + if (diagram().should_include(*template_specialization_ptr)) { relationships.emplace_back(template_specialization_ptr->id(), relationship_t::kDependency); @@ -1708,8 +1710,7 @@ void translation_unit_visitor::process_function_parameter( tbuilder().build(*template_specialization_ptr, templ->getTemplateName().getAsTemplateDecl(), *templ, &c); - if (diagram().should_include( - template_specialization_ptr->get_namespace())) { + if (diagram().should_include(*template_specialization_ptr)) { relationships.emplace_back(template_specialization_ptr->id(), relationship_t::kDependency); diff --git a/src/common/model/diagram_filter.cc b/src/common/model/diagram_filter.cc index a784ed56..d29db4da 100644 --- a/src/common/model/diagram_filter.cc +++ b/src/common/model/diagram_filter.cc @@ -498,8 +498,9 @@ tvl::value_t subclass_filter::match(const diagram &d, const element &e) const for (const auto &root : roots_) { for (const auto &parent : parents) { auto full_name = parent.get().full_name(false); - if (root == full_name) + if (root == full_name) { return true; + } } } diff --git a/uml/class/nested_trait_hierarchy_class.yml b/uml/class/nested_trait_hierarchy_class.yml index 4048fadb..5771552b 100644 --- a/uml/class/nested_trait_hierarchy_class.yml +++ b/uml/class/nested_trait_hierarchy_class.yml @@ -1,8 +1,9 @@ type: class title: Nested trait model class hierarchy include_relations_also_as_members: true +generate_packages: true glob: - - src/common/model/*.cc + - src/common/model/package.cc include: namespaces: - clanguml diff --git a/uml/sequence/template_builder_sequence.yml b/uml/sequence/template_builder_sequence.yml index 9c082d74..305bf45e 100644 --- a/uml/sequence/template_builder_sequence.yml +++ b/uml/sequence/template_builder_sequence.yml @@ -3,17 +3,17 @@ title: Diagram element template builder sequence diagram combine_free_functions_into_file_participants: true generate_method_arguments: none glob: - - src/class_diagram/visitor/template_builder.cc + - src/common/visitor/template_builder.cc include: namespaces: - clanguml paths: - - src/class_diagram/visitor/template_builder.h - - src/class_diagram/visitor/template_builder.cc + - src/common/visitor/template_builder.h + - src/common/visitor/template_builder.cc exclude: paths: - src/common/model/source_location.h using_namespace: - clanguml from: - - function: "clanguml::class_diagram::visitor::template_builder::build(const clang::NamedDecl *,const clang::TemplateSpecializationType &,std::optional)" + - function: "clanguml::common::visitor::template_builder::build(common::model::template_element &,const clang::NamedDecl *,const clang::TemplateSpecializationType &,std::optional)"