Fixed handling of anonymous template parameters

This commit is contained in:
Bartek Kryza
2023-05-13 14:57:41 +02:00
parent 2223f595cd
commit 3b573ff034
6 changed files with 34 additions and 17 deletions

View File

@@ -1069,15 +1069,17 @@ std::optional<template_parameter> 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;
}

View File

@@ -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(

View File

@@ -197,6 +197,10 @@ std::optional<std::string> 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() + "...";

View File

@@ -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<int>")));
REQUIRE_THAT(
puml, IsInstantiation(_A("is_numeric<>"), _A("is_numeric<bool>")));
REQUIRE_THAT(
puml, IsInstantiation(_A("is_numeric<>"), _A("is_numeric<char>")));
REQUIRE_THAT(
puml, IsInstantiation(_A("is_numeric<>"), _A("is_numeric<float>")));
REQUIRE_THAT(puml,
IsInstantiation(_A("is_numeric<typename>"), _A("is_numeric<int>")));
REQUIRE_THAT(puml,
IsInstantiation(
_A("is_numeric<typename>"), _A("is_numeric<bool>")));
REQUIRE_THAT(puml,
IsInstantiation(
_A("is_numeric<typename>"), _A("is_numeric<char>")));
REQUIRE_THAT(puml,
IsInstantiation(
_A("is_numeric<typename>"), _A("is_numeric<float>")));
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<typename>"));
REQUIRE(IsClass(j, "is_numeric<int>"));
REQUIRE(IsClass(j, "is_numeric<bool>"));
REQUIRE(IsClass(j, "is_numeric<char>"));

View File

@@ -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

View File

@@ -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