diff --git a/.clang-uml b/.clang-uml index 8ac1a229..ff87813c 100644 --- a/.clang-uml +++ b/.clang-uml @@ -2,7 +2,7 @@ compilation_database_dir: debug output_directory: docs/diagrams generate_links: link: 'https://github.com/bkryza/clang-uml/blob/{{ git.commit }}/{{ element.source.path }}#L{{ element.source.line }}' - tooltip: '{% if "comment" in element %}{{ abbrv(trim(replace(element.comment, "\n+", " ")), 256) }}{% else %}{{ element.name }}{% endif %}' + tooltip: '{% if existsIn(element, "comment") and existsIn(element.comment, "brief") %}{{ abbrv(trim(replace(element.comment.brief.0, "\n+", " ")), 256) }}{% else %}{{ element.name }}{% endif %}' diagrams: main_package: include!: uml/main_package_diagram.yml diff --git a/src/common/generators/plantuml/generator.h b/src/common/generators/plantuml/generator.h index 8b8caabc..7abe0ee4 100644 --- a/src/common/generators/plantuml/generator.h +++ b/src/common/generators/plantuml/generator.h @@ -208,6 +208,9 @@ void generator::generate_plantuml_directives( ostr << directive << '\n'; } + catch (const inja::json::parse_error &e) { + LOG_ERROR("Failed to parse Jinja template: {}", d); + } catch (const inja::json::exception &e) { LOG_ERROR("Failed to render PlantUML directive: \n{}\n due to: {}", d, e.what()); @@ -236,20 +239,42 @@ void generator::generate_link(std::ostream &ostr, const E &e) const if (e.file().empty()) return; - if (!m_config.generate_links().link.empty()) { - ostr << " [["; - ostr << env().render(std::string_view{m_config.generate_links().link}, - element_context(e)); + ostr << " [["; + try { + if (!m_config.generate_links().link.empty()) { + + ostr << env().render( + std::string_view{m_config.generate_links().link}, + element_context(e)); + } + } + catch (const inja::json::parse_error &e) { + LOG_ERROR("Failed to parse Jinja template: {}", + m_config.generate_links().link); + } + catch (const inja::json::exception &e) { + LOG_ERROR("Failed to render PlantUML directive: \n{}\n due to: {}", + m_config.generate_links().link, e.what()); } - if (!m_config.generate_links().tooltip.empty()) { - ostr << "{"; - ostr << env().render( - std::string_view{m_config.generate_links().tooltip}, - element_context(e)); - ostr << "}"; + ostr << "{"; + try { + if (!m_config.generate_links().tooltip.empty()) { + ostr << env().render( + std::string_view{m_config.generate_links().tooltip}, + element_context(e)); + } + } + catch (const inja::json::parse_error &e) { + LOG_ERROR("Failed to parse Jinja template: {}", + m_config.generate_links().link); + } + catch (const inja::json::exception &e) { + LOG_ERROR("Failed to render PlantUML directive: \n{}\n due to: {}", + m_config.generate_links().link, e.what()); } + ostr << "}"; ostr << "]]"; } diff --git a/src/common/model/diagram_element.cc b/src/common/model/diagram_element.cc index 5199c01b..2f160517 100644 --- a/src/common/model/diagram_element.cc +++ b/src/common/model/diagram_element.cc @@ -96,7 +96,6 @@ void diagram_element::complete(bool completed) { complete_ = completed; } bool operator==(const diagram_element &l, const diagram_element &r) { return l.id() == r.id(); - // return l.full_name(false) == r.full_name(false); } std::ostream &operator<<(std::ostream &out, const diagram_element &rhs) diff --git a/src/common/model/diagram_filter.cc b/src/common/model/diagram_filter.cc index 3afe0534..592dd173 100644 --- a/src/common/model/diagram_filter.cc +++ b/src/common/model/diagram_filter.cc @@ -173,11 +173,23 @@ tvl::value_t namespace_filter::match( const diagram & /*d*/, const element &e) const { if (dynamic_cast(&e) != nullptr) { - return tvl::any_of( - namespaces_.begin(), namespaces_.end(), [&e](const auto &nsit) { - return (e.get_namespace() | e.name()).starts_with(nsit) || - nsit.starts_with(e.get_namespace() | e.name()) || + return tvl::any_of(namespaces_.begin(), namespaces_.end(), + [&e, is_inclusive = is_inclusive()](const auto &nsit) { + auto element_full_name_starts_with_namespace = + (e.get_namespace() | e.name()).starts_with(nsit); + auto element_full_name_equals_pattern = (e.get_namespace() | e.name()) == nsit; + auto namespace_starts_with_element_qualified_name = + nsit.starts_with(e.get_namespace()); + + auto result = element_full_name_starts_with_namespace | + element_full_name_equals_pattern; + + if (is_inclusive) + result = + result | namespace_starts_with_element_qualified_name; + + return result; }); } else { diff --git a/tests/t00014/.clang-uml b/tests/t00014/.clang-uml index f3b650b5..9c3c64e6 100644 --- a/tests/t00014/.clang-uml +++ b/tests/t00014/.clang-uml @@ -10,10 +10,6 @@ diagrams: include: namespaces: - clanguml::t00014 - exclude: - namespaces: - - std - - clanguml::t00014::std plantuml: before: - left to right direction \ No newline at end of file diff --git a/tests/t00039/.clang-uml b/tests/t00039/.clang-uml index c949af75..e16ac2f2 100644 --- a/tests/t00039/.clang-uml +++ b/tests/t00039/.clang-uml @@ -19,4 +19,5 @@ diagrams: - inheritance exclude: namespaces: - - std \ No newline at end of file + - clanguml::t00039::detail + - clanguml::t00039::ns3::detail \ No newline at end of file diff --git a/tests/t00039/t00039.cc b/tests/t00039/t00039.cc index 7b9e02d0..d6f2c11f 100644 --- a/tests/t00039/t00039.cc +++ b/tests/t00039/t00039.cc @@ -42,6 +42,11 @@ struct AAAA : public virtual AAA { }; } // namespace ns2 +namespace detail { +struct AA : public A { +}; +} // namespace detail + namespace ns3 { template struct F { T *t; diff --git a/tests/t00039/test_case.h b/tests/t00039/test_case.h index 7d7e8cbf..4aff1a61 100644 --- a/tests/t00039/test_case.h +++ b/tests/t00039/test_case.h @@ -42,6 +42,7 @@ TEST_CASE("t00039", "[test-case][class]") REQUIRE_THAT(puml, IsBaseClass(_A("A"), _A("AA"))); REQUIRE_THAT(puml, IsBaseClass(_A("AA"), _A("AAA"))); REQUIRE_THAT(puml, IsBaseClass(_A("AAA"), _A("ns2::AAAA"))); + REQUIRE_THAT(puml, !IsClass(_A("detail::AA"))); REQUIRE_THAT(puml, !IsClass(_A("B"))); REQUIRE_THAT(puml, !IsClass(_A("ns1::BB"))); diff --git a/tests/t00041/.clang-uml b/tests/t00041/.clang-uml index 2ec91634..e40ae69b 100644 --- a/tests/t00041/.clang-uml +++ b/tests/t00041/.clang-uml @@ -14,4 +14,7 @@ diagrams: context: - clanguml::t00041::RR subclasses: - - clanguml::t00041::ns1::N \ No newline at end of file + - clanguml::t00041::ns1::N + exclude: + namespaces: + - clanguml::t00041::detail \ No newline at end of file diff --git a/tests/t00041/t00041.cc b/tests/t00041/t00041.cc index c6099308..a65f5474 100644 --- a/tests/t00041/t00041.cc +++ b/tests/t00041/t00041.cc @@ -24,9 +24,15 @@ struct E { struct F { }; +namespace detail { +struct G { +}; +} // namespace detail + struct RR : public R { E *e; F *f; + detail::G *g; }; struct RRR : public RR { diff --git a/tests/t00041/test_case.h b/tests/t00041/test_case.h index 04e77038..6174ff58 100644 --- a/tests/t00041/test_case.h +++ b/tests/t00041/test_case.h @@ -47,6 +47,7 @@ TEST_CASE("t00041", "[test-case][class]") REQUIRE_THAT(puml, IsClass(_A("R"))); REQUIRE_THAT(puml, IsClass(_A("RR"))); REQUIRE_THAT(puml, IsClass(_A("RRR"))); + REQUIRE_THAT(puml, !IsClass(_A("detail::G"))); REQUIRE_THAT(puml, IsBaseClass(_A("R"), _A("RR"))); REQUIRE_THAT(puml, IsBaseClass(_A("RR"), _A("RRR")));