From 3b573ff0348d73af91da98e2b7633ac798a10468 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sat, 13 May 2023 14:57:41 +0200 Subject: [PATCH] Fixed handling of anonymous template parameters --- src/class_diagram/visitor/template_builder.cc | 10 ++++---- .../visitor/translation_unit_visitor.cc | 10 +++++--- src/common/model/template_parameter.cc | 4 ++++ tests/t00016/test_case.h | 23 +++++++++++-------- tests/test_cases.cc | 1 + tests/test_cases.yaml | 3 +++ 6 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/class_diagram/visitor/template_builder.cc b/src/class_diagram/visitor/template_builder.cc index c7785ed6..0b05e619 100644 --- a/src/class_diagram/visitor/template_builder.cc +++ b/src/class_diagram/visitor/template_builder.cc @@ -1069,15 +1069,17 @@ std::optional template_builder::try_as_template_parm_type( auto argument = template_parameter::make_template_type(""); type = consume_context(type, argument); - argument.is_variadic(is_variadic); - auto type_parameter_name = common::to_string(type, cls->getASTContext()); - - ensure_lambda_type_is_relative(type_parameter_name); + if (type_parameter_name.empty()) + type_parameter_name = "typename"; argument.set_name(map_type_parameter_to_template_parameter_name( cls, type_parameter_name)); + argument.is_variadic(is_variadic); + + ensure_lambda_type_is_relative(type_parameter_name); + return argument; } diff --git a/src/class_diagram/visitor/translation_unit_visitor.cc b/src/class_diagram/visitor/translation_unit_visitor.cc index 7aa8ee10..9d5e8377 100644 --- a/src/class_diagram/visitor/translation_unit_visitor.cc +++ b/src/class_diagram/visitor/translation_unit_visitor.cc @@ -973,9 +973,13 @@ bool translation_unit_visitor::process_template_parameters( default_arg = template_type_parameter->getDefaultArgument().getAsString(); } - auto ct = template_parameter::make_template_type( - template_type_parameter->getNameAsString(), default_arg, - template_type_parameter->isParameterPack()); + + auto parameter_name = template_type_parameter->getNameAsString(); + if (parameter_name.empty()) + parameter_name = "typename"; + + auto ct = template_parameter::make_template_type(parameter_name, + default_arg, template_type_parameter->isParameterPack()); if (template_type_parameter->getTypeConstraint() != nullptr) { util::apply_if_not_null( diff --git a/src/common/model/template_parameter.cc b/src/common/model/template_parameter.cc index 34cc243f..3218cf30 100644 --- a/src/common/model/template_parameter.cc +++ b/src/common/model/template_parameter.cc @@ -197,6 +197,10 @@ std::optional template_parameter::name() const if (!name_) return {}; + if (kind_ == template_parameter_kind_t::template_type && + name_.has_value() && name_.value().empty()) + return "typename"; + if (is_variadic_ && (kind_ != template_parameter_kind_t::non_type_template)) return name_.value() + "..."; diff --git a/tests/t00016/test_case.h b/tests/t00016/test_case.h index f4b4d806..3ad8ec11 100644 --- a/tests/t00016/test_case.h +++ b/tests/t00016/test_case.h @@ -35,20 +35,23 @@ TEST_CASE("t00016", "[test-case][class]") REQUIRE_THAT(puml, StartsWith("@startuml")); REQUIRE_THAT(puml, EndsWith("@enduml\n")); - REQUIRE_THAT(puml, IsClassTemplate("is_numeric", "")); + REQUIRE_THAT(puml, IsClassTemplate("is_numeric", "typename")); REQUIRE_THAT(puml, IsClassTemplate("is_numeric", "int")); REQUIRE_THAT(puml, IsClassTemplate("is_numeric", "bool")); REQUIRE_THAT(puml, IsClassTemplate("is_numeric", "char")); REQUIRE_THAT(puml, IsClassTemplate("is_numeric", "float")); - REQUIRE_THAT( - puml, IsInstantiation(_A("is_numeric<>"), _A("is_numeric"))); - REQUIRE_THAT( - puml, IsInstantiation(_A("is_numeric<>"), _A("is_numeric"))); - REQUIRE_THAT( - puml, IsInstantiation(_A("is_numeric<>"), _A("is_numeric"))); - REQUIRE_THAT( - puml, IsInstantiation(_A("is_numeric<>"), _A("is_numeric"))); + REQUIRE_THAT(puml, + IsInstantiation(_A("is_numeric"), _A("is_numeric"))); + REQUIRE_THAT(puml, + IsInstantiation( + _A("is_numeric"), _A("is_numeric"))); + REQUIRE_THAT(puml, + IsInstantiation( + _A("is_numeric"), _A("is_numeric"))); + REQUIRE_THAT(puml, + IsInstantiation( + _A("is_numeric"), _A("is_numeric"))); save_puml( config.output_directory() + "/" + diagram->name + ".puml", puml); @@ -58,7 +61,7 @@ TEST_CASE("t00016", "[test-case][class]") using namespace json; - REQUIRE(IsClassTemplate(j, "is_numeric<>")); + REQUIRE(IsClassTemplate(j, "is_numeric")); REQUIRE(IsClass(j, "is_numeric")); REQUIRE(IsClass(j, "is_numeric")); REQUIRE(IsClass(j, "is_numeric")); diff --git a/tests/test_cases.cc b/tests/test_cases.cc index 68ec4684..6313f195 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -300,6 +300,7 @@ using namespace clanguml::test::matchers; #include "t00061/test_case.h" #include "t00062/test_case.h" #include "t00063/test_case.h" +#include "t00064/test_case.h" /// /// Sequence diagram tests diff --git a/tests/test_cases.yaml b/tests/test_cases.yaml index 1835d750..58189119 100644 --- a/tests/test_cases.yaml +++ b/tests/test_cases.yaml @@ -186,6 +186,9 @@ test_cases: - name: t00063 title: Element types diagram filter test case description: + - name: t00064 + title: Template type list test case + description: Sequence diagrams: - name: t20001 title: Basic sequence diagram test case