diff --git a/src/class_diagram/visitor/template_builder.cc b/src/class_diagram/visitor/template_builder.cc index 65f1d903..b282f661 100644 --- a/src/class_diagram/visitor/template_builder.cc +++ b/src/class_diagram/visitor/template_builder.cc @@ -62,6 +62,7 @@ bool template_builder::simplify_system_template( if (simplified != full_name) { ct.set_type(simplified); + ct.set_id(common::to_id(simplified)); ct.clear_params(); return true; } @@ -435,6 +436,10 @@ void template_builder::process_template_arguments( arg_index++; } + + // Update id + template_instantiation.set_id( + common::to_id(template_instantiation.full_name(false))); } void template_builder::argument_process_dispatch( @@ -1029,6 +1034,9 @@ template_builder::try_as_template_specialization_type( simplify_system_template( argument, argument.to_string(using_namespace(), false)); + argument.set_id( + common::to_id(argument.to_string(using_namespace(), false))); + const auto nested_template_instantiation_full_name = nested_template_instantiation->full_name(false); @@ -1140,10 +1148,12 @@ std::optional template_builder::try_as_record_type( auto argument = template_parameter::make_argument({}); type = consume_context(type, argument); - auto type_name = common::to_string(type, template_decl->getASTContext()); + const auto type_name = config().simplify_template_type( + common::to_string(type, template_decl->getASTContext())); argument.set_type(type_name); const auto type_id = common::to_id(type_name); + argument.set_id(type_id); const auto *class_template_specialization = diff --git a/src/common/model/relationship.h b/src/common/model/relationship.h index 7052f397..61516487 100644 --- a/src/common/model/relationship.h +++ b/src/common/model/relationship.h @@ -47,7 +47,7 @@ public: * @param multiplicity_source Multiplicity at the source * @param multiplicity_destination Multiplicity at the destination */ - relationship(relationship_t type, int64_t destination, + relationship(relationship_t type, clanguml::common::id_t destination, access_t access = access_t::kPublic, std::string label = "", std::string multiplicity_source = "", std::string multiplicity_destination = ""); @@ -144,7 +144,7 @@ public: private: relationship_t type_; - int64_t destination_; + clanguml::common::id_t destination_; std::string multiplicity_source_; std::string multiplicity_destination_; std::string label_; diff --git a/src/common/model/template_parameter.cc b/src/common/model/template_parameter.cc index 03cef951..90fdaa75 100644 --- a/src/common/model/template_parameter.cc +++ b/src/common/model/template_parameter.cc @@ -517,6 +517,9 @@ bool template_parameter::find_nested_relationships( // just add it and skip recursion (e.g. this is a user defined type) const auto maybe_type = type(); + if (is_function_template()) + hint = common::model::relationship_t::kDependency; + if (maybe_type && should_include(maybe_type.value())) { if (is_association()) hint = common::model::relationship_t::kAssociation; @@ -538,7 +541,8 @@ bool template_parameter::find_nested_relationships( if (maybe_id && maybe_arg_type && should_include(*maybe_arg_type)) { - if (template_argument.is_association()) + if (template_argument.is_association() && + hint == common::model::relationship_t::kAggregation) hint = common::model::relationship_t::kAssociation; nested_relationships.emplace_back(maybe_id.value(), hint); @@ -547,6 +551,9 @@ bool template_parameter::find_nested_relationships( (hint == common::model::relationship_t::kAggregation); } else { + if (template_argument.is_function_template()) + hint = common::model::relationship_t::kDependency; + added_aggregation_relationship = template_argument.find_nested_relationships( nested_relationships, hint, should_include); diff --git a/tests/t00014/test_case.h b/tests/t00014/test_case.h index 50ab931f..faec6fa7 100644 --- a/tests/t00014/test_case.h +++ b/tests/t00014/test_case.h @@ -136,12 +136,9 @@ TEST_CASE("t00014", "[test-case][class]") REQUIRE_THAT(src, IsAggregation(_A("R"), _A("A>"), "-floatstring")); -#if !defined(__APPLE__) - // TODO(#176) REQUIRE_THAT(src, IsDependency(_A("R"), _A("A"))); REQUIRE_THAT( src, IsDependency(_A("R"), _A("A"))); -#endif save_puml(config.output_directory(), diagram->name + ".puml", src); }