From 321fb177a9fa5e0d3efb3bafb1722989377ddf73 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Fri, 23 Jun 2023 19:39:25 +0200 Subject: [PATCH] Updated code for Doxygen documentation --- .../json/class_diagram_generator.cc | 2 +- .../generators/json/class_diagram_generator.h | 2 +- .../plantuml/class_diagram_generator.cc | 5 +- .../plantuml/class_diagram_generator.h | 2 +- src/class_diagram/model/class.cc | 26 ++- src/class_diagram/model/class.h | 181 +++++++++++++++--- src/class_diagram/model/class_element.cc | 2 +- src/class_diagram/model/class_element.h | 2 +- src/class_diagram/model/class_member.cc | 2 +- src/class_diagram/model/class_member.h | 2 +- src/class_diagram/model/class_method.cc | 2 +- src/class_diagram/model/class_method.h | 2 +- src/class_diagram/model/class_parent.cc | 2 +- src/class_diagram/model/class_parent.h | 2 +- src/class_diagram/model/concept.cc | 2 +- src/class_diagram/model/concept.h | 2 +- src/class_diagram/model/diagram.cc | 7 +- src/class_diagram/model/diagram.h | 2 +- src/class_diagram/model/enum.cc | 9 +- src/class_diagram/model/enum.h | 4 +- src/class_diagram/model/method_parameter.cc | 2 +- src/class_diagram/model/method_parameter.h | 4 +- src/class_diagram/visitor/template_builder.cc | 2 +- src/class_diagram/visitor/template_builder.h | 2 +- .../visitor/translation_unit_visitor.cc | 2 +- .../visitor/translation_unit_visitor.h | 2 +- src/cli/cli_handler.cc | 2 +- src/cli/cli_handler.h | 2 +- src/common/model/decorated_element.cc | 6 + src/common/model/decorated_element.h | 9 + src/common/model/diagram.cc | 4 +- src/common/model/diagram.h | 2 +- src/common/model/diagram_element.cc | 4 + src/common/model/diagram_filter.cc | 81 ++++++-- src/common/model/element.cc | 6 +- src/common/model/package.cc | 7 + src/common/model/package.h | 9 +- src/common/model/tvl.h | 2 +- src/common/types.h | 7 +- src/config/config.cc | 2 +- src/config/config.h | 2 +- src/config/diagram_templates.cc | 2 +- src/config/diagram_templates.h | 2 +- src/config/option.h | 2 +- src/config/yaml_decoders.cc | 2 +- src/config/yaml_emitters.cc | 2 +- src/decorators/decorators.cc | 2 +- src/decorators/decorators.h | 2 +- src/docs/architecture.cc | 19 ++ src/docs/architecture.h | 73 +++++++ .../json/include_diagram_generator.cc | 2 +- .../json/include_diagram_generator.h | 2 +- .../plantuml/include_diagram_generator.cc | 2 +- .../plantuml/include_diagram_generator.h | 2 +- src/include_diagram/model/diagram.cc | 2 +- src/include_diagram/model/diagram.h | 2 +- .../visitor/translation_unit_visitor.cc | 2 +- .../visitor/translation_unit_visitor.h | 2 +- src/main.cc | 2 +- .../json/package_diagram_generator.cc | 2 +- .../json/package_diagram_generator.h | 2 +- .../plantuml/package_diagram_generator.cc | 2 +- .../plantuml/package_diagram_generator.h | 2 +- src/package_diagram/model/diagram.cc | 4 +- src/package_diagram/model/diagram.h | 2 +- .../visitor/translation_unit_visitor.cc | 9 +- .../visitor/translation_unit_visitor.h | 2 +- .../json/sequence_diagram_generator.cc | 2 +- .../json/sequence_diagram_generator.h | 2 +- .../plantuml/sequence_diagram_generator.cc | 2 +- .../plantuml/sequence_diagram_generator.h | 2 +- src/sequence_diagram/model/activity.cc | 2 +- src/sequence_diagram/model/activity.h | 2 +- src/sequence_diagram/model/diagram.cc | 2 +- src/sequence_diagram/model/diagram.h | 2 +- src/sequence_diagram/model/message.cc | 2 +- src/sequence_diagram/model/message.h | 2 +- src/sequence_diagram/model/participant.cc | 2 +- src/sequence_diagram/model/participant.h | 2 +- .../visitor/call_expression_context.cc | 2 +- .../visitor/call_expression_context.h | 2 +- .../visitor/translation_unit_visitor.cc | 2 +- .../visitor/translation_unit_visitor.h | 2 +- src/util/error.h | 2 +- src/util/query_driver_output_extractor.cc | 2 +- src/util/query_driver_output_extractor.h | 2 +- src/util/thread_pool_executor.cc | 2 +- src/util/thread_pool_executor.h | 2 +- src/util/util.cc | 2 +- src/util/util.h | 2 +- tests/t00004/test_case.h | 4 - tests/t00005/test_case.h | 4 - tests/t00006/test_case.h | 6 - tests/t00013/test_case.h | 3 - tests/t00014/test_case.h | 1 - tests/t00015/test_case.h | 1 - tests/t00016/test_case.h | 1 - tests/t00018/test_case.h | 2 +- tests/t00020/test_case.h | 1 - tests/t00021/test_case.h | 1 - tests/t00022/test_case.h | 1 - tests/t00023/test_case.h | 1 - tests/t00024/test_case.h | 1 - tests/t00025/test_case.h | 1 - tests/t00026/test_case.h | 1 - tests/t00027/test_case.h | 1 - tests/t00028/test_case.h | 1 - tests/t00029/test_case.h | 1 - tests/t00030/test_case.h | 1 - tests/t00031/test_case.h | 1 - tests/t00032/test_case.h | 2 +- tests/t00033/test_case.h | 1 - tests/t00034/test_case.h | 1 - tests/t00035/test_case.h | 1 - tests/t00036/test_case.h | 1 + tests/t00041/test_case.h | 1 + tests/t00044/test_case.h | 1 + tests/t00045/test_case.h | 1 - tests/t00046/test_case.h | 2 +- tests/t00047/test_case.h | 1 + tests/t00048/test_case.h | 1 + tests/t00049/test_case.h | 1 + tests/t00050/test_case.h | 1 + tests/t00056/test_case.h | 1 + tests/t00057/test_case.h | 1 + tests/t00060/test_case.h | 1 + tests/t20001/test_case.h | 3 - tests/t20003/test_case.h | 1 + tests/t20004/test_case.h | 1 + tests/t20006/test_case.h | 1 + tests/t20007/test_case.h | 1 + tests/t20008/test_case.h | 1 + tests/t20009/test_case.h | 1 + tests/t20010/test_case.h | 1 + tests/t30001/test_case.h | 4 - tests/t30010/.clang-uml | 7 +- tests/test_cases.cc | 2 +- tests/test_cases.h | 2 +- tests/test_cli_handler.cc | 2 +- tests/test_compilation_database.cc | 2 +- tests/test_config.cc | 2 +- tests/test_config_data/filters.yml | 8 + tests/test_decorator_parser.cc | 2 +- tests/test_filters.cc | 68 ++++++- tests/test_model.cc | 2 +- tests/test_query_driver_output_extractor.cc | 2 +- tests/test_thread_pool_executor.cc | 2 +- tests/test_util.cc | 2 +- 148 files changed, 579 insertions(+), 204 deletions(-) create mode 100644 src/docs/architecture.cc create mode 100644 src/docs/architecture.h diff --git a/src/class_diagram/generators/json/class_diagram_generator.cc b/src/class_diagram/generators/json/class_diagram_generator.cc index 73c19aa1..6d07a045 100644 --- a/src/class_diagram/generators/json/class_diagram_generator.cc +++ b/src/class_diagram/generators/json/class_diagram_generator.cc @@ -1,5 +1,5 @@ /** - * src/class_diagram/generators/json/class_diagram_generator.cc + * @file rc/class_diagram/generators/json/class_diagram_generator.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/generators/json/class_diagram_generator.h b/src/class_diagram/generators/json/class_diagram_generator.h index f05dd21f..c9ce8b56 100644 --- a/src/class_diagram/generators/json/class_diagram_generator.h +++ b/src/class_diagram/generators/json/class_diagram_generator.h @@ -1,5 +1,5 @@ /** - * src/class_diagram/generators/json/class_diagram_generator.h + * @file src/class_diagram/generators/json/class_diagram_generator.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/generators/plantuml/class_diagram_generator.cc b/src/class_diagram/generators/plantuml/class_diagram_generator.cc index d8db9b7b..4095f937 100644 --- a/src/class_diagram/generators/plantuml/class_diagram_generator.cc +++ b/src/class_diagram/generators/plantuml/class_diagram_generator.cc @@ -1,5 +1,5 @@ /** - * src/class_diagram/generators/plantuml/class_diagram_generator.cc + * @file src/class_diagram/generators/plantuml/class_diagram_generator.cc * * Copyright (c) 2021-2023 Bartek Kryza * @@ -813,10 +813,9 @@ void generator::generate(const package &p, std::ostream &ostr) const // using_namespace if (!uns.starts_with({p.full_name(false)})) { ostr << "}" << '\n'; + generate_notes(ostr, p); } } - - generate_notes(ostr, p); } void generator::generate_relationships( diff --git a/src/class_diagram/generators/plantuml/class_diagram_generator.h b/src/class_diagram/generators/plantuml/class_diagram_generator.h index 424cabb3..1dd0c55c 100644 --- a/src/class_diagram/generators/plantuml/class_diagram_generator.h +++ b/src/class_diagram/generators/plantuml/class_diagram_generator.h @@ -1,5 +1,5 @@ /** - * src/class_diagram/generators/plantuml/class_diagram_generator.h + * @file src/class_diagram/generators/plantuml/class_diagram_generator.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/model/class.cc b/src/class_diagram/model/class.cc index bc516aa6..f97726ce 100644 --- a/src/class_diagram/model/class.cc +++ b/src/class_diagram/model/class.cc @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/class.cc + * @file src/class_diagram/model/class.cc * * Copyright (c) 2021-2023 Bartek Kryza * @@ -37,6 +37,10 @@ bool class_::is_template() const { return is_template_; } void class_::is_template(bool is_template) { is_template_ = is_template; } +bool class_::is_union() const { return is_union_; } + +void class_::is_union(bool is_union) { is_union_ = is_union; } + void class_::add_member(class_member &&member) { members_.emplace_back(std::move(member)); @@ -121,4 +125,24 @@ int class_::calculate_template_specialization_match(const class_ &other) const return template_trait::calculate_template_specialization_match(other); } + +void class_::template_specialization_found(bool found) +{ + template_specialization_found_ = found; +} + +bool class_::template_specialization_found() const +{ + return template_specialization_found_; +} + +std::optional class_::doxygen_link() const +{ + auto type = is_struct() ? "struct" : "class"; + + auto name = name_and_ns(); + util::replace_all(name, "_", "__"); + util::replace_all(name, "::", "_1_1"); + return fmt::format("{}{}.html", type, name); +} } // namespace clanguml::class_diagram::model diff --git a/src/class_diagram/model/class.h b/src/class_diagram/model/class.h index 3e0888fc..dc2aa02e 100644 --- a/src/class_diagram/model/class.h +++ b/src/class_diagram/model/class.h @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/class.h + * @file src/class_diagram/model/class.h * * Copyright (c) 2021-2023 Bartek Kryza * @@ -32,6 +32,9 @@ namespace clanguml::class_diagram::model { +/** + * @brief Diagram element representing a class or class template. + */ class class_ : public common::model::element, public common::model::stylable_element, public template_trait { @@ -43,44 +46,165 @@ public: class_ &operator=(const class_ &) = delete; class_ &operator=(class_ &&) = delete; - std::string type_name() const override { return "class"; } - - bool is_struct() const; - void is_struct(bool is_struct); - - bool is_template() const; - void is_template(bool is_template); - - bool is_union() const { return is_union_; } - void is_union(bool u) { is_union_ = u; } - - void add_member(class_member &&member); - void add_method(class_method &&method); - void add_parent(class_parent &&parent); - - const std::vector &members() const; - const std::vector &methods() const; - const std::vector &parents() const; - friend bool operator==(const class_ &l, const class_ &r); + /** + * Get the type name of the diagram element. + * + * @return Type name of the diagram element. + */ + std::string type_name() const override { return "class"; } + + /** + * Whether or not the class was declared in the code as 'struct'. + * + * @return True, if the class was declared as 'struct' + */ + bool is_struct() const; + + /** + * Set, whether the class was declared as 'struct'. + * + * @param is_struct True, if the class was declared as 'struct' + */ + void is_struct(bool is_struct); + + /** + * Whether or not the class is a template. + * + * @return True, if the class is a template. + */ + bool is_template() const; + + /** + * Set, whether the class is a template. + * + * @param is_struct True, if the class is a template. + */ + void is_template(bool is_template); + + /** + * Whether or not the class is a union. + * + * @return True, if the class is a union. + */ + bool is_union() const; + + /** + * Set, whether the class is a union. + * + * @param u True, if the class is a union. + */ + void is_union(bool is_union); + + /** + * Add a data member to the class. + * + * @param member Class data member. + */ + void add_member(class_member &&member); + + /** + * Add a method to the class. + * + * @param method Class method. + */ + void add_method(class_method &&method); + + /** + * Add class parent (inheritance relationship). + * + * @todo Maybe it would be good to refactor this into a regular + * relationship. We could drop the 'class_parent' class completely... + * + * @param parent Class parent. + */ + void add_parent(class_parent &&parent); + + /** + * Get reference to class member list. + * + * @return Reference to class members. + */ + const std::vector &members() const; + + /** + * Get reference to class method list. + * + * @return Reference to class methods. + */ + const std::vector &methods() const; + + /** + * Get reference to class parent list. + * + * @return Reference to class parents. + */ + const std::vector &parents() const; + + /** + * @brief Get class full name. + * + * This method renders the entire class name including all template + * parameters and/or arguments. + * + * @param relative Whether the class name should be relative to + * using_namespace + * @return Full class name. + */ std::string full_name(bool relative = true) const override; + /** + * @brief Get unqualified class ful name. + * + * This method returns the class full name but without any namespace + * qualifier. + * + * @return Full class name without namespace. + */ std::string full_name_no_ns() const override; + /** + * Whether the class is abstract. + * + * @return True, if at least one method is abstract (=0). + */ bool is_abstract() const; + /** + * @brief Calculate template specialization match with other class. + * + * This method is a wrapper over + * @ref template_trait::calculate_template_specialization_match() + * + * @param other + * @return + */ int calculate_template_specialization_match(const class_ &other) const; - void template_specialization_found(bool found) - { - template_specialization_found_ = found; - } + /** + * Whether, a template specialization has already been found for this class. + * @return True, if a template specialization has already been found. + */ + bool template_specialization_found() const; - bool template_specialization_found() const - { - return template_specialization_found_; - } + /** + * Set, whether a template specialization has already been found for this + * class. + * + * @param found True, if a template specialization has already been found. + */ + void template_specialization_found(bool found); + + /** + * @brief Generate Doxygen style HTML link for the class. + * + * This method generates a link, which can be used in SVG diagrams to + * create links from classes to Doxygen documentation pages. + * + * @return Doxygen-style HTML link for the class. + */ + std::optional doxygen_link() const override; private: bool is_struct_{false}; @@ -90,7 +214,6 @@ private: std::vector methods_; std::vector bases_; std::string base_template_full_name_; - std::string full_name_; bool template_specialization_found_{false}; diff --git a/src/class_diagram/model/class_element.cc b/src/class_diagram/model/class_element.cc index 0d1ab1a3..3bdd1527 100644 --- a/src/class_diagram/model/class_element.cc +++ b/src/class_diagram/model/class_element.cc @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/class_element.cc + * @file src/class_diagram/model/class_element.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/model/class_element.h b/src/class_diagram/model/class_element.h index 897158e8..b64b9068 100644 --- a/src/class_diagram/model/class_element.h +++ b/src/class_diagram/model/class_element.h @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/class_element.h + * @file src/class_diagram/model/class_element.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/model/class_member.cc b/src/class_diagram/model/class_member.cc index 10b384c8..e857e527 100644 --- a/src/class_diagram/model/class_member.cc +++ b/src/class_diagram/model/class_member.cc @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/class_member.cc + * @file src/class_diagram/model/class_member.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/model/class_member.h b/src/class_diagram/model/class_member.h index 74cf1227..982ac445 100644 --- a/src/class_diagram/model/class_member.h +++ b/src/class_diagram/model/class_member.h @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/class_member.h + * @file src/class_diagram/model/class_member.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/model/class_method.cc b/src/class_diagram/model/class_method.cc index 9a2a5097..d44ab43e 100644 --- a/src/class_diagram/model/class_method.cc +++ b/src/class_diagram/model/class_method.cc @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/class_method.cc + * @file src/class_diagram/model/class_method.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/model/class_method.h b/src/class_diagram/model/class_method.h index 7e07d9f8..439e72bd 100644 --- a/src/class_diagram/model/class_method.h +++ b/src/class_diagram/model/class_method.h @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/class_method.h + * @file src/class_diagram/model/class_method.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/model/class_parent.cc b/src/class_diagram/model/class_parent.cc index 7461ab2e..89d0cc31 100644 --- a/src/class_diagram/model/class_parent.cc +++ b/src/class_diagram/model/class_parent.cc @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/class_parent.cc + * @file src/class_diagram/model/class_parent.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/model/class_parent.h b/src/class_diagram/model/class_parent.h index 35af3dec..19245750 100644 --- a/src/class_diagram/model/class_parent.h +++ b/src/class_diagram/model/class_parent.h @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/class_parent.h + * @file src/class_diagram/model/class_parent.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/model/concept.cc b/src/class_diagram/model/concept.cc index f090f9aa..73a69bf0 100644 --- a/src/class_diagram/model/concept.cc +++ b/src/class_diagram/model/concept.cc @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/concept.cc + * @file src/class_diagram/model/concept.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/model/concept.h b/src/class_diagram/model/concept.h index 36e23675..06188279 100644 --- a/src/class_diagram/model/concept.h +++ b/src/class_diagram/model/concept.h @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/concept.h + * @file src/class_diagram/model/concept.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/model/diagram.cc b/src/class_diagram/model/diagram.cc index 8f533d5a..9de710ba 100644 --- a/src/class_diagram/model/diagram.cc +++ b/src/class_diagram/model/diagram.cc @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/diagram.cc + * @file src/class_diagram/model/diagram.cc * * Copyright (c) 2021-2023 Bartek Kryza * @@ -198,6 +198,11 @@ inja::json diagram::context() const elements.emplace_back(e.get().context()); } + // Add enums + for (const auto &c : concepts()) { + elements.emplace_back(c.get().context()); + } + ctx["elements"] = elements; return ctx; diff --git a/src/class_diagram/model/diagram.h b/src/class_diagram/model/diagram.h index 8efd5969..bda182e3 100644 --- a/src/class_diagram/model/diagram.h +++ b/src/class_diagram/model/diagram.h @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/diagram.h + * @file src/class_diagram/model/diagram.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/model/enum.cc b/src/class_diagram/model/enum.cc index 57af53db..878719b6 100644 --- a/src/class_diagram/model/enum.cc +++ b/src/class_diagram/model/enum.cc @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/enum.cc + * @file src/class_diagram/model/enum.cc * * Copyright (c) 2021-2023 Bartek Kryza * @@ -54,4 +54,11 @@ std::vector &enum_::constants() { return constants_; } const std::vector &enum_::constants() const { return constants_; } +std::optional enum_::doxygen_link() const +{ + auto name = name_and_ns(); + util::replace_all(name, "_", "__"); + util::replace_all(name, "::", "_1_1"); + return fmt::format("enum{}.html", name); +} } // namespace clanguml::class_diagram::model diff --git a/src/class_diagram/model/enum.h b/src/class_diagram/model/enum.h index e8285352..7916f082 100644 --- a/src/class_diagram/model/enum.h +++ b/src/class_diagram/model/enum.h @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/enum.h + * @file src/class_diagram/model/enum.h * * Copyright (c) 2021-2023 Bartek Kryza * @@ -45,6 +45,8 @@ public: const std::vector &constants() const; + std::optional doxygen_link() const override; + private: std::vector constants_; }; diff --git a/src/class_diagram/model/method_parameter.cc b/src/class_diagram/model/method_parameter.cc index 95773cfc..13451a5c 100644 --- a/src/class_diagram/model/method_parameter.cc +++ b/src/class_diagram/model/method_parameter.cc @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/method_parameter.cc + * @file src/class_diagram/model/method_parameter.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/model/method_parameter.h b/src/class_diagram/model/method_parameter.h index 2709dcc6..a47ef5f8 100644 --- a/src/class_diagram/model/method_parameter.h +++ b/src/class_diagram/model/method_parameter.h @@ -1,5 +1,5 @@ /** - * src/class_diagram/model/method_parameter.h + * @file src/class_diagram/model/method_parameter.h * * Copyright (c) 2021-2023 Bartek Kryza * @@ -31,6 +31,8 @@ public: method_parameter( std::string type, std::string name, std::string default_value = {}); + virtual ~method_parameter() = default; + void set_type(const std::string &type); std::string type() const; diff --git a/src/class_diagram/visitor/template_builder.cc b/src/class_diagram/visitor/template_builder.cc index 24d9ebcb..d3ff69f7 100644 --- a/src/class_diagram/visitor/template_builder.cc +++ b/src/class_diagram/visitor/template_builder.cc @@ -1,5 +1,5 @@ /** - * src/class_diagram/visitor/template_builder.cc + * @file src/class_diagram/visitor/template_builder.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/visitor/template_builder.h b/src/class_diagram/visitor/template_builder.h index a214122a..4f2103ef 100644 --- a/src/class_diagram/visitor/template_builder.h +++ b/src/class_diagram/visitor/template_builder.h @@ -1,5 +1,5 @@ /** - * src/class_diagram/visitor/template_builder.h + * @file src/class_diagram/visitor/template_builder.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/visitor/translation_unit_visitor.cc b/src/class_diagram/visitor/translation_unit_visitor.cc index cf41b4d4..0ae4d4a5 100644 --- a/src/class_diagram/visitor/translation_unit_visitor.cc +++ b/src/class_diagram/visitor/translation_unit_visitor.cc @@ -1,5 +1,5 @@ /** - * src/class_diagram/visitor/translation_unit_visitor.cc + * @file src/class_diagram/visitor/translation_unit_visitor.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/class_diagram/visitor/translation_unit_visitor.h b/src/class_diagram/visitor/translation_unit_visitor.h index 449fc8c4..8dc22d07 100644 --- a/src/class_diagram/visitor/translation_unit_visitor.h +++ b/src/class_diagram/visitor/translation_unit_visitor.h @@ -1,5 +1,5 @@ /** - * src/class_diagram/visitor/translation_unit_visitor.h + * @file src/class_diagram/visitor/translation_unit_visitor.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/cli/cli_handler.cc b/src/cli/cli_handler.cc index aa72e612..e08d1d58 100644 --- a/src/cli/cli_handler.cc +++ b/src/cli/cli_handler.cc @@ -1,5 +1,5 @@ /** - * src/options/cli_handler.cc + * @file src/options/cli_handler.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/cli/cli_handler.h b/src/cli/cli_handler.h index e45639e7..6b0a4b5f 100644 --- a/src/cli/cli_handler.h +++ b/src/cli/cli_handler.h @@ -1,5 +1,5 @@ /* - * src/options/cli_handler.h + * @file src/options/cli_handler.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/common/model/decorated_element.cc b/src/common/model/decorated_element.cc index f9f9dbde..39951b90 100644 --- a/src/common/model/decorated_element.cc +++ b/src/common/model/decorated_element.cc @@ -90,4 +90,10 @@ void decorated_element::append(const decorated_element &de) std::optional decorated_element::comment() const { return comment_; } void decorated_element::set_comment(const comment_t &c) { comment_ = c; } + +std::optional decorated_element::doxygen_link() const +{ + return std::nullopt; +} + } // namespace clanguml::common::model diff --git a/src/common/model/decorated_element.h b/src/common/model/decorated_element.h index 90f66462..57409872 100644 --- a/src/common/model/decorated_element.h +++ b/src/common/model/decorated_element.h @@ -47,6 +47,8 @@ using comment_t = inja::json; */ class decorated_element { public: + virtual ~decorated_element() = default; + /** * Whether this element should be skipped from the diagram. * @@ -125,6 +127,13 @@ public: */ void set_comment(const comment_t &c); + /** + * Return Doxygen HTML documentation link for the element. + * + * @return Element context. + */ + virtual std::optional doxygen_link() const; + private: std::vector> decorators_; std::optional comment_; diff --git a/src/common/model/diagram.cc b/src/common/model/diagram.cc index 4601b644..907a3902 100644 --- a/src/common/model/diagram.cc +++ b/src/common/model/diagram.cc @@ -68,12 +68,12 @@ bool diagram::should_include(const element &e) const filter_->should_include(dynamic_cast(e)); } -bool diagram::should_include(const std::string &name) const +bool diagram::should_include(const namespace_ &ns) const { if (filter_.get() == nullptr) return true; - return filter_->should_include(name); + return filter_->should_include(ns); } bool diagram::should_include(const relationship_t r) const diff --git a/src/common/model/diagram.h b/src/common/model/diagram.h index f001b023..52f35deb 100644 --- a/src/common/model/diagram.h +++ b/src/common/model/diagram.h @@ -132,7 +132,7 @@ public: // TODO: refactor to a template method bool should_include(const element &e) const; - bool should_include(const std::string &e) const; + bool should_include(const namespace_ &ns) const; bool should_include(const source_file &path) const; bool should_include(relationship r) const; bool should_include(relationship_t r) const; diff --git a/src/common/model/diagram_element.cc b/src/common/model/diagram_element.cc index 67e434ae..e810c37d 100644 --- a/src/common/model/diagram_element.cc +++ b/src/common/model/diagram_element.cc @@ -73,8 +73,12 @@ inja::json diagram_element::context() const { inja::json ctx; ctx["name"] = name(); + ctx["type"] = type_name(); ctx["alias"] = alias(); ctx["full_name"] = full_name(false); + auto maybe_doxygen_link = doxygen_link(); + if (maybe_doxygen_link) + ctx["doxygen_link"] = maybe_doxygen_link.value(); return ctx; } diff --git a/src/common/model/diagram_filter.cc b/src/common/model/diagram_filter.cc index 029d10fa..2dd4beb4 100644 --- a/src/common/model/diagram_filter.cc +++ b/src/common/model/diagram_filter.cc @@ -186,60 +186,100 @@ tvl::value_t namespace_filter::match( if (ns.is_empty()) return {}; - return tvl::any_of( - namespaces_.begin(), namespaces_.end(), [&ns](const auto &nsit) { + return tvl::any_of(namespaces_.begin(), namespaces_.end(), + [&ns, is_inclusive = is_inclusive()](const auto &nsit) { if (std::holds_alternative(nsit.value())) { const auto &ns_pattern = std::get(nsit.value()); - return ns.starts_with(ns_pattern) || ns == ns_pattern; + if (is_inclusive) + return ns.starts_with(ns_pattern) || + ns_pattern.starts_with(ns); + + return ns.starts_with(ns_pattern); } const auto ®ex = std::get(nsit.value()); - return regex == ns.to_string(); + return regex %= ns.to_string(); }); } -tvl::value_t namespace_filter::match( - const diagram & /*d*/, const element &e) const +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(), + if (d.type() != diagram_t::kPackage && + dynamic_cast(&e) != nullptr) { + auto result = tvl::any_of(namespaces_.begin(), namespaces_.end(), [&e, is_inclusive = is_inclusive()](const auto &nsit) { if (std::holds_alternative(nsit.value())) { const auto &ns_pattern = std::get(nsit.value()); auto element_full_name_starts_with_namespace = - (e.get_namespace() | e.name()).starts_with(ns_pattern); + namespace_{e.name_and_ns()}.starts_with(ns_pattern); auto element_full_name_equals_pattern = - (e.get_namespace() | e.name()) == ns_pattern; + namespace_{e.name_and_ns()} == ns_pattern; - auto namespace_starts_with_element_qualified_name = - ns_pattern.starts_with(e.get_namespace()); + auto pattern_starts_with_element_full_name = + ns_pattern.starts_with(namespace_{e.name_and_ns()}); auto result = element_full_name_starts_with_namespace || element_full_name_equals_pattern; if (is_inclusive) - result = result || - namespace_starts_with_element_qualified_name; + result = + result || pattern_starts_with_element_full_name; return result; } - return std::get(nsit.value()) == + return std::get(nsit.value()) %= e.full_name(false); }); + + if (tvl::is_false(result)) + LOG_DBG("Element {} rejected by namespace_filter 1", + e.full_name(false)); + + return result; } - return tvl::any_of( + if (d.type() == diagram_t::kPackage) { + auto result = tvl::any_of(namespaces_.begin(), namespaces_.end(), + [&e, is_inclusive = is_inclusive()](const auto &nsit) { + if (std::holds_alternative(nsit.value())) { + auto e_ns = namespace_{e.full_name(false)}; + auto nsit_ns = std::get(nsit.value()); + + if (is_inclusive) + return e_ns.starts_with(nsit_ns) || + nsit_ns.starts_with(e_ns) || e_ns == nsit_ns; + else + return e_ns.starts_with(nsit_ns) || e_ns == nsit_ns; + } + + return std::get(nsit.value()) %= + e.full_name(false); + }); + + if (tvl::is_false(result)) + LOG_DBG("Element {} rejected by namespace_filter (package diagram)", + e.full_name(false)); + + return result; + } + + auto result = tvl::any_of( namespaces_.begin(), namespaces_.end(), [&e](const auto &nsit) { if (std::holds_alternative(nsit.value())) { return e.get_namespace().starts_with( std::get(nsit.value())); } - return std::get(nsit.value()) == e.full_name(false); + return std::get(nsit.value()) %= e.full_name(false); }); + + if (tvl::is_false(result)) + LOG_DBG("Element {} rejected by namespace_filter", e.full_name(false)); + + return result; } element_filter::element_filter( @@ -249,9 +289,12 @@ element_filter::element_filter( { } -tvl::value_t element_filter::match( - const diagram & /*d*/, const element &e) const +tvl::value_t element_filter::match(const diagram &d, const element &e) const { + // Do not apply element filter to packages in class diagrams + if (d.type() == diagram_t::kClass && e.type_name() == "package") + return std::nullopt; + return tvl::any_of( elements_.begin(), elements_.end(), [&e](const auto &el) { return ((el == e.full_name(false)) || diff --git a/src/common/model/element.cc b/src/common/model/element.cc index e7b1b8d9..038e75bb 100644 --- a/src/common/model/element.cc +++ b/src/common/model/element.cc @@ -34,11 +34,7 @@ const namespace_ &element::using_namespace() const { return using_namespace_; } inja::json element::context() const { - inja::json ctx; - ctx["name"] = name(); - ctx["type"] = type_name(); - ctx["alias"] = alias(); - ctx["full_name"] = full_name(false); + inja::json ctx = diagram_element::context(); ctx["namespace"] = get_namespace().to_string(); if (const auto maybe_comment = comment(); maybe_comment.has_value()) { ctx["comment"] = maybe_comment.value(); diff --git a/src/common/model/package.cc b/src/common/model/package.cc index 6b397aad..74035dd7 100644 --- a/src/common/model/package.cc +++ b/src/common/model/package.cc @@ -40,4 +40,11 @@ bool package::is_deprecated() const { return is_deprecated_; } void package::set_deprecated(bool deprecated) { is_deprecated_ = deprecated; } +std::optional package::doxygen_link() const +{ + auto name = full_name(false); + util::replace_all(name, "_", "__"); + util::replace_all(name, "::", "_1_1"); + return fmt::format("namespace{}.html", name); +} } // namespace clanguml::common::model \ No newline at end of file diff --git a/src/common/model/package.h b/src/common/model/package.h index f18c01fc..425d6a87 100644 --- a/src/common/model/package.h +++ b/src/common/model/package.h @@ -67,11 +67,14 @@ public: void set_deprecated(bool deprecated); /** - * Add subpackage. + * @brief Generate Doxygen style HTML link for the class. * - * @param p Package. + * This method generates a link, which can be used in SVG diagrams to + * create links from classes to Doxygen documentation pages. + * + * @return Doxygen-style HTML link for the class. */ - void add_package(std::unique_ptr &&p); + std::optional doxygen_link() const override; private: bool is_deprecated_{false}; diff --git a/src/common/model/tvl.h b/src/common/model/tvl.h index a4d87c2e..9c9bc5e5 100644 --- a/src/common/model/tvl.h +++ b/src/common/model/tvl.h @@ -150,7 +150,7 @@ inline value_t any_of(InputIterator first, InputIterator last, Predicate pred) if (m.has_value()) { if (m.value()) { res = true; - break; + return res; } res = false; } diff --git a/src/common/types.h b/src/common/types.h index bd59b20a..3541d61f 100644 --- a/src/common/types.h +++ b/src/common/types.h @@ -194,7 +194,12 @@ struct regex { { } - [[nodiscard]] bool operator==(const std::string &v) const + /** + * @brief Regular expression match operator + * @param v Value to match against internal std::regex + * @return True, if the argument matches the regular expression + */ + [[nodiscard]] bool operator%=(const std::string &v) const { return std::regex_match(v, regexp); } diff --git a/src/config/config.cc b/src/config/config.cc index 95bd25bd..8481a9e5 100644 --- a/src/config/config.cc +++ b/src/config/config.cc @@ -1,5 +1,5 @@ /** - * src/config/config.cc + * @file src/config/config.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/config/config.h b/src/config/config.h index d883d18d..5c21e2d0 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -1,5 +1,5 @@ /** - * src/config/config.h + * @file src/config/config.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/config/diagram_templates.cc b/src/config/diagram_templates.cc index 3356b3ae..9bde28e9 100644 --- a/src/config/diagram_templates.cc +++ b/src/config/diagram_templates.cc @@ -1,5 +1,5 @@ /** - * src/config/diagram_templates.cc + * @file src/config/diagram_templates.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/config/diagram_templates.h b/src/config/diagram_templates.h index 3c861808..3721337b 100644 --- a/src/config/diagram_templates.h +++ b/src/config/diagram_templates.h @@ -1,5 +1,5 @@ /** - * src/config/diagram_templates.h + * @file src/config/diagram_templates.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/config/option.h b/src/config/option.h index eb7eece5..ab6df843 100644 --- a/src/config/option.h +++ b/src/config/option.h @@ -1,5 +1,5 @@ /** - * src/config/option.h + * @file src/config/option.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/config/yaml_decoders.cc b/src/config/yaml_decoders.cc index 3bb491c1..54b96eb5 100644 --- a/src/config/yaml_decoders.cc +++ b/src/config/yaml_decoders.cc @@ -1,5 +1,5 @@ /** - * src/config/yaml_decoders.cc + * @file src/config/yaml_decoders.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/config/yaml_emitters.cc b/src/config/yaml_emitters.cc index c30bf413..28a870de 100644 --- a/src/config/yaml_emitters.cc +++ b/src/config/yaml_emitters.cc @@ -1,5 +1,5 @@ /** - * src/config/yaml_emitters.cc + * @file src/config/yaml_emitters.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/decorators/decorators.cc b/src/decorators/decorators.cc index 6864d2ed..c8ff0371 100644 --- a/src/decorators/decorators.cc +++ b/src/decorators/decorators.cc @@ -1,5 +1,5 @@ /** - * src/decorators/decorators.cc + * @file src/decorators/decorators.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/decorators/decorators.h b/src/decorators/decorators.h index f8296728..5f9c0edb 100644 --- a/src/decorators/decorators.h +++ b/src/decorators/decorators.h @@ -1,5 +1,5 @@ /** - * src/decorators/decorators.h + * @file src/decorators/decorators.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/docs/architecture.cc b/src/docs/architecture.cc new file mode 100644 index 00000000..f4e1b078 --- /dev/null +++ b/src/docs/architecture.cc @@ -0,0 +1,19 @@ +/** + * @file docs/architecture.cc + * + * Copyright (c) 2021-2023 Bartek Kryza + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "architecture.h" \ No newline at end of file diff --git a/src/docs/architecture.h b/src/docs/architecture.h new file mode 100644 index 00000000..1478477b --- /dev/null +++ b/src/docs/architecture.h @@ -0,0 +1,73 @@ +/** + * @file docs/architecture.h + * + * Copyright (c) 2021-2023 Bartek Kryza + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include "class_diagram/model/diagram.h" +#include "common/model/diagram.h" +#include "include_diagram/model/diagram.h" +#include "package_diagram/model/diagram.h" +#include "sequence_diagram/model/diagram.h" + +#include "class_diagram/visitor/translation_unit_visitor.h" +#include "common/visitor/translation_unit_visitor.h" +#include "include_diagram/visitor/translation_unit_visitor.h" +#include "package_diagram/visitor/translation_unit_visitor.h" +#include "sequence_diagram/visitor/translation_unit_visitor.h" + +#include "class_diagram/generators/json/class_diagram_generator.h" +#include "class_diagram/generators/plantuml/class_diagram_generator.h" +#include "common/generators/generators.h" + +/* + * This file serves as an example how high-level documentation can be stored + * directly in the code. + */ + +namespace clanguml { +/** + * This namespace provides common interfaces for all kinds of diagrams. + * + * The core diagram functionality is divided into 3 groups: visitor, model + * and generators. + */ +namespace common { +/** + * This namespace provides common interfaces for translation unit visitors, + * which are responsible for traversing the Clang's AST of the source code, + * and generating the intermedia diagram model. + * + * Each 'translation_unit_visitor' implements the Clang's + * 'RecursiveASTVisitor' interface. + */ +namespace visitor { +} // namespace visitor +/** + * This namespace provides common interfaces for diagram model, including + * various diagram elements and diagram filters. + */ +namespace model { + +} // namespace model +/** + * + */ +namespace generators { + +} // namespace generators +} // namespace common +} // namespace clanguml \ No newline at end of file diff --git a/src/include_diagram/generators/json/include_diagram_generator.cc b/src/include_diagram/generators/json/include_diagram_generator.cc index 17b901fb..04e6944e 100644 --- a/src/include_diagram/generators/json/include_diagram_generator.cc +++ b/src/include_diagram/generators/json/include_diagram_generator.cc @@ -1,5 +1,5 @@ /** - * src/include_diagram/generators/json/include_diagram_generator.cc + * @file src/include_diagram/generators/json/include_diagram_generator.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/include_diagram/generators/json/include_diagram_generator.h b/src/include_diagram/generators/json/include_diagram_generator.h index b7865e8b..c446ebe5 100644 --- a/src/include_diagram/generators/json/include_diagram_generator.h +++ b/src/include_diagram/generators/json/include_diagram_generator.h @@ -1,5 +1,5 @@ /** - * src/include_diagram/generators/json/include_diagram_generator.h + * @file src/include_diagram/generators/json/include_diagram_generator.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/include_diagram/generators/plantuml/include_diagram_generator.cc b/src/include_diagram/generators/plantuml/include_diagram_generator.cc index d803ca1e..6649d6ee 100644 --- a/src/include_diagram/generators/plantuml/include_diagram_generator.cc +++ b/src/include_diagram/generators/plantuml/include_diagram_generator.cc @@ -1,5 +1,5 @@ /** - * src/include_diagram/generators/plantuml/include_diagram_generator.cc + * @file src/include_diagram/generators/plantuml/include_diagram_generator.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/include_diagram/generators/plantuml/include_diagram_generator.h b/src/include_diagram/generators/plantuml/include_diagram_generator.h index 5e2882b7..cb193cd1 100644 --- a/src/include_diagram/generators/plantuml/include_diagram_generator.h +++ b/src/include_diagram/generators/plantuml/include_diagram_generator.h @@ -1,5 +1,5 @@ /** - * src/include_diagram/generators/plantuml/include_diagram_generator.h + * @file src/include_diagram/generators/plantuml/include_diagram_generator.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/include_diagram/model/diagram.cc b/src/include_diagram/model/diagram.cc index 3a723898..d21a9f56 100644 --- a/src/include_diagram/model/diagram.cc +++ b/src/include_diagram/model/diagram.cc @@ -1,5 +1,5 @@ /** - * src/include_diagram/model/diagram.cc + * @file src/include_diagram/model/diagram.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/include_diagram/model/diagram.h b/src/include_diagram/model/diagram.h index 82d606f4..47870e66 100644 --- a/src/include_diagram/model/diagram.h +++ b/src/include_diagram/model/diagram.h @@ -1,5 +1,5 @@ /** - * src/include_diagram/model/diagram.h + * @file src/include_diagram/model/diagram.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/include_diagram/visitor/translation_unit_visitor.cc b/src/include_diagram/visitor/translation_unit_visitor.cc index 40d411d6..a538acd9 100644 --- a/src/include_diagram/visitor/translation_unit_visitor.cc +++ b/src/include_diagram/visitor/translation_unit_visitor.cc @@ -1,5 +1,5 @@ /** - * src/include_diagram/visitor/translation_unit_visitor.cc + * @file src/include_diagram/visitor/translation_unit_visitor.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/include_diagram/visitor/translation_unit_visitor.h b/src/include_diagram/visitor/translation_unit_visitor.h index acc895af..5c0760cb 100644 --- a/src/include_diagram/visitor/translation_unit_visitor.h +++ b/src/include_diagram/visitor/translation_unit_visitor.h @@ -1,5 +1,5 @@ /** - * src/include_diagram/visitor/translation_unit_visitor.h + * @file src/include_diagram/visitor/translation_unit_visitor.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/main.cc b/src/main.cc index df2f38a0..76095a22 100644 --- a/src/main.cc +++ b/src/main.cc @@ -1,5 +1,5 @@ /** - * src/main.cc + * @file src/main.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/package_diagram/generators/json/package_diagram_generator.cc b/src/package_diagram/generators/json/package_diagram_generator.cc index f6dc23fb..3d50a142 100644 --- a/src/package_diagram/generators/json/package_diagram_generator.cc +++ b/src/package_diagram/generators/json/package_diagram_generator.cc @@ -1,5 +1,5 @@ /** - * src/package_diagram/generators/json/package_diagram_generator.cc + * @file src/package_diagram/generators/json/package_diagram_generator.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/package_diagram/generators/json/package_diagram_generator.h b/src/package_diagram/generators/json/package_diagram_generator.h index 7c084166..0e9990da 100644 --- a/src/package_diagram/generators/json/package_diagram_generator.h +++ b/src/package_diagram/generators/json/package_diagram_generator.h @@ -1,5 +1,5 @@ /** - * src/package_diagram/generators/json/package_diagram_generator.h + * @file src/package_diagram/generators/json/package_diagram_generator.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/package_diagram/generators/plantuml/package_diagram_generator.cc b/src/package_diagram/generators/plantuml/package_diagram_generator.cc index 10be4b5c..4540a43b 100644 --- a/src/package_diagram/generators/plantuml/package_diagram_generator.cc +++ b/src/package_diagram/generators/plantuml/package_diagram_generator.cc @@ -1,5 +1,5 @@ /** - * src/package_diagram/generators/plantuml/package_diagram_generator.cc + * @file src/package_diagram/generators/plantuml/package_diagram_generator.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/package_diagram/generators/plantuml/package_diagram_generator.h b/src/package_diagram/generators/plantuml/package_diagram_generator.h index 9dd35f69..6ebf8b93 100644 --- a/src/package_diagram/generators/plantuml/package_diagram_generator.h +++ b/src/package_diagram/generators/plantuml/package_diagram_generator.h @@ -1,5 +1,5 @@ /** - * src/package_diagram/generators/plantuml/package_diagram_generator.h + * @file src/package_diagram/generators/plantuml/package_diagram_generator.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/package_diagram/model/diagram.cc b/src/package_diagram/model/diagram.cc index b8f25258..f6e2d45c 100644 --- a/src/package_diagram/model/diagram.cc +++ b/src/package_diagram/model/diagram.cc @@ -1,5 +1,5 @@ /** - * src/package_diagram/model/diagram.cc + * @file src/package_diagram/model/diagram.cc * * Copyright (c) 2021-2023 Bartek Kryza * @@ -43,8 +43,6 @@ common::optional_ref diagram::get( common::optional_ref diagram::get( const clanguml::common::model::diagram_element::id_t id) const { - LOG_DBG("Looking for package with id {}", id); - return find(id); } diff --git a/src/package_diagram/model/diagram.h b/src/package_diagram/model/diagram.h index 9f64ddb3..3f7f43c1 100644 --- a/src/package_diagram/model/diagram.h +++ b/src/package_diagram/model/diagram.h @@ -1,5 +1,5 @@ /** - * src/package_diagram/model/diagram.h + * @file src/package_diagram/model/diagram.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/package_diagram/visitor/translation_unit_visitor.cc b/src/package_diagram/visitor/translation_unit_visitor.cc index 2c1ba6ce..f64dc9cc 100644 --- a/src/package_diagram/visitor/translation_unit_visitor.cc +++ b/src/package_diagram/visitor/translation_unit_visitor.cc @@ -1,5 +1,5 @@ /** - * src/package_diagram/visitor/translation_unit_visitor.cc + * @file src/package_diagram/visitor/translation_unit_visitor.cc * * Copyright (c) 2021-2023 Bartek Kryza * @@ -53,7 +53,7 @@ bool translation_unit_visitor::VisitNamespaceDecl(clang::NamespaceDecl *ns) auto qualified_name = common::get_qualified_name(*ns); - if (!diagram().should_include(qualified_name)) + if (!diagram().should_include(namespace_{qualified_name})) return true; LOG_DBG("Visiting namespace declaration: {}", qualified_name); @@ -93,6 +93,8 @@ bool translation_unit_visitor::VisitNamespaceDecl(clang::NamespaceDecl *ns) } if (!p->skip()) { + LOG_DBG("Adding package {}", p->full_name(false)); + diagram().add(p->path(), std::move(p)); } } @@ -213,6 +215,9 @@ void translation_unit_visitor::add_relationships( if (config().package_type() == config::package_type_t::kDirectory) { auto file = source_manager().getFilename(cls->getLocation()).str(); + if (file.empty()) + return; + auto relative_file = config().make_path_relative(file); relative_file.make_preferred(); diff --git a/src/package_diagram/visitor/translation_unit_visitor.h b/src/package_diagram/visitor/translation_unit_visitor.h index 67859e86..5b937d66 100644 --- a/src/package_diagram/visitor/translation_unit_visitor.h +++ b/src/package_diagram/visitor/translation_unit_visitor.h @@ -1,5 +1,5 @@ /** - * src/package_diagram/visitor/translation_unit_visitor.h + * @file src/package_diagram/visitor/translation_unit_visitor.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/generators/json/sequence_diagram_generator.cc b/src/sequence_diagram/generators/json/sequence_diagram_generator.cc index 2f89cca4..41bd3467 100644 --- a/src/sequence_diagram/generators/json/sequence_diagram_generator.cc +++ b/src/sequence_diagram/generators/json/sequence_diagram_generator.cc @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/generators/json/sequence_diagram_generator.cc + * @file src/sequence_diagram/generators/json/sequence_diagram_generator.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/generators/json/sequence_diagram_generator.h b/src/sequence_diagram/generators/json/sequence_diagram_generator.h index dbad2163..d30a2f48 100644 --- a/src/sequence_diagram/generators/json/sequence_diagram_generator.h +++ b/src/sequence_diagram/generators/json/sequence_diagram_generator.h @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/generators/json/sequence_diagram_generator.h + * @file src/sequence_diagram/generators/json/sequence_diagram_generator.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc index 82a40fc9..b646d373 100644 --- a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc +++ b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc + * @file src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.h b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.h index d86c8ea7..72185859 100644 --- a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.h +++ b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.h @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/generators/plantuml/sequence_diagram_generator.h + * @file src/sequence_diagram/generators/plantuml/sequence_diagram_generator.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/model/activity.cc b/src/sequence_diagram/model/activity.cc index b8c2438d..e8f9100e 100644 --- a/src/sequence_diagram/model/activity.cc +++ b/src/sequence_diagram/model/activity.cc @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/model/activity.cc + * @file src/sequence_diagram/model/activity.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/model/activity.h b/src/sequence_diagram/model/activity.h index 64477642..0089c382 100644 --- a/src/sequence_diagram/model/activity.h +++ b/src/sequence_diagram/model/activity.h @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/model/activity.h + * @file src/sequence_diagram/model/activity.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/model/diagram.cc b/src/sequence_diagram/model/diagram.cc index 5947d4d6..2cae6447 100644 --- a/src/sequence_diagram/model/diagram.cc +++ b/src/sequence_diagram/model/diagram.cc @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/model/diagram.cc + * @file src/sequence_diagram/model/diagram.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/model/diagram.h b/src/sequence_diagram/model/diagram.h index 8abf9b64..29ca5208 100644 --- a/src/sequence_diagram/model/diagram.h +++ b/src/sequence_diagram/model/diagram.h @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/model/diagram.h + * @file src/sequence_diagram/model/diagram.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/model/message.cc b/src/sequence_diagram/model/message.cc index 180b3c16..ec49598f 100644 --- a/src/sequence_diagram/model/message.cc +++ b/src/sequence_diagram/model/message.cc @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/model/message.cc + * @file src/sequence_diagram/model/message.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/model/message.h b/src/sequence_diagram/model/message.h index 81cb67a6..b92f87a6 100644 --- a/src/sequence_diagram/model/message.h +++ b/src/sequence_diagram/model/message.h @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/model/message.h + * @file src/sequence_diagram/model/message.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/model/participant.cc b/src/sequence_diagram/model/participant.cc index dabb05fc..2c9b1083 100644 --- a/src/sequence_diagram/model/participant.cc +++ b/src/sequence_diagram/model/participant.cc @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/model/participant.cc + * @file src/sequence_diagram/model/participant.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/model/participant.h b/src/sequence_diagram/model/participant.h index 9a3e19a3..65808afc 100644 --- a/src/sequence_diagram/model/participant.h +++ b/src/sequence_diagram/model/participant.h @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/model/participant.h + * @file src/sequence_diagram/model/participant.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/visitor/call_expression_context.cc b/src/sequence_diagram/visitor/call_expression_context.cc index 91756a67..ea619188 100644 --- a/src/sequence_diagram/visitor/call_expression_context.cc +++ b/src/sequence_diagram/visitor/call_expression_context.cc @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/visitor/call_expression_context.cc + * @file src/sequence_diagram/visitor/call_expression_context.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/visitor/call_expression_context.h b/src/sequence_diagram/visitor/call_expression_context.h index 127020b4..d400bb66 100644 --- a/src/sequence_diagram/visitor/call_expression_context.h +++ b/src/sequence_diagram/visitor/call_expression_context.h @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/visitor/call_expression_context.h + * @file src/sequence_diagram/visitor/call_expression_context.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/visitor/translation_unit_visitor.cc b/src/sequence_diagram/visitor/translation_unit_visitor.cc index 0539e97b..07959395 100644 --- a/src/sequence_diagram/visitor/translation_unit_visitor.cc +++ b/src/sequence_diagram/visitor/translation_unit_visitor.cc @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/visitor/translation_unit_visitor.cc + * @file src/sequence_diagram/visitor/translation_unit_visitor.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/sequence_diagram/visitor/translation_unit_visitor.h b/src/sequence_diagram/visitor/translation_unit_visitor.h index a9e1bb58..b1d203f8 100644 --- a/src/sequence_diagram/visitor/translation_unit_visitor.h +++ b/src/sequence_diagram/visitor/translation_unit_visitor.h @@ -1,5 +1,5 @@ /** - * src/sequence_diagram/visitor/translation_unit_visitor.h + * @file src/sequence_diagram/visitor/translation_unit_visitor.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/util/error.h b/src/util/error.h index ab90a8f6..434474aa 100644 --- a/src/util/error.h +++ b/src/util/error.h @@ -1,5 +1,5 @@ /** - * src/util/error.h + * @file src/util/error.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/util/query_driver_output_extractor.cc b/src/util/query_driver_output_extractor.cc index 73245817..9f4ffc4c 100644 --- a/src/util/query_driver_output_extractor.cc +++ b/src/util/query_driver_output_extractor.cc @@ -1,5 +1,5 @@ /** - * src/util/query_driver_include_extractor.cc + * @file src/util/query_driver_include_extractor.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/util/query_driver_output_extractor.h b/src/util/query_driver_output_extractor.h index 5b08df87..f2e2c26c 100644 --- a/src/util/query_driver_output_extractor.h +++ b/src/util/query_driver_output_extractor.h @@ -1,5 +1,5 @@ /** - * src/util/query_driver_include_extractor.h + * @file src/util/query_driver_include_extractor.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/util/thread_pool_executor.cc b/src/util/thread_pool_executor.cc index f6705972..150ab247 100644 --- a/src/util/thread_pool_executor.cc +++ b/src/util/thread_pool_executor.cc @@ -1,5 +1,5 @@ /** - * src/util/thread_pool_executor.cc + * @file src/util/thread_pool_executor.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/util/thread_pool_executor.h b/src/util/thread_pool_executor.h index 21a44e09..e8d3c12e 100644 --- a/src/util/thread_pool_executor.h +++ b/src/util/thread_pool_executor.h @@ -1,5 +1,5 @@ /** - * src/util/thread_pool_executor.h + * @file src/util/thread_pool_executor.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/util/util.cc b/src/util/util.cc index c7759336..2f42ddb2 100644 --- a/src/util/util.cc +++ b/src/util/util.cc @@ -1,5 +1,5 @@ /** - * src/util/util.cc + * @file src/util/util.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/src/util/util.h b/src/util/util.h index d35eaa07..5b943058 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -1,5 +1,5 @@ /** - * src/util/util.h + * @file src/util/util.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/tests/t00004/test_case.h b/tests/t00004/test_case.h index 098b46dc..a41d6a2b 100644 --- a/tests/t00004/test_case.h +++ b/tests/t00004/test_case.h @@ -30,10 +30,6 @@ TEST_CASE("t00004", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00004_class"); - REQUIRE(!model->should_include("std::vector")); - REQUIRE(model->should_include("clanguml::t00004::A")); - REQUIRE(model->should_include("clanguml::t00004::A::AA")); - REQUIRE(model->should_include("clanguml::t00004::A:::AAA")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00005/test_case.h b/tests/t00005/test_case.h index a38782b0..0383deb9 100644 --- a/tests/t00005/test_case.h +++ b/tests/t00005/test_case.h @@ -27,10 +27,6 @@ TEST_CASE("t00005", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00005_class"); - REQUIRE(model->should_include("clanguml::t00005::A")); - REQUIRE(model->should_include("clanguml::t00005::B")); - REQUIRE(model->should_include("clanguml::t00005::C")); - REQUIRE(model->should_include("clanguml::t00005::D")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00006/test_case.h b/tests/t00006/test_case.h index f0219f5a..3ed43aa1 100644 --- a/tests/t00006/test_case.h +++ b/tests/t00006/test_case.h @@ -28,12 +28,6 @@ TEST_CASE("t00006", "[test-case][class]") REQUIRE(model->name() == "t00006_class"); - REQUIRE(model->should_include("clanguml::t00006::A")); - REQUIRE(model->should_include("clanguml::t00006::B")); - REQUIRE(model->should_include("clanguml::t00006::C")); - REQUIRE(model->should_include("clanguml::t00006::D")); - REQUIRE(model->should_include("clanguml::t00006::E")); - { auto puml = generate_class_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t00013/test_case.h b/tests/t00013/test_case.h index 40f8b2dc..14db1799 100644 --- a/tests/t00013/test_case.h +++ b/tests/t00013/test_case.h @@ -27,9 +27,6 @@ TEST_CASE("t00013", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00013_class"); - REQUIRE(model->should_include("clanguml::t00013::A")); - REQUIRE(model->should_include("clanguml::t00013::B")); - REQUIRE(model->should_include("ABCD::F")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00014/test_case.h b/tests/t00014/test_case.h index 567cb280..f17c0b9b 100644 --- a/tests/t00014/test_case.h +++ b/tests/t00014/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00014", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00014_class"); - REQUIRE(model->should_include("clanguml::t00014::B")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00015/test_case.h b/tests/t00015/test_case.h index f66322b5..604c968c 100644 --- a/tests/t00015/test_case.h +++ b/tests/t00015/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00015", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00015_class"); - REQUIRE(model->should_include("clanguml::t00015::ns1::ns2::A")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00016/test_case.h b/tests/t00016/test_case.h index 3ad8ec11..e4ead1e0 100644 --- a/tests/t00016/test_case.h +++ b/tests/t00016/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00016", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00016_class"); - REQUIRE(model->should_include("clanguml::t00016::is_numeric")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00018/test_case.h b/tests/t00018/test_case.h index 37c7bdaa..a35be404 100644 --- a/tests/t00018/test_case.h +++ b/tests/t00018/test_case.h @@ -27,7 +27,7 @@ TEST_CASE("t00018", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00018_class"); - REQUIRE(model->should_include("clanguml::t00018::widget")); + { auto puml = generate_class_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t00020/test_case.h b/tests/t00020/test_case.h index 299658d7..e712d770 100644 --- a/tests/t00020/test_case.h +++ b/tests/t00020/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00020", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00020_class"); - REQUIRE(model->should_include("clanguml::t00020::ProductA")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00021/test_case.h b/tests/t00021/test_case.h index 76ed85f7..953f22a4 100644 --- a/tests/t00021/test_case.h +++ b/tests/t00021/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00021", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00021_class"); - REQUIRE(model->should_include("clanguml::t00021::Visitor")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00022/test_case.h b/tests/t00022/test_case.h index 8602735a..6c258ab7 100644 --- a/tests/t00022/test_case.h +++ b/tests/t00022/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00022", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00022_class"); - REQUIRE(model->should_include("clanguml::t00022::A")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00023/test_case.h b/tests/t00023/test_case.h index 0d926df9..ba772ce6 100644 --- a/tests/t00023/test_case.h +++ b/tests/t00023/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00023", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00023_class"); - REQUIRE(model->should_include("clanguml::t00023::Visitor")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00024/test_case.h b/tests/t00024/test_case.h index c0e924a4..efd14550 100644 --- a/tests/t00024/test_case.h +++ b/tests/t00024/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00024", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00024_class"); - REQUIRE(model->should_include("clanguml::t00024::A")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00025/test_case.h b/tests/t00025/test_case.h index bd15af94..ebf745b5 100644 --- a/tests/t00025/test_case.h +++ b/tests/t00025/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00025", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00025_class"); - REQUIRE(model->should_include("clanguml::t00025::A")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00026/test_case.h b/tests/t00026/test_case.h index 014d2ef8..f2ea212c 100644 --- a/tests/t00026/test_case.h +++ b/tests/t00026/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00026", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00026_class"); - REQUIRE(model->should_include("clanguml::t00026::A")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00027/test_case.h b/tests/t00027/test_case.h index 2b20e682..376ab6ab 100644 --- a/tests/t00027/test_case.h +++ b/tests/t00027/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00027", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00027_class"); - REQUIRE(model->should_include("clanguml::t00027::A")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00028/test_case.h b/tests/t00028/test_case.h index 0434921d..642d424a 100644 --- a/tests/t00028/test_case.h +++ b/tests/t00028/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00028", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00028_class"); - REQUIRE(model->should_include("clanguml::t00028::A")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00029/test_case.h b/tests/t00029/test_case.h index ac067148..bafe9330 100644 --- a/tests/t00029/test_case.h +++ b/tests/t00029/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00029", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00029_class"); - REQUIRE(model->should_include("clanguml::t00029::A")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00030/test_case.h b/tests/t00030/test_case.h index f3dc105f..282943a7 100644 --- a/tests/t00030/test_case.h +++ b/tests/t00030/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00030", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00030_class"); - REQUIRE(model->should_include("clanguml::t00030::A")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00031/test_case.h b/tests/t00031/test_case.h index c8b26bf1..bc453a4a 100644 --- a/tests/t00031/test_case.h +++ b/tests/t00031/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00031", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00031_class"); - REQUIRE(model->should_include("clanguml::t00031::A")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00032/test_case.h b/tests/t00032/test_case.h index ba36785b..065e3a38 100644 --- a/tests/t00032/test_case.h +++ b/tests/t00032/test_case.h @@ -27,7 +27,7 @@ TEST_CASE("t00032", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00032_class"); - REQUIRE(model->should_include("clanguml::t00032::A")); + { auto puml = generate_class_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t00033/test_case.h b/tests/t00033/test_case.h index 350c366e..f6a1e6da 100644 --- a/tests/t00033/test_case.h +++ b/tests/t00033/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00033", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00033_class"); - REQUIRE(model->should_include("clanguml::t00033::A")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00034/test_case.h b/tests/t00034/test_case.h index 2b56baa1..03cc52f1 100644 --- a/tests/t00034/test_case.h +++ b/tests/t00034/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00034", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00034_class"); - REQUIRE(model->should_include("clanguml::t00034::A")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00035/test_case.h b/tests/t00035/test_case.h index 5b8e1021..2da5cb57 100644 --- a/tests/t00035/test_case.h +++ b/tests/t00035/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00035", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00035_class"); - REQUIRE(model->should_include("clanguml::t00035::A")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00036/test_case.h b/tests/t00036/test_case.h index 385ff0e4..fe307bcb 100644 --- a/tests/t00036/test_case.h +++ b/tests/t00036/test_case.h @@ -28,6 +28,7 @@ TEST_CASE("t00036", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00036_class"); + { auto puml = generate_class_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t00041/test_case.h b/tests/t00041/test_case.h index 88c1e483..9d1e634e 100644 --- a/tests/t00041/test_case.h +++ b/tests/t00041/test_case.h @@ -28,6 +28,7 @@ TEST_CASE("t00041", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00041_class"); + { auto puml = generate_class_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t00044/test_case.h b/tests/t00044/test_case.h index e48ce76d..ef2010e3 100644 --- a/tests/t00044/test_case.h +++ b/tests/t00044/test_case.h @@ -28,6 +28,7 @@ TEST_CASE("t00044", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00044_class"); + { auto puml = generate_class_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t00045/test_case.h b/tests/t00045/test_case.h index 249ce321..c198c0e2 100644 --- a/tests/t00045/test_case.h +++ b/tests/t00045/test_case.h @@ -27,7 +27,6 @@ TEST_CASE("t00045", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00045_class"); - REQUIRE(model->should_include("clanguml::t00045::ns1::ns2::A")); { auto puml = generate_class_puml(diagram, *model); diff --git a/tests/t00046/test_case.h b/tests/t00046/test_case.h index 3ab43551..bae8a3c1 100644 --- a/tests/t00046/test_case.h +++ b/tests/t00046/test_case.h @@ -27,7 +27,7 @@ TEST_CASE("t00046", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00046_class"); - REQUIRE(model->should_include("ns1::ns2::A")); + { auto puml = generate_class_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t00047/test_case.h b/tests/t00047/test_case.h index ae1e89f0..4a83feb2 100644 --- a/tests/t00047/test_case.h +++ b/tests/t00047/test_case.h @@ -27,6 +27,7 @@ TEST_CASE("t00047", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00047_class"); + { auto puml = generate_class_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t00048/test_case.h b/tests/t00048/test_case.h index 6a3d2492..3cd4616f 100644 --- a/tests/t00048/test_case.h +++ b/tests/t00048/test_case.h @@ -27,6 +27,7 @@ TEST_CASE("t00048", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00048_class"); + { auto puml = generate_class_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t00049/test_case.h b/tests/t00049/test_case.h index fc7c5a41..1b94a090 100644 --- a/tests/t00049/test_case.h +++ b/tests/t00049/test_case.h @@ -27,6 +27,7 @@ TEST_CASE("t00049", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00049_class"); + { auto puml = generate_class_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t00050/test_case.h b/tests/t00050/test_case.h index d68c0fb6..5f4ae9f0 100644 --- a/tests/t00050/test_case.h +++ b/tests/t00050/test_case.h @@ -27,6 +27,7 @@ TEST_CASE("t00050", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00050_class"); + { auto puml = generate_class_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t00056/test_case.h b/tests/t00056/test_case.h index 216eca4a..ae8a6a3b 100644 --- a/tests/t00056/test_case.h +++ b/tests/t00056/test_case.h @@ -27,6 +27,7 @@ TEST_CASE("t00056", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00056_class"); + { auto puml = generate_class_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t00057/test_case.h b/tests/t00057/test_case.h index 26eb1d5d..1d5eddc5 100644 --- a/tests/t00057/test_case.h +++ b/tests/t00057/test_case.h @@ -27,6 +27,7 @@ TEST_CASE("t00057", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00057_class"); + { auto puml = generate_class_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t00060/test_case.h b/tests/t00060/test_case.h index 5af2f9e9..c280890c 100644 --- a/tests/t00060/test_case.h +++ b/tests/t00060/test_case.h @@ -27,6 +27,7 @@ TEST_CASE("t00060", "[test-case][class]") auto model = generate_class_diagram(*db, diagram); REQUIRE(model->name() == "t00060_class"); + { auto puml = generate_class_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t20001/test_case.h b/tests/t20001/test_case.h index fbf91e1f..8713f443 100644 --- a/tests/t20001/test_case.h +++ b/tests/t20001/test_case.h @@ -28,9 +28,6 @@ TEST_CASE("t20001", "[test-case][sequence]") REQUIRE(model->name() == "t20001_sequence"); - REQUIRE(model->should_include("clanguml::t20001::A")); - REQUIRE(!model->should_include("clanguml::t20001::detail::C")); - REQUIRE(!model->should_include("std::vector")); { auto puml = generate_sequence_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t20003/test_case.h b/tests/t20003/test_case.h index 76fe7b52..669a388e 100644 --- a/tests/t20003/test_case.h +++ b/tests/t20003/test_case.h @@ -27,6 +27,7 @@ TEST_CASE("t20003", "[test-case][sequence]") auto model = generate_sequence_diagram(*db, diagram); REQUIRE(model->name() == "t20003_sequence"); + { auto puml = generate_sequence_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t20004/test_case.h b/tests/t20004/test_case.h index 10a09a65..8de05566 100644 --- a/tests/t20004/test_case.h +++ b/tests/t20004/test_case.h @@ -27,6 +27,7 @@ TEST_CASE("t20004", "[test-case][sequence]") auto model = generate_sequence_diagram(*db, diagram); REQUIRE(model->name() == "t20004_sequence"); + { auto puml = generate_sequence_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t20006/test_case.h b/tests/t20006/test_case.h index c24b3e30..6d1cb553 100644 --- a/tests/t20006/test_case.h +++ b/tests/t20006/test_case.h @@ -27,6 +27,7 @@ TEST_CASE("t20006", "[test-case][sequence]") auto model = generate_sequence_diagram(*db, diagram); REQUIRE(model->name() == "t20006_sequence"); + { auto puml = generate_sequence_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t20007/test_case.h b/tests/t20007/test_case.h index 85b679c3..39585d6d 100644 --- a/tests/t20007/test_case.h +++ b/tests/t20007/test_case.h @@ -27,6 +27,7 @@ TEST_CASE("t20007", "[test-case][sequence]") auto model = generate_sequence_diagram(*db, diagram); REQUIRE(model->name() == "t20007_sequence"); + { auto puml = generate_sequence_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t20008/test_case.h b/tests/t20008/test_case.h index 5bff7031..05fff42f 100644 --- a/tests/t20008/test_case.h +++ b/tests/t20008/test_case.h @@ -27,6 +27,7 @@ TEST_CASE("t20008", "[test-case][sequence]") auto model = generate_sequence_diagram(*db, diagram); REQUIRE(model->name() == "t20008_sequence"); + { auto puml = generate_sequence_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t20009/test_case.h b/tests/t20009/test_case.h index 1daf7379..1994e2c5 100644 --- a/tests/t20009/test_case.h +++ b/tests/t20009/test_case.h @@ -27,6 +27,7 @@ TEST_CASE("t20009", "[test-case][sequence]") auto model = generate_sequence_diagram(*db, diagram); REQUIRE(model->name() == "t20009_sequence"); + { auto puml = generate_sequence_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t20010/test_case.h b/tests/t20010/test_case.h index 4be8a01c..9e3082c7 100644 --- a/tests/t20010/test_case.h +++ b/tests/t20010/test_case.h @@ -27,6 +27,7 @@ TEST_CASE("t20010", "[test-case][sequence]") auto model = generate_sequence_diagram(*db, diagram); REQUIRE(model->name() == "t20010_sequence"); + { auto puml = generate_sequence_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t30001/test_case.h b/tests/t30001/test_case.h index c5e64c1b..1442e8d9 100644 --- a/tests/t30001/test_case.h +++ b/tests/t30001/test_case.h @@ -28,10 +28,6 @@ TEST_CASE("t30001", "[test-case][package]") REQUIRE(model->name() == "t30001_package"); - REQUIRE(model->should_include("clanguml::t30001::A")); - REQUIRE(!model->should_include("clanguml::t30001::detail::C")); - REQUIRE(!model->should_include("std::vector")); - { auto puml = generate_package_puml(diagram, *model); AliasMatcher _A(puml); diff --git a/tests/t30010/.clang-uml b/tests/t30010/.clang-uml index f862cd41..22f72ba3 100644 --- a/tests/t30010/.clang-uml +++ b/tests/t30010/.clang-uml @@ -9,9 +9,8 @@ diagrams: - t30010.cc relative_to: ../../../tests/t30010 include: - namespaces: - - clanguml::t30010 -# paths: -# - . + paths: + - app + - libraries using_namespace: - clanguml::t30010 \ No newline at end of file diff --git a/tests/test_cases.cc b/tests/test_cases.cc index 608f5795..cfc56a8c 100644 --- a/tests/test_cases.cc +++ b/tests/test_cases.cc @@ -1,5 +1,5 @@ /** - * tests/test_cases.cc + * @file tests/test_cases.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/tests/test_cases.h b/tests/test_cases.h index e3e0e5ae..f3b9b8ae 100644 --- a/tests/test_cases.h +++ b/tests/test_cases.h @@ -1,5 +1,5 @@ /** - * tests/test_cases.h + * @file tests/test_cases.h * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/tests/test_cli_handler.cc b/tests/test_cli_handler.cc index b64947a0..3e3cf121 100644 --- a/tests/test_cli_handler.cc +++ b/tests/test_cli_handler.cc @@ -1,5 +1,5 @@ /** - * tests/test_cli_handler.cc + * @file tests/test_cli_handler.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/tests/test_compilation_database.cc b/tests/test_compilation_database.cc index aba0085e..b0a6c4f0 100644 --- a/tests/test_compilation_database.cc +++ b/tests/test_compilation_database.cc @@ -1,5 +1,5 @@ /** - * tests/test_compilation_database.cc + * @file tests/test_compilation_database.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/tests/test_config.cc b/tests/test_config.cc index d9353d93..486c1619 100644 --- a/tests/test_config.cc +++ b/tests/test_config.cc @@ -1,5 +1,5 @@ /** - * tests/test_config.cc + * @file tests/test_config.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/tests/test_config_data/filters.yml b/tests/test_config_data/filters.yml index 6182ee34..ee179813 100644 --- a/tests/test_config_data/filters.yml +++ b/tests/test_config_data/filters.yml @@ -31,6 +31,14 @@ diagrams: method_types: - deleted - destructor + namespace_test: + type: class + include: + namespaces: + - ns1::ns2 + exclude: + namespaces: + - ns1::ns2::detail regex_elements_test: type: class include: diff --git a/tests/test_decorator_parser.cc b/tests/test_decorator_parser.cc index 60c86d2e..0a9fb9e0 100644 --- a/tests/test_decorator_parser.cc +++ b/tests/test_decorator_parser.cc @@ -1,5 +1,5 @@ /** - * tests/test_decorator_parser.cc + * @file tests/test_decorator_parser.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/tests/test_filters.cc b/tests/test_filters.cc index c1b9869e..77e3a64f 100644 --- a/tests/test_filters.cc +++ b/tests/test_filters.cc @@ -1,5 +1,5 @@ /** - * tests/test_filters.cc + * @file tests/test_filters.cc * * Copyright (c) 2021-2023 Bartek Kryza * @@ -109,6 +109,70 @@ TEST_CASE("Test method_types exclude filter", "[unit-test]") CHECK(!filter.should_include(cm)); } +TEST_CASE("Test namespaces filter", "[unit-test]") +{ + using clanguml::class_diagram::model::class_method; + using clanguml::class_diagram::model::class_parent; + using clanguml::common::model::access_t; + using clanguml::common::model::diagram_filter; + using clanguml::common::model::namespace_; + using clanguml::common::model::package; + using clanguml::common::model::source_file; + + using clanguml::class_diagram::model::class_; + + auto cfg = clanguml::config::load("./test_config_data/filters.yml"); + + auto &config = *cfg.diagrams["namespace_test"]; + clanguml::class_diagram::model::diagram diagram; + + diagram_filter filter(diagram, config); + + class_ c{{}}; + + c.set_namespace(namespace_{"ns1::ns2"}); + c.set_name("ClassA"); + + CHECK(filter.should_include(c)); + + c.set_namespace(namespace_{"ns1::ns2::detail"}); + c.set_name("ClassAImpl"); + + CHECK(!filter.should_include(c)); + + c.set_namespace(namespace_{"ns1::interface"}); + c.set_name("IClassA"); + + CHECK(!filter.should_include(c)); + + CHECK(filter.should_include(namespace_{"ns1"})); + CHECK(filter.should_include(namespace_{"ns1::ns2"})); + CHECK(!filter.should_include(namespace_{"ns1::ns2::detail"})); + CHECK(!filter.should_include(namespace_{"ns1::ns2::detail::more_detail"})); + CHECK(!filter.should_include(namespace_{"ns1::interface"})); + + package p{{}}; + + p.set_namespace({"ns1"}); + + CHECK(filter.should_include(p)); + + p.set_namespace({"ns1"}); + p.set_name("ns2"); + + CHECK(filter.should_include(p)); + + p.set_namespace({"ns1::ns2"}); + p.set_name("detail"); + + CHECK(!filter.should_include(p)); + + p.set_namespace({"ns1"}); + p.set_name("interface"); + + CHECK(!filter.should_include(p)); +} + TEST_CASE("Test elements regexp filter", "[unit-test]") { using clanguml::class_diagram::model::class_method; @@ -185,7 +249,7 @@ TEST_CASE("Test namespaces regexp filter", "[unit-test]") CHECK(filter.should_include(c)); - CHECK(!filter.should_include(namespace_{"ns1"})); + CHECK(filter.should_include(namespace_{"ns1"})); CHECK(filter.should_include(namespace_{"ns1::ns2"})); CHECK(!filter.should_include(namespace_{"ns1::ns2::detail"})); CHECK(filter.should_include(namespace_{"ns1::interface"})); diff --git a/tests/test_model.cc b/tests/test_model.cc index ac4d75b4..d61c45d5 100644 --- a/tests/test_model.cc +++ b/tests/test_model.cc @@ -1,5 +1,5 @@ /** - * tests/test_model.cc + * @file tests/test_model.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/tests/test_query_driver_output_extractor.cc b/tests/test_query_driver_output_extractor.cc index 361b27f5..016cb998 100644 --- a/tests/test_query_driver_output_extractor.cc +++ b/tests/test_query_driver_output_extractor.cc @@ -1,5 +1,5 @@ /** - * tests/test_query_driver_output_extractor.cc + * @file tests/test_query_driver_output_extractor.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/tests/test_thread_pool_executor.cc b/tests/test_thread_pool_executor.cc index 45655992..d5d9fbd1 100644 --- a/tests/test_thread_pool_executor.cc +++ b/tests/test_thread_pool_executor.cc @@ -1,5 +1,5 @@ /** - * tests/test_thread_pool_executor.cc + * @file tests/test_thread_pool_executor.cc * * Copyright (c) 2021-2023 Bartek Kryza * diff --git a/tests/test_util.cc b/tests/test_util.cc index 413cbb33..5c069c7c 100644 --- a/tests/test_util.cc +++ b/tests/test_util.cc @@ -1,5 +1,5 @@ /** - * tests/test_util.cc + * @file tests/test_util.cc * * Copyright (c) 2021-2023 Bartek Kryza *