From cea427e32d9d7aafb723e7542c2fb3f235828ba2 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sun, 10 Dec 2023 11:54:52 +0100 Subject: [PATCH] Fixed link generation for template specializations --- .../plantuml/class_diagram_generator.cc | 2 +- src/class_diagram/visitor/template_builder.cc | 10 ++++----- .../visitor/translation_unit_visitor.cc | 2 ++ src/common/generators/mermaid/generator.h | 19 ++++++++++------ src/common/generators/plantuml/generator.h | 22 +++++++++++-------- .../visitor/translation_unit_visitor.cc | 9 ++++---- .../visitor/translation_unit_visitor.cc | 10 +++++++++ .../plantuml/sequence_diagram_generator.cc | 14 +++++++----- src/sequence_diagram/model/diagram.cc | 2 +- src/util/util.cc | 2 +- uml/sequence/cli_handle_options_sequence.yml | 1 + uml/sequence/load_config_sequence.yml | 1 + 12 files changed, 59 insertions(+), 35 deletions(-) diff --git a/src/class_diagram/generators/plantuml/class_diagram_generator.cc b/src/class_diagram/generators/plantuml/class_diagram_generator.cc index 551b9b10..afd43db8 100644 --- a/src/class_diagram/generators/plantuml/class_diagram_generator.cc +++ b/src/class_diagram/generators/plantuml/class_diagram_generator.cc @@ -33,7 +33,7 @@ generator::generator(diagram_config &config, diagram_model &model) void generator::generate_link( std::ostream &ostr, const class_diagram::model::class_element &e) const { - if (e.file().empty()) + if (e.file_relative().empty()) return; auto context = element_context(e); diff --git a/src/class_diagram/visitor/template_builder.cc b/src/class_diagram/visitor/template_builder.cc index 2493d136..02de4b8c 100644 --- a/src/class_diagram/visitor/template_builder.cc +++ b/src/class_diagram/visitor/template_builder.cc @@ -269,10 +269,7 @@ std::unique_ptr template_builder::build(const clang::NamedDecl *cls, template_instantiation.set_id( common::to_id(template_instantiation_ptr->full_name(false))); - visitor_.set_source_location(*template_decl, template_instantiation); - - LOG_DBG("**** {} -> {}", template_instantiation.full_name(false), - template_instantiation.file()); + visitor_.set_source_location(*cls, template_instantiation); return template_instantiation_ptr; } @@ -361,6 +358,8 @@ template_builder::build_from_class_template_specialization( template_instantiation_ptr->full_name(false), templated_decl_id); } + visitor_.set_source_location(*template_decl, template_instantiation); + return template_instantiation_ptr; } @@ -1064,8 +1063,7 @@ template_builder::try_as_template_specialization_type( if (diagram().should_include( namespace_{nested_template_instantiation_full_name})) { - visitor_.set_source_location( - *template_decl, *nested_template_instantiation); + visitor_.set_source_location(*cls, *nested_template_instantiation); visitor_.add_class(std::move(nested_template_instantiation)); } diff --git a/src/class_diagram/visitor/translation_unit_visitor.cc b/src/class_diagram/visitor/translation_unit_visitor.cc index 4469e46b..2b30b4d5 100644 --- a/src/class_diagram/visitor/translation_unit_visitor.cc +++ b/src/class_diagram/visitor/translation_unit_visitor.cc @@ -264,6 +264,8 @@ bool translation_unit_visitor::VisitTypeAliasTemplateDecl( LOG_DBG("Adding class {} with id {}", name, id); + set_source_location(*cls, *template_specialization_ptr); + add_class(std::move(template_specialization_ptr)); } diff --git a/src/common/generators/mermaid/generator.h b/src/common/generators/mermaid/generator.h index bae9752d..0ef19f3b 100644 --- a/src/common/generators/mermaid/generator.h +++ b/src/common/generators/mermaid/generator.h @@ -217,17 +217,22 @@ inja::json generator::element_context(const E &e) const if (!e.file().empty()) { std::filesystem::path file{e.file()}; - std::string relative_path = file.string(); + std::string git_relative_path = file.string(); + if (!e.file_relative().empty()) { #if _MSC_VER - if (file.is_absolute() && ctx.contains("git")) + if (file.is_absolute() && ctx.contains("git")) #else - if (file.is_absolute() && ctx.template contains("git")) + if (file.is_absolute() && ctx.template contains("git")) #endif - relative_path = - std::filesystem::relative(file, ctx["git"]["toplevel"]) - .string(); + git_relative_path = + std::filesystem::relative(file, ctx["git"]["toplevel"]) + .string(); + } + else { + git_relative_path = ""; + } - ctx["element"]["source"]["path"] = util::path_to_url(relative_path); + ctx["element"]["source"]["path"] = util::path_to_url(git_relative_path); ctx["element"]["source"]["full_path"] = file.string(); ctx["element"]["source"]["name"] = file.filename().string(); ctx["element"]["source"]["line"] = e.line(); diff --git a/src/common/generators/plantuml/generator.h b/src/common/generators/plantuml/generator.h index 4cfd2cc4..dbc560ac 100644 --- a/src/common/generators/plantuml/generator.h +++ b/src/common/generators/plantuml/generator.h @@ -218,17 +218,22 @@ inja::json generator::element_context(const E &e) const if (!e.file().empty()) { std::filesystem::path file{e.file()}; - std::string relative_path = file.string(); + std::string git_relative_path = file.string(); + if (!e.file_relative().empty()) { #if _MSC_VER - if (file.is_absolute() && ctx.contains("git")) + if (file.is_absolute() && ctx.contains("git")) #else - if (file.is_absolute() && ctx.template contains("git")) + if (file.is_absolute() && ctx.template contains("git")) #endif - relative_path = - std::filesystem::relative(file, ctx["git"]["toplevel"]) - .string(); + git_relative_path = + std::filesystem::relative(file, ctx["git"]["toplevel"]) + .string(); + } + else { + git_relative_path = ""; + } - ctx["element"]["source"]["path"] = util::path_to_url(relative_path); + ctx["element"]["source"]["path"] = util::path_to_url(git_relative_path); ctx["element"]["source"]["full_path"] = file.string(); ctx["element"]["source"]["name"] = file.filename().string(); ctx["element"]["source"]["line"] = e.line(); @@ -477,13 +482,12 @@ void generator::generate_link(std::ostream &ostr, const E &e) const { const auto &config = generators::generator::config(); - if (e.file().empty()) + if (e.file_relative().empty()) return; ostr << " [["; try { if (!config.generate_links().link.empty()) { - ostr << env().render(std::string_view{config.generate_links().link}, element_context(e)); } diff --git a/src/common/visitor/translation_unit_visitor.cc b/src/common/visitor/translation_unit_visitor.cc index 4cf0937d..e30deeee 100644 --- a/src/common/visitor/translation_unit_visitor.cc +++ b/src/common/visitor/translation_unit_visitor.cc @@ -143,17 +143,18 @@ void translation_unit_visitor::set_source_location( file_path = fs::canonical(file_path); - if (!util::is_relative_to(file_path, relative_to_path_)) { - return; - } - file = file_path.string(); element.set_file(file); + if (util::is_relative_to(file_path, relative_to_path_)) { element.set_file_relative(util::path_to_url( fs::relative(element.file(), relative_to_path_).string())); } + else { + element.set_file_relative(""); + } + element.set_translation_unit(tu_path().string()); element.set_line(line); element.set_column(column); diff --git a/src/include_diagram/visitor/translation_unit_visitor.cc b/src/include_diagram/visitor/translation_unit_visitor.cc index edffae76..cdc24be8 100644 --- a/src/include_diagram/visitor/translation_unit_visitor.cc +++ b/src/include_diagram/visitor/translation_unit_visitor.cc @@ -239,6 +239,16 @@ translation_unit_visitor::include_visitor::process_source_file( source_file.set_file(std::filesystem::absolute(file.string()) .lexically_normal() .string()); + + if (util::is_relative_to(file_path, config().root_directory())) { + source_file.set_file_relative(util::path_to_url( + relative(source_file.file(), config().root_directory()) + .string())); + } + else { + source_file.set_file_relative(""); + } + source_file.set_line(0); return source_file.id(); diff --git a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc index f42bbb1a..30b28d85 100644 --- a/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc +++ b/src/sequence_diagram/generators/plantuml/sequence_diagram_generator.cc @@ -302,16 +302,18 @@ void generator::generate_message_comment( if (comment_generated_from_note_decorators) return; - if (!config().generate_message_comments() || !m.comment()) + if (!config().generate_message_comments()) return; - ostr << "note over " << generate_alias(from.value()) << '\n'; + if (const auto &comment = m.comment(); comment) { + ostr << "note over " << generate_alias(from.value()) << '\n'; - ostr << util::format_message_comment( - m.comment().value(), config().message_comment_width()) - << '\n'; + ostr << util::format_message_comment( + comment.value(), config().message_comment_width()) + << '\n'; - ostr << "end note" << '\n'; + ostr << "end note" << '\n'; + } } void generator::generate_participant( diff --git a/src/sequence_diagram/model/diagram.cc b/src/sequence_diagram/model/diagram.cc index 34cf4fc9..26215680 100644 --- a/src/sequence_diagram/model/diagram.cc +++ b/src/sequence_diagram/model/diagram.cc @@ -449,7 +449,7 @@ void diagram::print() const from_participant.full_name(false), from_participant.id(), to_participant.full_name(false), to_participant.id(), message.message_name(), to_string(message.type()), - message.comment() ? message.comment().value() : "None"); + message.comment().value_or("None")); } } } diff --git a/src/util/util.cc b/src/util/util.cc index a6f207a1..4fa36a65 100644 --- a/src/util/util.cc +++ b/src/util/util.cc @@ -410,7 +410,7 @@ bool is_relative_to( if (child.has_root_directory() != parent.has_root_directory()) return false; - return starts_with(child, parent); + return starts_with(weakly_canonical(child), weakly_canonical(parent)); } std::string format_message_comment(const std::string &comment, unsigned width) diff --git a/uml/sequence/cli_handle_options_sequence.yml b/uml/sequence/cli_handle_options_sequence.yml index 84b54bdf..0f326f36 100644 --- a/uml/sequence/cli_handle_options_sequence.yml +++ b/uml/sequence/cli_handle_options_sequence.yml @@ -10,6 +10,7 @@ glob: include: namespaces: - clanguml + - YAML exclude: elements: - r: "clanguml::config::option.*" diff --git a/uml/sequence/load_config_sequence.yml b/uml/sequence/load_config_sequence.yml index 78036a50..5ae1cb19 100644 --- a/uml/sequence/load_config_sequence.yml +++ b/uml/sequence/load_config_sequence.yml @@ -8,6 +8,7 @@ glob: include: namespaces: - clanguml + - YAML exclude: elements: - r: "clanguml::config::option.*"