diff --git a/src/uml/class_diagram_visitor.h b/src/uml/class_diagram_visitor.h index 9ce91646..e1468767 100644 --- a/src/uml/class_diagram_visitor.h +++ b/src/uml/class_diagram_visitor.h @@ -305,11 +305,18 @@ static enum CXChildVisitResult class_visitor( ret = CXChildVisit_Continue; } break; - case CXCursor_TemplateTemplateParameter: - spdlog::info( - "Found template template parameter: {}", cursor.spelling()); + case CXCursor_TemplateTemplateParameter: { + spdlog::info("Found template template parameter: {}: {}", + cursor.spelling(), cursor.type()); + + class_template ct; + ct.type = ""; + ct.name = cursor.spelling() + "<>"; + ct.default_value = ""; + ctx->element.templates.emplace_back(std::move(ct)); + ret = CXChildVisit_Continue; - break; + } break; case CXCursor_CXXMethod: case CXCursor_Constructor: case CXCursor_Destructor: diff --git a/tests/t00008/t00008.cc b/tests/t00008/t00008.cc index 47ff3aca..a02e51b0 100644 --- a/tests/t00008/t00008.cc +++ b/tests/t00008/t00008.cc @@ -5,6 +5,7 @@ namespace clanguml { namespace t00008 { using CMP = bool (*)(const int, const int); + template class A { public: T value; @@ -15,5 +16,10 @@ public: CMP comparator; }; + +template typename C> class B { +public: + C template_template; +}; } } diff --git a/tests/t00008/test_case.h b/tests/t00008/test_case.h index a2949d4d..eccdab3c 100644 --- a/tests/t00008/test_case.h +++ b/tests/t00008/test_case.h @@ -52,6 +52,10 @@ TEST_CASE("Test t00008", "[unit-test]") REQUIRE_THAT(puml, IsField(Public("std::array ints"))); REQUIRE_THAT(puml, IsField(Public("bool (*)(int, int) comparator"))); + REQUIRE_THAT(puml, IsClassTemplate("B", "T, C<>")); + + REQUIRE_THAT(puml, IsField(Public("C template_template"))); + save_puml( "./" + config.output_directory + "/" + diagram->name + ".puml", puml); }