Fixed handling of nested classes in relative namespaces

This commit is contained in:
Bartek Kryza
2022-09-10 19:28:19 +02:00
parent ae1735855a
commit f93cbe8ff2
5 changed files with 21 additions and 5 deletions

View File

@@ -70,7 +70,7 @@ public:
std::string full_name(bool relative = true) const override;
std::string full_name_no_ns() const;
std::string full_name_no_ns() const override;
bool is_abstract() const;

View File

@@ -176,7 +176,7 @@ bool translation_unit_visitor::VisitEnumDecl(clang::EnumDecl *enm)
assert(parent_class);
e.set_namespace(ns);
e.set_name(parent_class.value().full_name(true) + "##" +
e.set_name(parent_class.value().full_name_no_ns() + "##" +
enm->getNameAsString());
e.set_id(common::to_id(e.full_name(false)));
e.add_relationship({relationship_t::kContainment, *id_opt});
@@ -462,19 +462,19 @@ std::unique_ptr<class_> translation_unit_visitor::create_class_declaration(
const auto &[label, hint, access] =
anonymous_struct_relationships_[cls->getID()];
c.set_name(parent_class.value().full_name(true) + "##" +
c.set_name(parent_class.value().full_name_no_ns() + "##" +
fmt::format("({})", label));
parent_class.value().add_relationship(
{hint, common::to_id(c.full_name(false)), access, label});
}
else
c.set_name(parent_class.value().full_name(true) + "##" +
c.set_name(parent_class.value().full_name_no_ns() + "##" +
fmt::format(
"(anonymous_{})", std::to_string(cls->getID())));
}
else {
c.set_name(parent_class.value().full_name(true) + "##" +
c.set_name(parent_class.value().full_name_no_ns() + "##" +
cls->getNameAsString());
}

View File

@@ -60,6 +60,8 @@ public:
return name_and_ns();
}
virtual std::string full_name_no_ns() const { return name(); }
void set_using_namespaces(const namespace_ &un);
const namespace_ &using_namespace() const;

View File

@@ -35,5 +35,15 @@ public:
enum class CC { CC_1, CC_2 };
};
namespace detail {
class D {
public:
enum class AA { AA_1, AA_2, AA_3 };
class DD {
};
};
}
}
}

View File

@@ -58,6 +58,10 @@ TEST_CASE("t00004", "[test-case][class]")
REQUIRE_THAT(puml, IsInnerClass(_A("C<T>"), _A("C<T>::CC")));
REQUIRE_THAT(puml, IsInnerClass(_A("C<T>::AA"), _A("C<T>::AA::CCC")));
REQUIRE_THAT(puml, IsClass(_A("detail::D")));
REQUIRE_THAT(puml, IsClass(_A("detail::D::DD")));
REQUIRE_THAT(puml, IsEnum(_A("detail::D::AA")));
save_puml(
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
}