From 524cf36ecdc1b4a55d44f961b20ddb3065f4d79a Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Tue, 20 Jul 2021 19:35:47 +0200 Subject: [PATCH] Fixed template instantiations generation without known primary template --- docs/test_cases/t00014.md | 10 ++++++ docs/test_cases/t00014_class.png | Bin 26200 -> 31863 bytes docs/test_cases/t00015_class.png | Bin 11036 -> 11038 bytes docs/test_cases/t00016_class.png | Bin 13911 -> 13909 bytes src/config/config.h | 4 ++- src/puml/class_diagram_generator.h | 8 +++++ src/uml/class_diagram_visitor.cc | 51 +++++++++++++++++------------ tests/t00014/.clanguml | 4 +++ tests/t00014/t00014.cc | 6 ++++ tests/t00014/test_case.h | 7 ++-- 10 files changed, 63 insertions(+), 27 deletions(-) diff --git a/docs/test_cases/t00014.md b/docs/test_cases/t00014.md index 471189bd..adec4d43 100644 --- a/docs/test_cases/t00014.md +++ b/docs/test_cases/t00014.md @@ -13,11 +13,16 @@ diagrams: include: namespaces: - clanguml::t00014 + exclude: + namespaces: + - std + - clanguml::t00014::std ``` ## Source code ```cpp #include +#include #include #include #include @@ -46,6 +51,9 @@ template struct A { template using AString = A; +template using GeneralCallback = std::function; +using VoidCallback = GeneralCallback<>; + struct B { std::string value; }; @@ -65,6 +73,8 @@ class R { AStringString stringstring; BVector bs; BVector2 bs2; + GeneralCallback cb; + VoidCallback vcb; }; } } diff --git a/docs/test_cases/t00014_class.png b/docs/test_cases/t00014_class.png index 12ffc9e8be20210005192977836ff25ce118f7ae..c0d9b9db093ae9d6ebd44c1e3e7aff18c96bc847 100644 GIT binary patch literal 31863 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 NB?Z;{MR#Ak`Y$>EtXu#9 literal 26200 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 diff --git a/docs/test_cases/t00015_class.png b/docs/test_cases/t00015_class.png index 06c5af8cb69692d92990cc526be17353750dc399..e6f9ed2c18254266994a6cdf5d7896324d4c0970 100644 GIT binary patch delta 395 zcmV;60d)SHR-RUnS$}eAR9JLyY+-J6b!}__0RR91c$|%qTWi8F6vy8Keuslk%4li4 z)rLKI-N4l;^YU6^%_PvKl1tgx_T3kC!`dkW)XUc#YXN43X!2r4r&X0YW-OTIDM3hHP=a|$m;Xr3|x zvpo}&(bMk*jDJPWWhPQ4G@7iZXQ0z^23*5}NgD;$)01a?ibVip*K;wx3!K%)s*K~A z#o5tzTdwE$zO!S3NgksSd!;7PHdLH#Z7+e< p^1cK-N4l;^YSXOW)f&q$)#*;``;JshT2tFUP5wy=j42(r!ucjenOe&rVz^-q7 zE^gGO_Vk=);I{#H3C5&_VK`pGQLm%g<2(eF8W}Ozait~S8f^pWXhJgzFGgsdFaom! z6O+-??*)uS#(!lh5+*d7tfyz7-E;qvbYT&*^lWJrhjw2#we)HLj~seMPj6PSnS8($5|4-$#rk^lfHGPBqLMk!J?zPtbc diff --git a/docs/test_cases/t00016_class.png b/docs/test_cases/t00016_class.png index 2fb91e5e35695fd0abaa2bca745d2e69beb66221..9e82fe136c07d7de2f1f17e8bbe059e1eac6a9e5 100644 GIT binary patch delta 357 zcmV-r0h<2TY}IU#Spk2MS|J4#X=t3Mk$@O~6)T#XkmUKEykAI9X)3izlM;#&suYyD zS_+dg$)m?^8K{E((mf2~HA|?7i$1BmVB5v45sJrxt)ZZ(?vmmnF7yR@CCe(yk_*;5 zvZvj^cL~*UnivK?Fl#8G-$JroOr8-K|8%ds)oFt_OgrK})0OmR#C<03rpYTd^_Wj8Pc@C(-7!6+kH()4oE;Erbq0wj&9)VWFdEy$TOxh^02oIjc zA(jt>U>6fo^PKt0s*K~B{am+svD-jPRwJqAB8KT!X_opBaACgCczSd+aRa+fyY0kG z?EV}Yun%eyZ9_%b+Sd9opFKMr6i^Wx8r%4r1obm}kKFn&3D6%ELG|;ce!F6`;{kLu D{${A; delta 359 zcmV-t0hs>PY}ag%Spk8OS|J6L(a?CRk$@O~-K=PCLXziu@_r#brK!{=O-d+As8Ueo zYAH<0B#-X9WuOZBOZPBHr(QxuT=Y)m8QUyojZi!mYz>7)o#G-c^gp!bUdXb_vgC~Q zj_heS@L584IZX@$ADA_i(03u(EGGXD7=Lvyywz!gS52LpOt$|krX6vc$-8RuicLL# zCf56}gC+?TdL9OlGpTqcfZ&=-+L+WUpA`O0W3sGOJV8m3IzD6j|* zp2Z=S4}@SB6LQya<}0f*j%)UF&E~~TZUb43q?(Hurdy?1>O;VV`9S08(b2>W>^h$3 z#7yk|92&4UY7%WjMcLZc`Y@k8I&BnC5gQuY_?ravGkcHR`Y;L54?}+T1y_RS53}I` FbTrQ5swMyc diff --git a/src/config/config.h b/src/config/config.h index 978e2f6c..06866cf6 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -111,8 +111,10 @@ struct diagram { auto name = clanguml::util::unqualify(name_); for (const auto &ex : exclude.namespaces) { - if (name.find(ex) == 0) + if (name.find(ex) == 0) { + spdlog::debug("Skipping from diagram: {}", name); return false; + } } // If no inclusive namespaces are provided, diff --git a/src/puml/class_diagram_generator.h b/src/puml/class_diagram_generator.h index d00a1ea3..1ed6a9e8 100644 --- a/src/puml/class_diagram_generator.h +++ b/src/puml/class_diagram_generator.h @@ -341,16 +341,24 @@ public: if (m_config.should_include_entities("classes")) { for (const auto &c : m_model.classes) { + if (!c.is_template_instantiation && + !m_config.should_include(c.name)) + continue; generate_alias(c, ostr); ostr << std::endl; } for (const auto &e : m_model.enums) { + if (!m_config.should_include(e.name)) + continue; generate_alias(e, ostr); ostr << std::endl; } for (const auto &c : m_model.classes) { + if (!c.is_template_instantiation && + !m_config.should_include(c.name)) + continue; generate(c, ostr); ostr << std::endl; } diff --git a/src/uml/class_diagram_visitor.cc b/src/uml/class_diagram_visitor.cc index 2bade83c..8b26f103 100644 --- a/src/uml/class_diagram_visitor.cc +++ b/src/uml/class_diagram_visitor.cc @@ -1048,31 +1048,40 @@ void tu_visitor::find_relationships(const cppast::cpp_type &t_, class_ tu_visitor::build_template_instantiation( const cppast::cpp_template_instantiation_type &t) { - const auto &primary_template_ref = - static_cast( - t.primary_template().get(ctx.entity_index)[0].get()) - .class_(); - - auto full_template_name = - cx::util::full_name(ctx.namespace_, primary_template_ref); - - LOG_DBG("Found template instantiation: {} ({}) ..|> {}, {}", - cppast::to_string(t), cppast::to_string(t.canonical()), - t.primary_template().name(), full_template_name); - class_ tinst; + std::string full_template_name; - if (full_template_name.back() == ':') - tinst.name = full_template_name + tinst.name; + if (t.primary_template().get(ctx.entity_index).size()) { + const auto &primary_template_ref = + static_cast( + t.primary_template().get(ctx.entity_index)[0].get()) + .class_(); - if (primary_template_ref.user_data()) { - tinst.base_template_usr = - static_cast(primary_template_ref.user_data()); - LOG_DBG("Primary template ref set to: {}", tinst.base_template_usr); + full_template_name = + cx::util::full_name(ctx.namespace_, primary_template_ref); + + LOG_DBG("Found template instantiation: {} ({}) ..|> {}, {}", + cppast::to_string(t), cppast::to_string(t.canonical()), + t.primary_template().name(), full_template_name); + + if (full_template_name.back() == ':') + tinst.name = full_template_name + tinst.name; + + if (primary_template_ref.user_data()) { + tinst.base_template_usr = + static_cast(primary_template_ref.user_data()); + LOG_DBG("Primary template ref set to: {}", tinst.base_template_usr); + } + else + LOG_WARN("No user data for base template {}", + primary_template_ref.name()); + } + else { + LOG_WARN("Template instantiation {} has no primary template", + cppast::to_string(t)); + + full_template_name = cppast::to_string(t); } - else - LOG_WARN( - "No user data for base template {}", primary_template_ref.name()); // Extract namespace from base template name auto ns_toks = clanguml::util::split( diff --git a/tests/t00014/.clanguml b/tests/t00014/.clanguml index b6e5b791..2534f83f 100644 --- a/tests/t00014/.clanguml +++ b/tests/t00014/.clanguml @@ -10,3 +10,7 @@ diagrams: include: namespaces: - clanguml::t00014 + exclude: + namespaces: + - std + - clanguml::t00014::std diff --git a/tests/t00014/t00014.cc b/tests/t00014/t00014.cc index 45460849..1f84ed26 100644 --- a/tests/t00014/t00014.cc +++ b/tests/t00014/t00014.cc @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -27,6 +28,9 @@ template struct A { template using AString = A; +template using GeneralCallback = std::function; +using VoidCallback = GeneralCallback<>; + struct B { std::string value; }; @@ -46,6 +50,8 @@ class R { AStringString stringstring; BVector bs; BVector2 bs2; + GeneralCallback cb; + VoidCallback vcb; }; } } diff --git a/tests/t00014/test_case.h b/tests/t00014/test_case.h index 1f82924e..1bf5ceef 100644 --- a/tests/t00014/test_case.h +++ b/tests/t00014/test_case.h @@ -1,5 +1,5 @@ /** - * tests/t00014/test_case.cc + * tests/t00014/test_case.h * * Copyright (c) 2021 Bartek Kryza * @@ -27,7 +27,7 @@ TEST_CASE("t00014", "[test-case][class]") REQUIRE_THAT(diagram->include.namespaces, VectorContains(std::string{"clanguml::t00014"})); - REQUIRE(diagram->exclude.namespaces.size() == 0); + REQUIRE(diagram->exclude.namespaces.size() == 2); REQUIRE(diagram->should_include("clanguml::t00014::S")); @@ -46,9 +46,6 @@ TEST_CASE("t00014", "[test-case][class]") REQUIRE_THAT(puml, IsClassTemplate("AString", "float")); REQUIRE_THAT(puml, IsInstantiation(_A("A"), _A("A"))); - // TODO - // REQUIRE_THAT(puml, IsInstantiation(_A("A"), - // _A("A"))); REQUIRE_THAT( puml, IsInstantiation(_A("A"), _A("AString"))); REQUIRE_THAT(