Fixed link generation for template specializations
This commit is contained in:
@@ -33,7 +33,7 @@ generator::generator(diagram_config &config, diagram_model &model)
|
|||||||
void generator::generate_link(
|
void generator::generate_link(
|
||||||
std::ostream &ostr, const class_diagram::model::class_element &e) const
|
std::ostream &ostr, const class_diagram::model::class_element &e) const
|
||||||
{
|
{
|
||||||
if (e.file().empty())
|
if (e.file_relative().empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto context = element_context(e);
|
auto context = element_context(e);
|
||||||
|
|||||||
@@ -269,10 +269,7 @@ std::unique_ptr<class_> template_builder::build(const clang::NamedDecl *cls,
|
|||||||
template_instantiation.set_id(
|
template_instantiation.set_id(
|
||||||
common::to_id(template_instantiation_ptr->full_name(false)));
|
common::to_id(template_instantiation_ptr->full_name(false)));
|
||||||
|
|
||||||
visitor_.set_source_location(*template_decl, template_instantiation);
|
visitor_.set_source_location(*cls, template_instantiation);
|
||||||
|
|
||||||
LOG_DBG("**** {} -> {}", template_instantiation.full_name(false),
|
|
||||||
template_instantiation.file());
|
|
||||||
|
|
||||||
return template_instantiation_ptr;
|
return template_instantiation_ptr;
|
||||||
}
|
}
|
||||||
@@ -361,6 +358,8 @@ template_builder::build_from_class_template_specialization(
|
|||||||
template_instantiation_ptr->full_name(false), templated_decl_id);
|
template_instantiation_ptr->full_name(false), templated_decl_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
visitor_.set_source_location(*template_decl, template_instantiation);
|
||||||
|
|
||||||
return template_instantiation_ptr;
|
return template_instantiation_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1064,8 +1063,7 @@ template_builder::try_as_template_specialization_type(
|
|||||||
|
|
||||||
if (diagram().should_include(
|
if (diagram().should_include(
|
||||||
namespace_{nested_template_instantiation_full_name})) {
|
namespace_{nested_template_instantiation_full_name})) {
|
||||||
visitor_.set_source_location(
|
visitor_.set_source_location(*cls, *nested_template_instantiation);
|
||||||
*template_decl, *nested_template_instantiation);
|
|
||||||
visitor_.add_class(std::move(nested_template_instantiation));
|
visitor_.add_class(std::move(nested_template_instantiation));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -264,6 +264,8 @@ bool translation_unit_visitor::VisitTypeAliasTemplateDecl(
|
|||||||
|
|
||||||
LOG_DBG("Adding class {} with id {}", name, id);
|
LOG_DBG("Adding class {} with id {}", name, id);
|
||||||
|
|
||||||
|
set_source_location(*cls, *template_specialization_ptr);
|
||||||
|
|
||||||
add_class(std::move(template_specialization_ptr));
|
add_class(std::move(template_specialization_ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -217,17 +217,22 @@ inja::json generator<C, D>::element_context(const E &e) const
|
|||||||
|
|
||||||
if (!e.file().empty()) {
|
if (!e.file().empty()) {
|
||||||
std::filesystem::path file{e.file()};
|
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 _MSC_VER
|
||||||
if (file.is_absolute() && ctx.contains("git"))
|
if (file.is_absolute() && ctx.contains("git"))
|
||||||
#else
|
#else
|
||||||
if (file.is_absolute() && ctx.template contains("git"))
|
if (file.is_absolute() && ctx.template contains("git"))
|
||||||
#endif
|
#endif
|
||||||
relative_path =
|
git_relative_path =
|
||||||
std::filesystem::relative(file, ctx["git"]["toplevel"])
|
std::filesystem::relative(file, ctx["git"]["toplevel"])
|
||||||
.string();
|
.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"]["full_path"] = file.string();
|
||||||
ctx["element"]["source"]["name"] = file.filename().string();
|
ctx["element"]["source"]["name"] = file.filename().string();
|
||||||
ctx["element"]["source"]["line"] = e.line();
|
ctx["element"]["source"]["line"] = e.line();
|
||||||
|
|||||||
@@ -218,17 +218,22 @@ inja::json generator<C, D>::element_context(const E &e) const
|
|||||||
|
|
||||||
if (!e.file().empty()) {
|
if (!e.file().empty()) {
|
||||||
std::filesystem::path file{e.file()};
|
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 _MSC_VER
|
||||||
if (file.is_absolute() && ctx.contains("git"))
|
if (file.is_absolute() && ctx.contains("git"))
|
||||||
#else
|
#else
|
||||||
if (file.is_absolute() && ctx.template contains("git"))
|
if (file.is_absolute() && ctx.template contains("git"))
|
||||||
#endif
|
#endif
|
||||||
relative_path =
|
git_relative_path =
|
||||||
std::filesystem::relative(file, ctx["git"]["toplevel"])
|
std::filesystem::relative(file, ctx["git"]["toplevel"])
|
||||||
.string();
|
.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"]["full_path"] = file.string();
|
||||||
ctx["element"]["source"]["name"] = file.filename().string();
|
ctx["element"]["source"]["name"] = file.filename().string();
|
||||||
ctx["element"]["source"]["line"] = e.line();
|
ctx["element"]["source"]["line"] = e.line();
|
||||||
@@ -477,13 +482,12 @@ void generator<C, D>::generate_link(std::ostream &ostr, const E &e) const
|
|||||||
{
|
{
|
||||||
const auto &config = generators::generator<C, D>::config();
|
const auto &config = generators::generator<C, D>::config();
|
||||||
|
|
||||||
if (e.file().empty())
|
if (e.file_relative().empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ostr << " [[";
|
ostr << " [[";
|
||||||
try {
|
try {
|
||||||
if (!config.generate_links().link.empty()) {
|
if (!config.generate_links().link.empty()) {
|
||||||
|
|
||||||
ostr << env().render(std::string_view{config.generate_links().link},
|
ostr << env().render(std::string_view{config.generate_links().link},
|
||||||
element_context(e));
|
element_context(e));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,17 +143,18 @@ void translation_unit_visitor::set_source_location(
|
|||||||
|
|
||||||
file_path = fs::canonical(file_path);
|
file_path = fs::canonical(file_path);
|
||||||
|
|
||||||
if (!util::is_relative_to(file_path, relative_to_path_)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
file = file_path.string();
|
file = file_path.string();
|
||||||
|
|
||||||
element.set_file(file);
|
element.set_file(file);
|
||||||
|
|
||||||
if (util::is_relative_to(file_path, relative_to_path_)) {
|
if (util::is_relative_to(file_path, relative_to_path_)) {
|
||||||
element.set_file_relative(util::path_to_url(
|
element.set_file_relative(util::path_to_url(
|
||||||
fs::relative(element.file(), relative_to_path_).string()));
|
fs::relative(element.file(), relative_to_path_).string()));
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
element.set_file_relative("");
|
||||||
|
}
|
||||||
|
|
||||||
element.set_translation_unit(tu_path().string());
|
element.set_translation_unit(tu_path().string());
|
||||||
element.set_line(line);
|
element.set_line(line);
|
||||||
element.set_column(column);
|
element.set_column(column);
|
||||||
|
|||||||
@@ -239,6 +239,16 @@ translation_unit_visitor::include_visitor::process_source_file(
|
|||||||
source_file.set_file(std::filesystem::absolute(file.string())
|
source_file.set_file(std::filesystem::absolute(file.string())
|
||||||
.lexically_normal()
|
.lexically_normal()
|
||||||
.string());
|
.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);
|
source_file.set_line(0);
|
||||||
|
|
||||||
return source_file.id();
|
return source_file.id();
|
||||||
|
|||||||
@@ -302,16 +302,18 @@ void generator::generate_message_comment(
|
|||||||
if (comment_generated_from_note_decorators)
|
if (comment_generated_from_note_decorators)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!config().generate_message_comments() || !m.comment())
|
if (!config().generate_message_comments())
|
||||||
return;
|
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(
|
ostr << util::format_message_comment(
|
||||||
m.comment().value(), config().message_comment_width())
|
comment.value(), config().message_comment_width())
|
||||||
<< '\n';
|
<< '\n';
|
||||||
|
|
||||||
ostr << "end note" << '\n';
|
ostr << "end note" << '\n';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void generator::generate_participant(
|
void generator::generate_participant(
|
||||||
|
|||||||
@@ -449,7 +449,7 @@ void diagram::print() const
|
|||||||
from_participant.full_name(false), from_participant.id(),
|
from_participant.full_name(false), from_participant.id(),
|
||||||
to_participant.full_name(false), to_participant.id(),
|
to_participant.full_name(false), to_participant.id(),
|
||||||
message.message_name(), to_string(message.type()),
|
message.message_name(), to_string(message.type()),
|
||||||
message.comment() ? message.comment().value() : "None");
|
message.comment().value_or("None"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -410,7 +410,7 @@ bool is_relative_to(
|
|||||||
if (child.has_root_directory() != parent.has_root_directory())
|
if (child.has_root_directory() != parent.has_root_directory())
|
||||||
return false;
|
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)
|
std::string format_message_comment(const std::string &comment, unsigned width)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ glob:
|
|||||||
include:
|
include:
|
||||||
namespaces:
|
namespaces:
|
||||||
- clanguml
|
- clanguml
|
||||||
|
- YAML
|
||||||
exclude:
|
exclude:
|
||||||
elements:
|
elements:
|
||||||
- r: "clanguml::config::option.*"
|
- r: "clanguml::config::option.*"
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ glob:
|
|||||||
include:
|
include:
|
||||||
namespaces:
|
namespaces:
|
||||||
- clanguml
|
- clanguml
|
||||||
|
- YAML
|
||||||
exclude:
|
exclude:
|
||||||
elements:
|
elements:
|
||||||
- r: "clanguml::config::option.*"
|
- r: "clanguml::config::option.*"
|
||||||
|
|||||||
Reference in New Issue
Block a user