Fixed nested template dependency relationship inference
This commit is contained in:
@@ -210,6 +210,8 @@ public:
|
|||||||
if (!m_config.should_include_relationship(name(r.type)))
|
if (!m_config.should_include_relationship(name(r.type)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
LOG_DBG("===== Processing relationship {}", to_string(r.type));
|
||||||
|
|
||||||
std::stringstream relstr;
|
std::stringstream relstr;
|
||||||
std::string destination;
|
std::string destination;
|
||||||
try {
|
try {
|
||||||
@@ -240,10 +242,8 @@ public:
|
|||||||
|
|
||||||
relstr << m_model.to_alias(
|
relstr << m_model.to_alias(
|
||||||
uns, ns_relative(uns, c.full_name(uns)))
|
uns, ns_relative(uns, c.full_name(uns)))
|
||||||
//uns, c.full_name(uns))
|
|
||||||
<< " " << puml_relation << " "
|
<< " " << puml_relation << " "
|
||||||
<< m_model.to_alias(uns, ns_relative(uns, destination));
|
<< m_model.to_alias(uns, ns_relative(uns, destination));
|
||||||
//<< m_model.to_alias(uns, destination);
|
|
||||||
|
|
||||||
if (!r.label.empty()) {
|
if (!r.label.empty()) {
|
||||||
relstr << " : " << to_string(r.scope) << r.label;
|
relstr << " : " << to_string(r.scope) << r.label;
|
||||||
|
|||||||
@@ -350,6 +350,8 @@ struct diagram {
|
|||||||
std::string to_alias(const std::vector<std::string> &using_namespaces,
|
std::string to_alias(const std::vector<std::string> &using_namespaces,
|
||||||
const std::string &full_name) const
|
const std::string &full_name) const
|
||||||
{
|
{
|
||||||
|
LOG_DBG("Looking for alias for {}", full_name);
|
||||||
|
|
||||||
for (const auto &c : classes) {
|
for (const auto &c : classes) {
|
||||||
if (c.full_name(using_namespaces) == full_name) {
|
if (c.full_name(using_namespaces) == full_name) {
|
||||||
return c.alias();
|
return c.alias();
|
||||||
|
|||||||
@@ -525,22 +525,12 @@ bool tu_visitor::process_field_with_template_instantiation(
|
|||||||
static_cast<const cppast::cpp_template_instantiation_type &>(
|
static_cast<const cppast::cpp_template_instantiation_type &>(
|
||||||
resolve_alias(template_instantiation_type));
|
resolve_alias(template_instantiation_type));
|
||||||
|
|
||||||
// if (unaliased.primary_template().get(ctx.entity_index).size()) {
|
|
||||||
// Here we need the name of the primary template with full namespace
|
|
||||||
// prefix to apply config inclusion filters
|
|
||||||
// auto primary_template_name = cx::util::full_name(ctx.namespace_,
|
|
||||||
// unaliased.primary_template().get(ctx.entity_index)[0].get());
|
|
||||||
|
|
||||||
// LOG_DBG("Maybe building instantiation for: {}, {}",
|
|
||||||
// primary_template_name, cppast::to_string(tr));
|
|
||||||
|
|
||||||
// if (ctx.config.should_include(primary_template_name)) {
|
|
||||||
class_ tinst = build_template_instantiation(unaliased);
|
class_ tinst = build_template_instantiation(unaliased);
|
||||||
|
|
||||||
// Infer the relationship of this field to the template
|
// Infer the relationship of this field to the template
|
||||||
// instantiation
|
// instantiation
|
||||||
class_relationship rr;
|
class_relationship rr;
|
||||||
rr.destination = tinst.usr;
|
rr.destination = tinst.full_name(ctx.config.using_namespace);
|
||||||
if (mv.type().kind() == cppast::cpp_type_kind::pointer_t ||
|
if (mv.type().kind() == cppast::cpp_type_kind::pointer_t ||
|
||||||
mv.type().kind() == cppast::cpp_type_kind::reference_t)
|
mv.type().kind() == cppast::cpp_type_kind::reference_t)
|
||||||
rr.type = relationship_t::kAssociation;
|
rr.type = relationship_t::kAssociation;
|
||||||
@@ -575,11 +565,6 @@ bool tu_visitor::process_field_with_template_instantiation(
|
|||||||
|
|
||||||
ctx.d.add_class(std::move(tinst));
|
ctx.d.add_class(std::move(tinst));
|
||||||
}
|
}
|
||||||
//}
|
|
||||||
//}
|
|
||||||
// else {
|
|
||||||
// LOG_DBG("Field template instantiation has no primary template?");
|
|
||||||
//}
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -1048,8 +1033,11 @@ bool tu_visitor::find_relationships(const cppast::cpp_type &t_,
|
|||||||
{
|
{
|
||||||
bool found{false};
|
bool found{false};
|
||||||
|
|
||||||
LOG_DBG("Finding relationships for type {}, {}", cppast::to_string(t_),
|
const auto fn =
|
||||||
t_.kind());
|
cx::util::full_name(cppast::remove_cv(t_), ctx.entity_index, false);
|
||||||
|
|
||||||
|
LOG_DBG("Finding relationships for type {}, {}, {}", cppast::to_string(t_),
|
||||||
|
t_.kind(), fn);
|
||||||
|
|
||||||
relationship_t relationship_type = relationship_hint;
|
relationship_t relationship_type = relationship_hint;
|
||||||
const auto &t = cppast::remove_cv(cx::util::unreferenced(t_));
|
const auto &t = cppast::remove_cv(cx::util::unreferenced(t_));
|
||||||
@@ -1091,8 +1079,6 @@ bool tu_visitor::find_relationships(const cppast::cpp_type &t_,
|
|||||||
cppast::to_string(t), relationship_t::kAggregation);
|
cppast::to_string(t), relationship_t::kAggregation);
|
||||||
|
|
||||||
// Check if t_ has an alias in the alias index
|
// Check if t_ has an alias in the alias index
|
||||||
const auto fn =
|
|
||||||
cx::util::full_name(cppast::remove_cv(t_), ctx.entity_index, false);
|
|
||||||
if (ctx.has_type_alias(fn)) {
|
if (ctx.has_type_alias(fn)) {
|
||||||
LOG_DBG("Find relationship in alias of {} | {}", fn,
|
LOG_DBG("Find relationship in alias of {} | {}", fn,
|
||||||
cppast::to_string(ctx.get_type_alias(fn).get()));
|
cppast::to_string(ctx.get_type_alias(fn).get()));
|
||||||
@@ -1135,6 +1121,29 @@ bool tu_visitor::find_relationships(const cppast::cpp_type &t_,
|
|||||||
found = find_relationships(args[0u].type().value(), relationships,
|
found = find_relationships(args[0u].type().value(), relationships,
|
||||||
relationship_t::kAggregation);
|
relationship_t::kAggregation);
|
||||||
}
|
}
|
||||||
|
else if (ctx.config.should_include(fn)) {
|
||||||
|
LOG_DBG("User defined template instantiation: {} | {}",
|
||||||
|
cppast::to_string(t_), cppast::to_string(t_.canonical()));
|
||||||
|
|
||||||
|
if (relationship_type != relationship_t::kNone)
|
||||||
|
relationships.emplace_back(
|
||||||
|
cppast::to_string(t), relationship_type);
|
||||||
|
else
|
||||||
|
relationships.emplace_back(
|
||||||
|
cppast::to_string(t), relationship_t::kAggregation);
|
||||||
|
|
||||||
|
// Check if t_ has an alias in the alias index
|
||||||
|
if (ctx.has_type_alias(fn)) {
|
||||||
|
LOG_DBG("Find relationship in alias of {} | {}", fn,
|
||||||
|
cppast::to_string(ctx.get_type_alias(fn).get()));
|
||||||
|
found = find_relationships(ctx.get_type_alias(fn).get(),
|
||||||
|
relationships, relationship_type);
|
||||||
|
if (found)
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
for (const auto &arg : args) {
|
for (const auto &arg : args) {
|
||||||
if (arg.type()) {
|
if (arg.type()) {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ struct D {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct R {
|
struct R {
|
||||||
std::shared_ptr<A<B<std::unique_ptr<C<D>>>>> abc;
|
A<B<std::unique_ptr<C<D>>>> abc;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace t00033
|
} // namespace t00033
|
||||||
|
|||||||
Reference in New Issue
Block a user