Refactored class diagram class_ model

This commit is contained in:
Bartek Kryza
2021-09-26 23:38:29 +02:00
parent 1ae7a149e9
commit 80ee88aa4b
4 changed files with 135 additions and 53 deletions

View File

@@ -138,7 +138,7 @@ void generator::generate(const class_ &c, std::ostream &ostr) const
// //
// Process methods // Process methods
// //
for (const auto &m : c.methods) { for (const auto &m : c.methods()) {
if (!m_config.should_include(m.scope)) if (!m_config.should_include(m.scope))
continue; continue;
@@ -237,7 +237,7 @@ void generator::generate(const class_ &c, std::ostream &ostr) const
// //
// Process members // Process members
// //
for (const auto &m : c.members) { for (const auto &m : c.members()) {
if (!m_config.should_include(m.scope)) if (!m_config.should_include(m.scope))
continue; continue;
@@ -255,7 +255,7 @@ void generator::generate(const class_ &c, std::ostream &ostr) const
ostr << "}" << '\n'; ostr << "}" << '\n';
if (m_config.should_include_relationship("inheritance")) if (m_config.should_include_relationship("inheritance"))
for (const auto &b : c.bases) { for (const auto &b : c.parents()) {
std::stringstream relstr; std::stringstream relstr;
try { try {
relstr << m_model.to_alias(ns_relative(uns, b.name)) << " <|-- " relstr << m_model.to_alias(ns_relative(uns, b.name)) << " <|-- "
@@ -362,7 +362,7 @@ void generator::generate(std::ostream &ostr) const
if (m_config.should_include_entities("classes")) { if (m_config.should_include_entities("classes")) {
for (const auto &c : m_model.classes()) { for (const auto &c : m_model.classes()) {
if (!c.is_template_instantiation && if (!c.is_template_instantiation() &&
!m_config.should_include(c.name())) !m_config.should_include(c.name()))
continue; continue;
generate_alias(c, ostr); generate_alias(c, ostr);
@@ -377,7 +377,7 @@ void generator::generate(std::ostream &ostr) const
} }
for (const auto &c : m_model.classes()) { for (const auto &c : m_model.classes()) {
if (!c.is_template_instantiation && if (!c.is_template_instantiation() &&
!m_config.should_include(c.name())) !m_config.should_include(c.name()))
continue; continue;
generate(c, ostr); generate(c, ostr);

View File

@@ -184,6 +184,66 @@ bool operator==(const class_template &l, const class_template &r)
// //
// class_ // class_
// //
class_::class_(const std::vector<std::string> &using_namespaces)
: element{using_namespaces}
{
}
bool class_::is_struct() const { return is_struct_; }
void class_::set_is_struct(bool is_struct) { is_struct_ = is_struct; }
bool class_::is_template() const { return is_template_; }
void class_::set_is_template(bool is_template) { is_template_ = is_template; }
bool class_::is_template_instantiation() const
{
return is_template_instantiation_;
}
void class_::set_is_template_instantiation(bool is_template_instantiation)
{
is_template_instantiation_ = is_template_instantiation;
}
void class_::add_member(class_member &&member)
{
members_.emplace_back(std::move(member));
}
void class_::add_method(class_method &&method)
{
methods_.emplace_back(std::move(method));
}
void class_::add_parent(class_parent &&parent)
{
bases_.emplace_back(std::move(parent));
}
void class_::add_template(class_template &&tmplt)
{
templates_.emplace_back(std::move(tmplt));
}
const std::vector<class_member> &class_::members() const { return members_; }
const std::vector<class_method> &class_::methods() const { return methods_; }
const std::vector<class_parent> &class_::parents() const { return bases_; }
const std::vector<class_template> &class_::templates() const
{
return templates_;
}
void class_::set_base_template(const std::string &full_name)
{
base_template_full_name_ = full_name;
}
std::string class_::base_template() const { return base_template_full_name_; }
bool operator==(const class_ &l, const class_ &r) bool operator==(const class_ &l, const class_ &r)
{ {
@@ -193,7 +253,7 @@ bool operator==(const class_ &l, const class_ &r)
void class_::add_type_alias(type_alias &&ta) void class_::add_type_alias(type_alias &&ta)
{ {
LOG_DBG("Adding class alias: {} -> {}", ta.alias, ta.underlying_type); LOG_DBG("Adding class alias: {} -> {}", ta.alias, ta.underlying_type);
type_aliases[ta.alias] = std::move(ta); type_aliases_[ta.alias] = std::move(ta);
} }
std::string class_::full_name(bool relative) const std::string class_::full_name(bool relative) const
@@ -206,9 +266,9 @@ std::string class_::full_name(bool relative) const
else else
ostr << name(); ostr << name();
if (!templates.empty()) { if (!templates_.empty()) {
std::vector<std::string> tnames; std::vector<std::string> tnames;
std::transform(templates.cbegin(), templates.cend(), std::transform(templates_.cbegin(), templates_.cend(),
std::back_inserter(tnames), [this](const auto &tmplt) { std::back_inserter(tnames), [this](const auto &tmplt) {
std::vector<std::string> res; std::vector<std::string> res;
@@ -235,13 +295,17 @@ bool class_::is_abstract() const
{ {
// TODO check if all base abstract methods are overriden // TODO check if all base abstract methods are overriden
// with non-abstract methods // with non-abstract methods
return std::any_of(methods.begin(), methods.end(), return std::any_of(methods_.begin(), methods_.end(),
[](const auto &method) { return method.is_pure_virtual; }); [](const auto &method) { return method.is_pure_virtual; });
} }
// //
// enum_ // enum_
// //
enum_::enum_(const std::vector<std::string> &using_namespaces)
: element{using_namespaces}
{
}
bool operator==(const enum_ &l, const enum_ &r) { return l.name() == r.name(); } bool operator==(const enum_ &l, const enum_ &r) { return l.name() == r.name(); }
@@ -258,6 +322,10 @@ std::string enum_::full_name(bool relative) const
return ostr.str(); return ostr.str();
} }
std::vector<std::string> &enum_::constants() { return constants_; }
const std::vector<std::string> &enum_::constants() const { return constants_; }
// //
// diagram // diagram
// //

View File

@@ -172,21 +172,29 @@ struct type_alias {
class class_ : public element, public stylable_element { class class_ : public element, public stylable_element {
public: public:
class_(const std::vector<std::string> &using_namespaces) class_(const std::vector<std::string> &using_namespaces);
: element{using_namespaces}
{
}
bool is_struct{false}; bool is_struct() const;
bool is_template{false}; void set_is_struct(bool is_struct);
bool is_template_instantiation{false};
std::vector<class_member> members; bool is_template() const;
std::vector<class_method> methods; void set_is_template(bool is_template);
std::vector<class_parent> bases;
std::vector<std::string> inner_classes; bool is_template_instantiation() const;
std::vector<class_template> templates; void set_is_template_instantiation(bool is_template_instantiation);
std::string base_template_full_name;
std::map<std::string, type_alias> type_aliases; void add_member(class_member &&member);
void add_method(class_method &&method);
void add_parent(class_parent &&parent);
void add_template(class_template &&tmplt);
const std::vector<class_member> &members() const;
const std::vector<class_method> &methods() const;
const std::vector<class_parent> &parents() const;
const std::vector<class_template> &templates() const;
void set_base_template(const std::string &full_name);
std::string base_template() const;
friend bool operator==(const class_ &l, const class_ &r); friend bool operator==(const class_ &l, const class_ &r);
@@ -197,23 +205,30 @@ public:
bool is_abstract() const; bool is_abstract() const;
private: private:
bool is_struct_{false};
bool is_template_{false};
bool is_template_instantiation_{false};
std::vector<class_member> members_;
std::vector<class_method> methods_;
std::vector<class_parent> bases_;
std::vector<class_template> templates_;
std::string base_template_full_name_;
std::map<std::string, type_alias> type_aliases_;
std::string full_name_; std::string full_name_;
}; };
struct enum_ : public element, public stylable_element { struct enum_ : public element, public stylable_element {
public: public:
enum_(const std::vector<std::string> &using_namespaces) enum_(const std::vector<std::string> &using_namespaces);
: element{using_namespaces}
{
}
friend bool operator==(const enum_ &l, const enum_ &r); friend bool operator==(const enum_ &l, const enum_ &r);
std::string full_name(bool relative = true) const override; std::string full_name(bool relative = true) const override;
std::vector<std::string> &constants() { return constants_; } std::vector<std::string> &constants();
const std::vector<std::string> &constants() const { return constants_; } const std::vector<std::string> &constants() const;
private: private:
std::vector<std::string> constants_; std::vector<std::string> constants_;
@@ -223,7 +238,7 @@ class diagram {
public: public:
std::string name() const; std::string name() const;
void set_name(const std::string& name); void set_name(const std::string &name);
const std::vector<class_> classes() const; const std::vector<class_> classes() const;

View File

@@ -324,7 +324,7 @@ void tu_visitor::process_class_declaration(const cppast::cpp_class &cls,
type_safe::optional_ref<const cppast::cpp_template_specialization> tspec) type_safe::optional_ref<const cppast::cpp_template_specialization> tspec)
{ {
class_ c{ctx.config.using_namespace}; class_ c{ctx.config.using_namespace};
c.is_struct = cls.class_kind() == cppast::cpp_class_kind::struct_t; c.set_is_struct(cls.class_kind() == cppast::cpp_class_kind::struct_t);
c.set_name(cx::util::full_name(ctx.namespace_, cls)); c.set_name(cx::util::full_name(ctx.namespace_, cls));
if (cls.comment().has_value()) if (cls.comment().has_value())
@@ -350,7 +350,7 @@ void tu_visitor::process_class_declaration(const cppast::cpp_class &cls,
c.style = c.style_spec(); c.style = c.style_spec();
// Process class child entities // Process class child entities
if (c.is_struct) if (c.is_struct())
last_access_specifier = cppast::cpp_access_specifier_kind::cpp_public; last_access_specifier = cppast::cpp_access_specifier_kind::cpp_public;
for (auto &child : cls) { for (auto &child : cls) {
@@ -440,7 +440,7 @@ void tu_visitor::process_class_declaration(const cppast::cpp_class &cls,
LOG_DBG("Found base class {} for class {}", cp.name, c.name()); LOG_DBG("Found base class {} for class {}", cp.name, c.name());
c.bases.emplace_back(std::move(cp)); c.add_parent(std::move(cp));
} }
// Process class template arguments // Process class template arguments
@@ -500,7 +500,7 @@ void tu_visitor::process_class_declaration(const cppast::cpp_class &cls,
ct.default_value = ""; ct.default_value = "";
ct.is_variadic = false; ct.is_variadic = false;
ct.name = ""; ct.name = "";
c.templates.emplace_back(std::move(ct)); c.add_template(std::move(ct));
const auto &primary_template_ref = const auto &primary_template_ref =
static_cast<const cppast::cpp_class_template &>( static_cast<const cppast::cpp_class_template &>(
@@ -739,7 +739,7 @@ void tu_visitor::process_field(const cppast::cpp_member_variable &mv, class_ &c,
} }
} }
c.members.emplace_back(std::move(m)); c.add_member(std::move(m));
} }
void tu_visitor::process_anonymous_enum( void tu_visitor::process_anonymous_enum(
@@ -752,7 +752,7 @@ void tu_visitor::process_anonymous_enum(
m.type = "enum"; // TODO: Try to figure out real enum type m.type = "enum"; // TODO: Try to figure out real enum type
m.scope = detail::cpp_access_specifier_to_scope(as); m.scope = detail::cpp_access_specifier_to_scope(as);
m.is_static = false; m.is_static = false;
c.members.emplace_back(std::move(m)); c.add_member(std::move(m));
} }
} }
} }
@@ -772,7 +772,7 @@ void tu_visitor::process_static_field(const cppast::cpp_variable &mv, class_ &c,
if (m.skip()) if (m.skip())
return; return;
c.members.emplace_back(std::move(m)); c.add_member(std::move(m));
} }
void tu_visitor::process_method(const cppast::cpp_member_function &mf, void tu_visitor::process_method(const cppast::cpp_member_function &mf,
@@ -799,7 +799,7 @@ void tu_visitor::process_method(const cppast::cpp_member_function &mf,
LOG_DBG("Adding method: {}", m.name); LOG_DBG("Adding method: {}", m.name);
c.methods.emplace_back(std::move(m)); c.add_method(std::move(m));
} }
void tu_visitor::process_template_method( void tu_visitor::process_template_method(
@@ -839,7 +839,7 @@ void tu_visitor::process_template_method(
LOG_DBG("Adding template method: {}", m.name); LOG_DBG("Adding template method: {}", m.name);
c.methods.emplace_back(std::move(m)); c.add_method(std::move(m));
} }
void tu_visitor::process_static_method(const cppast::cpp_function &mf, void tu_visitor::process_static_method(const cppast::cpp_function &mf,
@@ -866,7 +866,7 @@ void tu_visitor::process_static_method(const cppast::cpp_function &mf,
LOG_DBG("Adding static method: {}", m.name); LOG_DBG("Adding static method: {}", m.name);
c.methods.emplace_back(std::move(m)); c.add_method(std::move(m));
} }
void tu_visitor::process_constructor(const cppast::cpp_constructor &mf, void tu_visitor::process_constructor(const cppast::cpp_constructor &mf,
@@ -891,7 +891,7 @@ void tu_visitor::process_constructor(const cppast::cpp_constructor &mf,
for (auto &param : mf.parameters()) for (auto &param : mf.parameters())
process_function_parameter(param, m, c); process_function_parameter(param, m, c);
c.methods.emplace_back(std::move(m)); c.add_method(std::move(m));
} }
void tu_visitor::process_destructor(const cppast::cpp_destructor &mf, class_ &c, void tu_visitor::process_destructor(const cppast::cpp_destructor &mf, class_ &c,
@@ -907,7 +907,7 @@ void tu_visitor::process_destructor(const cppast::cpp_destructor &mf, class_ &c,
m.is_static = false; m.is_static = false;
m.scope = detail::cpp_access_specifier_to_scope(as); m.scope = detail::cpp_access_specifier_to_scope(as);
c.methods.emplace_back(std::move(m)); c.add_method(std::move(m));
} }
void tu_visitor::process_function_parameter( void tu_visitor::process_function_parameter(
@@ -1069,7 +1069,7 @@ void tu_visitor::process_template_type_parameter(
ct.name = t.name(); ct.name = t.name();
if (ct.is_variadic) if (ct.is_variadic)
ct.name += "..."; ct.name += "...";
parent.templates.emplace_back(std::move(ct)); parent.add_template(std::move(ct));
} }
void tu_visitor::process_template_nontype_parameter( void tu_visitor::process_template_nontype_parameter(
@@ -1082,7 +1082,7 @@ void tu_visitor::process_template_nontype_parameter(
ct.is_variadic = t.is_variadic(); ct.is_variadic = t.is_variadic();
if (ct.is_variadic) if (ct.is_variadic)
ct.name += "..."; ct.name += "...";
parent.templates.emplace_back(std::move(ct)); parent.add_template(std::move(ct));
} }
void tu_visitor::process_template_template_parameter( void tu_visitor::process_template_template_parameter(
@@ -1092,7 +1092,7 @@ void tu_visitor::process_template_template_parameter(
ct.type = ""; ct.type = "";
ct.name = t.name() + "<>"; ct.name = t.name() + "<>";
ct.default_value = ""; ct.default_value = "";
parent.templates.emplace_back(std::move(ct)); parent.add_template(std::move(ct));
} }
void tu_visitor::process_friend(const cppast::cpp_friend &f, class_ &parent) void tu_visitor::process_friend(const cppast::cpp_friend &f, class_ &parent)
@@ -1381,10 +1381,9 @@ class_ tu_visitor::build_template_instantiation(
} }
if (primary_template_ref.user_data()) { if (primary_template_ref.user_data()) {
tinst.base_template_full_name = tinst.set_base_template(
static_cast<const char *>(primary_template_ref.user_data()); static_cast<const char *>(primary_template_ref.user_data()));
LOG_DBG("Primary template ref set to: {}", LOG_DBG("Primary template ref set to: {}", tinst.base_template());
tinst.base_template_full_name);
} }
else else
LOG_WARN("No user data for base template {}", LOG_WARN("No user data for base template {}",
@@ -1414,7 +1413,7 @@ class_ tu_visitor::build_template_instantiation(
tinst.set_name(ns + util::split(cppast::to_string(t), "<")[0]); tinst.set_name(ns + util::split(cppast::to_string(t), "<")[0]);
tinst.is_template_instantiation = true; tinst.set_is_template_instantiation(true);
if (tinst.full_name().substr(0, tinst.full_name().find('<')).find("::") == if (tinst.full_name().substr(0, tinst.full_name().find('<')).find("::") ==
std::string::npos) { std::string::npos) {
@@ -1545,13 +1544,13 @@ class_ tu_visitor::build_template_instantiation(
cp.access = class_parent::access_t::kPublic; cp.access = class_parent::access_t::kPublic;
cp.name = ct.type; cp.name = ct.type;
tinst.bases.emplace_back(std::move(cp)); tinst.add_parent(std::move(cp));
} }
} }
LOG_DBG("Adding template argument '{}'", ct.type); LOG_DBG("Adding template argument '{}'", ct.type);
tinst.templates.emplace_back(std::move(ct)); tinst.add_template(std::move(ct));
} }
// Add instantiation relationship to primary template of this // Add instantiation relationship to primary template of this
@@ -1568,7 +1567,7 @@ class_ tu_visitor::build_template_instantiation(
} }
else { else {
// Otherwise point to the base template // Otherwise point to the base template
r.destination = tinst.base_template_full_name; r.destination = tinst.base_template();
} }
r.type = relationship_t::kInstantiation; r.type = relationship_t::kInstantiation;
r.label = ""; r.label = "";