diff --git a/src/common/generators/plantuml/generator.h b/src/common/generators/plantuml/generator.h index c8556aa1..fac0f8d3 100644 --- a/src/common/generators/plantuml/generator.h +++ b/src/common/generators/plantuml/generator.h @@ -64,7 +64,8 @@ public: void generate_notes( std::ostream &ostr, const model::element &element) const; - void generate_link(std::ostream &ostr, const model::element &e) const; + template + void generate_link(std::ostream &ostr, const E &e) const; protected: const inja::json &context() const; @@ -114,9 +115,9 @@ inja::json generator::element_context(const E &e) const if (!e.file().empty()) { std::filesystem::path file{e.file()}; - std::string relative_path = std::filesystem::relative(file); + std::string relative_path = file.string(); - if (ctx.template contains("git")) + if (file.is_absolute() && ctx.template contains("git")) relative_path = std::filesystem::relative(file, ctx["git"]["toplevel"]); @@ -200,8 +201,8 @@ void generator::generate_notes( } template -void generator::generate_link( - std::ostream &ostr, const model::element &e) const +template +void generator::generate_link(std::ostream &ostr, const E &e) const { if (e.file().empty()) return; diff --git a/src/common/model/element.h b/src/common/model/element.h index 881460bd..4fda5918 100644 --- a/src/common/model/element.h +++ b/src/common/model/element.h @@ -73,6 +73,5 @@ public: private: namespace_ ns_; namespace_ using_namespace_; - // type_safe::optional location_; }; } diff --git a/src/common/model/source_file.h b/src/common/model/source_file.h index 99a2f1c7..47ad6629 100644 --- a/src/common/model/source_file.h +++ b/src/common/model/source_file.h @@ -20,6 +20,7 @@ #include "common/model/diagram_element.h" #include "common/model/nested_trait.h" #include "common/model/path.h" +#include "common/model/source_location.h" #include "common/model/stylable_element.h" #include "util/util.h" @@ -43,6 +44,7 @@ using filesystem_path = common::model::path; class source_file : public common::model::diagram_element, public common::model::stylable_element, + public source_location, public common::model::nested_trait { public: diff --git a/src/include_diagram/generators/plantuml/include_diagram_generator.cc b/src/include_diagram/generators/plantuml/include_diagram_generator.cc index cf696df9..91e7c3df 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/package_diagram/generators/plantuml/package_diagram_generator.cc + * src/include_diagram/generators/plantuml/include_diagram_generator.cc * * Copyright (c) 2021-2022 Bartek Kryza * @@ -57,14 +57,21 @@ void generator::generate(const source_file &f, std::ostream &ostr) const if (f.type() == common::model::source_file_t::kDirectory) { ostr << "folder " << f.name(); - ostr << " as " << f.alias() << " {\n"; + ostr << " as " << f.alias(); + ostr << " {\n"; for (const auto &file : f) { generate(dynamic_cast(*file), ostr); } ostr << "}" << '\n'; } else { - ostr << "file " << f.name() << " as " << f.alias() << '\n'; + ostr << "file " << f.name() << " as " << f.alias(); + + if (m_config.generate_links) { + generate_link(ostr, f); + } + + ostr << '\n'; } } diff --git a/src/include_diagram/visitor/translation_unit_visitor.cc b/src/include_diagram/visitor/translation_unit_visitor.cc index c0cc675f..f91cdd28 100644 --- a/src/include_diagram/visitor/translation_unit_visitor.cc +++ b/src/include_diagram/visitor/translation_unit_visitor.cc @@ -77,6 +77,7 @@ void translation_unit_visitor::process_file(const std::string &file, include_path = include_path.lexically_normal(); + std::string full_file_path = include_path; auto f_abs = std::make_unique(); if (include_path.is_absolute()) @@ -138,6 +139,10 @@ void translation_unit_visitor::process_file(const std::string &file, ctx.get_current_file().value().add_relationship( common::model::relationship{relationship_type, f->alias()}); + + auto fp = std::filesystem::absolute(file).lexically_normal(); + f->set_file(fp.string()); + f->set_line(0); } if (!ctx.diagram().get_element(f->path() | f->name()).has_value()) {