Changed naming of elements nested in template declarations

This commit is contained in:
Bartek Kryza
2022-09-14 00:31:02 +02:00
parent 0d5091418e
commit 9a19cd50d7
3 changed files with 58 additions and 37 deletions

View File

@@ -164,19 +164,26 @@ bool diagram::add_class(std::unique_ptr<class_> &&c)
auto &cc = *c; auto &cc = *c;
auto id = cc.id(); auto id = cc.id();
if (!has_class(cc)) { try {
if (add_element(ns, std::move(c))) if (!has_class(cc)) {
classes_.push_back(std::ref(cc)); if (add_element(ns, std::move(c)))
classes_.push_back(std::ref(cc));
const auto &el = get_element<class_>(name_and_ns).value(); const auto &el = get_element<class_>(name_and_ns).value();
if ((el.name() != name) || !(el.get_relative_namespace() == ns)) if ((el.name() != name) || !(el.get_relative_namespace() == ns))
throw std::runtime_error( throw std::runtime_error(
"Invalid element stored in the diagram tree"); "Invalid element stored in the diagram tree");
LOG_DBG("Added class {} ({} - [{}])", base_name, full_name, id); LOG_DBG("Added class {} ({} - [{}])", base_name, full_name, id);
return true; return true;
}
}
catch (const std::runtime_error &e) {
LOG_WARN("Cannot add template specialization {} with id {} due to: {}",
name, id, e.what());
return false;
} }
LOG_DBG( LOG_DBG(

View File

@@ -178,8 +178,7 @@ bool translation_unit_visitor::VisitEnumDecl(clang::EnumDecl *enm)
assert(parent_class); assert(parent_class);
e.set_namespace(ns); e.set_namespace(ns);
e.set_name(parent_class.value().full_name_no_ns() + "##" + e.set_name(parent_class.value().name() + "##" + enm->getNameAsString());
enm->getNameAsString());
e.set_id(common::to_id(e.full_name(false))); e.set_id(common::to_id(e.full_name(false)));
e.add_relationship({relationship_t::kContainment, *id_opt}); e.add_relationship({relationship_t::kContainment, *id_opt});
e.nested(true); e.nested(true);
@@ -251,9 +250,10 @@ bool translation_unit_visitor::VisitClassTemplateSpecializationDecl(
.value()}); .value()});
if (diagram_.should_include(template_specialization)) { if (diagram_.should_include(template_specialization)) {
LOG_DBG("Adding class template specialization {} with id {}", const auto name = template_specialization.full_name(false);
template_specialization.full_name(false), const auto id = template_specialization.id();
template_specialization.id());
LOG_DBG("Adding class template specialization {} with id {}", name, id);
diagram_.add_class(std::move(template_specialization_ptr)); diagram_.add_class(std::move(template_specialization_ptr));
} }
@@ -289,9 +289,10 @@ bool translation_unit_visitor::VisitTypeAliasTemplateDecl(
return true; return true;
if (diagram_.should_include(*template_specialization_ptr)) { if (diagram_.should_include(*template_specialization_ptr)) {
LOG_DBG("Adding class {} with id {}", const auto name = template_specialization_ptr->full_name();
template_specialization_ptr->full_name(), const auto id = template_specialization_ptr->id();
template_specialization_ptr->id());
LOG_DBG("Adding class {} with id {}", name, id);
diagram_.add_class(std::move(template_specialization_ptr)); diagram_.add_class(std::move(template_specialization_ptr));
} }
@@ -339,7 +340,8 @@ bool translation_unit_visitor::VisitClassTemplateDecl(
} }
if (diagram_.should_include(*c_ptr)) { if (diagram_.should_include(*c_ptr)) {
LOG_DBG("Adding class template {} with id {}", c_ptr->full_name(), id); const auto name = c_ptr->full_name();
LOG_DBG("Adding class template {} with id {}", name, id);
diagram_.add_class(std::move(c_ptr)); diagram_.add_class(std::move(c_ptr));
} }
@@ -475,20 +477,20 @@ std::unique_ptr<class_> translation_unit_visitor::create_class_declaration(
const auto &[label, hint, access] = const auto &[label, hint, access] =
anonymous_struct_relationships_[cls->getID()]; anonymous_struct_relationships_[cls->getID()];
c.set_name(parent_class.value().full_name_no_ns() + "##" + c.set_name(parent_class.value().name() + "##" +
fmt::format("({})", label)); fmt::format("({})", label));
parent_class.value().add_relationship( parent_class.value().add_relationship(
{hint, common::to_id(c.full_name(false)), access, label}); {hint, common::to_id(c.full_name(false)), access, label});
} }
else else
c.set_name(parent_class.value().full_name_no_ns() + "##" + c.set_name(parent_class.value().name() + "##" +
fmt::format( fmt::format(
"(anonymous_{})", std::to_string(cls->getID()))); "(anonymous_{})", std::to_string(cls->getID())));
} }
else { else {
c.set_name(parent_class.value().full_name_no_ns() + "##" + c.set_name(
cls->getNameAsString()); parent_class.value().name() + "##" + cls->getNameAsString());
} }
c.set_id(common::to_id(c.full_name(false))); c.set_id(common::to_id(c.full_name(false)));
@@ -1518,22 +1520,34 @@ std::unique_ptr<class_> translation_unit_visitor::build_template_instantiation(
auto *template_decl{template_type.getTemplateName().getAsTemplateDecl()}; auto *template_decl{template_type.getTemplateName().getAsTemplateDecl()};
auto qualified_name = template_decl->getQualifiedNameAsString(); auto template_decl_qualified_name =
template_decl->getQualifiedNameAsString();
auto *class_template_decl{ auto *class_template_decl{
clang::dyn_cast<clang::ClassTemplateDecl>(template_decl)}; clang::dyn_cast<clang::ClassTemplateDecl>(template_decl)};
if (parent.has_value() && class_template_decl && if (class_template_decl && class_template_decl->getTemplatedDecl() &&
class_template_decl->getTemplatedDecl() &&
class_template_decl->getTemplatedDecl()->getParent() && class_template_decl->getTemplatedDecl()->getParent() &&
class_template_decl->getTemplatedDecl()->getParent()->isRecord()) { class_template_decl->getTemplatedDecl()->getParent()->isRecord()) {
template_instantiation.set_name(parent.value()->full_name_no_ns() + namespace_ ns{
"##" + template_decl->getNameAsString()); common::get_tag_namespace(*class_template_decl->getTemplatedDecl()
template_instantiation.set_namespace(parent.value()->get_namespace()); ->getParent()
->getOuterLexicalRecordContext())};
std::string ns_str = ns.to_string();
std::string name = template_decl->getQualifiedNameAsString();
if (!ns_str.empty()) {
name = name.substr(ns_str.size() + 2);
}
util::replace_all(name, "::", "##");
template_instantiation.set_name(name);
template_instantiation.set_namespace(ns);
} }
else { else {
namespace_ ns{qualified_name}; namespace_ ns{template_decl_qualified_name};
ns.pop_back(); ns.pop_back();
template_instantiation.set_name(template_decl->getNameAsString()); template_instantiation.set_name(template_decl->getNameAsString());
template_instantiation.set_namespace(ns); template_instantiation.set_namespace(ns);

View File

@@ -53,15 +53,15 @@ TEST_CASE("t00004", "[test-case][class]")
REQUIRE_THAT(puml, (IsMethod<Public, Const>("foo2"))); REQUIRE_THAT(puml, (IsMethod<Public, Const>("foo2")));
REQUIRE_THAT(puml, IsClassTemplate("C", "T")); REQUIRE_THAT(puml, IsClassTemplate("C", "T"));
REQUIRE_THAT(puml, IsInnerClass(_A("C<T>"), _A("C<T>::AA"))); REQUIRE_THAT(puml, IsInnerClass(_A("C<T>"), _A("C::AA")));
REQUIRE_THAT(puml, IsInnerClass(_A("C<T>::AA"), _A("C<T>::AA::AAA"))); REQUIRE_THAT(puml, IsInnerClass(_A("C::AA"), _A("C::AA::AAA")));
REQUIRE_THAT(puml, IsInnerClass(_A("C<T>"), _A("C<T>::CC"))); REQUIRE_THAT(puml, IsInnerClass(_A("C<T>"), _A("C::CC")));
REQUIRE_THAT(puml, IsInnerClass(_A("C<T>::AA"), _A("C<T>::AA::CCC"))); REQUIRE_THAT(puml, IsInnerClass(_A("C::AA"), _A("C::AA::CCC")));
REQUIRE_THAT(puml, IsInnerClass(_A("C<T>"), _A("C<T>::B<V>"))); REQUIRE_THAT(puml, IsInnerClass(_A("C<T>"), _A("C::B<V>")));
REQUIRE_THAT(puml, IsAggregation(_A("C<T>"), _A("C<T>::B<int>"), "+b_int")); REQUIRE_THAT(puml, IsAggregation(_A("C<T>"), _A("C::B<int>"), "+b_int"));
REQUIRE_THAT(puml, !IsInnerClass(_A("C<T>"), _A("C<T>::B"))); REQUIRE_THAT(puml, !IsInnerClass(_A("C<T>"), _A("C::B")));
REQUIRE_THAT(puml, IsInstantiation(_A("C<T>::B<V>"), _A("C<T>::B<int>"))); REQUIRE_THAT(puml, IsInstantiation(_A("C::B<V>"), _A("C::B<int>")));
REQUIRE_THAT(puml, IsClass(_A("detail::D"))); REQUIRE_THAT(puml, IsClass(_A("detail::D")));
REQUIRE_THAT(puml, IsClass(_A("detail::D::DD"))); REQUIRE_THAT(puml, IsClass(_A("detail::D::DD")));