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(bool relative = true) const override;
std::string full_name_no_ns() const; std::string full_name_no_ns() const override;
bool is_abstract() const; bool is_abstract() const;

View File

@@ -176,7 +176,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(true) + "##" + e.set_name(parent_class.value().full_name_no_ns() + "##" +
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});
@@ -462,19 +462,19 @@ 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(true) + "##" + c.set_name(parent_class.value().full_name_no_ns() + "##" +
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(true) + "##" + c.set_name(parent_class.value().full_name_no_ns() + "##" +
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(true) + "##" + c.set_name(parent_class.value().full_name_no_ns() + "##" +
cls->getNameAsString()); cls->getNameAsString());
} }

View File

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

View File

@@ -35,5 +35,15 @@ public:
enum class CC { CC_1, CC_2 }; 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>"), _A("C<T>::CC")));
REQUIRE_THAT(puml, IsInnerClass(_A("C<T>::AA"), _A("C<T>::AA::CCC"))); 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( save_puml(
"./" + config.output_directory() + "/" + diagram->name + ".puml", puml); "./" + config.output_directory() + "/" + diagram->name + ".puml", puml);
} }