|
|
|
@@ -21,6 +21,7 @@
|
|
|
|
#include <cppast/cpp_class_template.hpp>
|
|
|
|
#include <cppast/cpp_class_template.hpp>
|
|
|
|
#include <cppast/cpp_entity_kind.hpp>
|
|
|
|
#include <cppast/cpp_entity_kind.hpp>
|
|
|
|
#include <cppast/cpp_enum.hpp>
|
|
|
|
#include <cppast/cpp_enum.hpp>
|
|
|
|
|
|
|
|
#include <cppast/cpp_friend.hpp>
|
|
|
|
#include <cppast/cpp_member_function.hpp>
|
|
|
|
#include <cppast/cpp_member_function.hpp>
|
|
|
|
#include <cppast/cpp_member_variable.hpp>
|
|
|
|
#include <cppast/cpp_member_variable.hpp>
|
|
|
|
#include <cppast/cpp_template.hpp>
|
|
|
|
#include <cppast/cpp_template.hpp>
|
|
|
|
@@ -67,12 +68,16 @@ scope_t cpp_access_specifier_to_scope(cppast::cpp_access_specifier_kind as)
|
|
|
|
|
|
|
|
|
|
|
|
void tu_visitor::operator()(const cppast::cpp_entity &file)
|
|
|
|
void tu_visitor::operator()(const cppast::cpp_entity &file)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
std::string prefix;
|
|
|
|
|
|
|
|
// visit each entity in the file
|
|
|
|
|
|
|
|
cppast::visit(file,
|
|
|
|
cppast::visit(file,
|
|
|
|
[&, this](const cppast::cpp_entity &e, cppast::visitor_info info) {
|
|
|
|
[&, this](const cppast::cpp_entity &e, cppast::visitor_info info) {
|
|
|
|
|
|
|
|
if (info.is_old_entity()) {
|
|
|
|
|
|
|
|
spdlog::debug(
|
|
|
|
|
|
|
|
"Entity {} already visited - skipping...", e.name());
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (e.kind() == cppast::cpp_entity_kind::class_t) {
|
|
|
|
if (e.kind() == cppast::cpp_entity_kind::class_t) {
|
|
|
|
spdlog::debug("{}'{}' - {}", prefix, cx::util::full_name(e),
|
|
|
|
spdlog::debug("'{}' - {}", cx::util::full_name(e),
|
|
|
|
cppast::to_string(e.kind()));
|
|
|
|
cppast::to_string(e.kind()));
|
|
|
|
|
|
|
|
|
|
|
|
auto &cls = static_cast<const cppast::cpp_class &>(e);
|
|
|
|
auto &cls = static_cast<const cppast::cpp_class &>(e);
|
|
|
|
@@ -81,7 +86,7 @@ void tu_visitor::operator()(const cppast::cpp_entity &file)
|
|
|
|
process_class_declaration(cls);
|
|
|
|
process_class_declaration(cls);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (e.kind() == cppast::cpp_entity_kind::enum_t) {
|
|
|
|
else if (e.kind() == cppast::cpp_entity_kind::enum_t) {
|
|
|
|
spdlog::debug("{}'{}' - {}", prefix, cx::util::full_name(e),
|
|
|
|
spdlog::debug("'{}' - {}", cx::util::full_name(e),
|
|
|
|
cppast::to_string(e.kind()));
|
|
|
|
cppast::to_string(e.kind()));
|
|
|
|
|
|
|
|
|
|
|
|
auto &enm = static_cast<const cppast::cpp_enum &>(e);
|
|
|
|
auto &enm = static_cast<const cppast::cpp_enum &>(e);
|
|
|
|
@@ -163,6 +168,28 @@ void tu_visitor::process_class_declaration(const cppast::cpp_class &cls)
|
|
|
|
auto &mc = static_cast<const cppast::cpp_destructor &>(child);
|
|
|
|
auto &mc = static_cast<const cppast::cpp_destructor &>(child);
|
|
|
|
process_destructor(mc, c, last_access_specifier);
|
|
|
|
process_destructor(mc, c, last_access_specifier);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (child.kind() == cppast::cpp_entity_kind::friend_t) {
|
|
|
|
|
|
|
|
auto &fr = static_cast<const cppast::cpp_friend &>(child);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
spdlog::debug("Found friend declaration: {}, {}",
|
|
|
|
|
|
|
|
child.name(),
|
|
|
|
|
|
|
|
child.scope_name() ? child.scope_name().value().name()
|
|
|
|
|
|
|
|
: "<no-scope>");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
process_friend(fr, c);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (cppast::is_friended(child)) {
|
|
|
|
|
|
|
|
auto &fr =
|
|
|
|
|
|
|
|
static_cast<const cppast::cpp_friend &>(child.parent().value());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
spdlog::debug("Found friend template: {}", child.name());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
process_friend(fr, c);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
spdlog::debug("Found some other class child: {} ({})",
|
|
|
|
|
|
|
|
child.name(), cppast::to_string(child.kind()));
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Process class bases
|
|
|
|
// Process class bases
|
|
|
|
@@ -170,6 +197,7 @@ void tu_visitor::process_class_declaration(const cppast::cpp_class &cls)
|
|
|
|
class_parent cp;
|
|
|
|
class_parent cp;
|
|
|
|
cp.name = clanguml::cx::util::fully_prefixed(base);
|
|
|
|
cp.name = clanguml::cx::util::fully_prefixed(base);
|
|
|
|
cp.is_virtual = base.is_virtual();
|
|
|
|
cp.is_virtual = base.is_virtual();
|
|
|
|
|
|
|
|
|
|
|
|
switch (base.access_specifier()) {
|
|
|
|
switch (base.access_specifier()) {
|
|
|
|
case cppast::cpp_access_specifier_kind::cpp_private:
|
|
|
|
case cppast::cpp_access_specifier_kind::cpp_private:
|
|
|
|
cp.access = class_parent::access_t::kPrivate;
|
|
|
|
cp.access = class_parent::access_t::kPrivate;
|
|
|
|
@@ -222,15 +250,22 @@ void tu_visitor::process_class_declaration(const cppast::cpp_class &cls)
|
|
|
|
class_relationship containment;
|
|
|
|
class_relationship containment;
|
|
|
|
containment.type = relationship_t::kContainment;
|
|
|
|
containment.type = relationship_t::kContainment;
|
|
|
|
containment.destination = cx::util::full_name(cur.value());
|
|
|
|
containment.destination = cx::util::full_name(cur.value());
|
|
|
|
c.relationships.emplace_back(std::move(containment));
|
|
|
|
c.add_relationship(std::move(containment));
|
|
|
|
|
|
|
|
|
|
|
|
spdlog::debug("Added relationship {} +-- {}",
|
|
|
|
spdlog::debug("Added relationship {} +-- {}",
|
|
|
|
c.full_name(ctx.config.using_namespace),
|
|
|
|
c.full_name(ctx.config.using_namespace),
|
|
|
|
containment.destination);
|
|
|
|
containment.destination);
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
cls.set_user_data(strdup(c.full_name(ctx.config.using_namespace).c_str()));
|
|
|
|
cls.set_user_data(strdup(c.full_name(ctx.config.using_namespace).c_str()));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
spdlog::debug("Setting user data for class {}, {}",
|
|
|
|
|
|
|
|
static_cast<const char *>(cls.user_data()),
|
|
|
|
|
|
|
|
fmt::ptr(reinterpret_cast<const void *>(&cls)));
|
|
|
|
|
|
|
|
|
|
|
|
c.usr = c.full_name(ctx.config.using_namespace);
|
|
|
|
c.usr = c.full_name(ctx.config.using_namespace);
|
|
|
|
|
|
|
|
|
|
|
|
ctx.d.add_class(std::move(c));
|
|
|
|
ctx.d.add_class(std::move(c));
|
|
|
|
@@ -260,7 +295,7 @@ void tu_visitor::process_field(const cppast::cpp_member_variable &mv, class_ &c,
|
|
|
|
.get());
|
|
|
|
.get());
|
|
|
|
|
|
|
|
|
|
|
|
spdlog::debug(
|
|
|
|
spdlog::debug(
|
|
|
|
"MAYBE BUILDING INSTANTIATION FOR: {}", primary_template_name);
|
|
|
|
"Maybe building instantiation for: {}", primary_template_name);
|
|
|
|
|
|
|
|
|
|
|
|
if (ctx.config.should_include(primary_template_name)) {
|
|
|
|
if (ctx.config.should_include(primary_template_name)) {
|
|
|
|
class_ tinst = build_template_instantiation(
|
|
|
|
class_ tinst = build_template_instantiation(
|
|
|
|
@@ -412,8 +447,7 @@ void tu_visitor::process_function_parameter(
|
|
|
|
switch (dv.value().kind()) {
|
|
|
|
switch (dv.value().kind()) {
|
|
|
|
case cppast::cpp_expression_kind::literal_t:
|
|
|
|
case cppast::cpp_expression_kind::literal_t:
|
|
|
|
mp.default_value =
|
|
|
|
mp.default_value =
|
|
|
|
static_cast<const cppast::cpp_literal_expression &>(
|
|
|
|
static_cast<const cppast::cpp_literal_expression &>(dv.value())
|
|
|
|
dv.value())
|
|
|
|
|
|
|
|
.value();
|
|
|
|
.value();
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case cppast::cpp_expression_kind::unexposed_t:
|
|
|
|
case cppast::cpp_expression_kind::unexposed_t:
|
|
|
|
@@ -466,6 +500,66 @@ void tu_visitor::process_template_template_parameter(
|
|
|
|
parent.templates.emplace_back(std::move(ct));
|
|
|
|
parent.templates.emplace_back(std::move(ct));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void tu_visitor::process_friend(const cppast::cpp_friend &f, class_ &parent)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
class_relationship r;
|
|
|
|
|
|
|
|
r.type = relationship_t::kFriendship;
|
|
|
|
|
|
|
|
r.label = "<<friend>>";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (f.type()) {
|
|
|
|
|
|
|
|
auto name = cppast::to_string(f.type().value());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!ctx.config.should_include(name))
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
spdlog::debug("Type friend declaration {}", name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r.destination = name;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (f.entity()) {
|
|
|
|
|
|
|
|
std::string name{};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (f.entity().value().kind() ==
|
|
|
|
|
|
|
|
cppast::cpp_entity_kind::class_template_t) {
|
|
|
|
|
|
|
|
const auto &ft = static_cast<const cppast::cpp_class_template &>(
|
|
|
|
|
|
|
|
f.entity().value());
|
|
|
|
|
|
|
|
const auto &class_ = ft.class_();
|
|
|
|
|
|
|
|
auto scope = cppast::cpp_scope_name(type_safe::ref(ft));
|
|
|
|
|
|
|
|
if (ft.class_().user_data() == nullptr) {
|
|
|
|
|
|
|
|
spdlog::warn(
|
|
|
|
|
|
|
|
"Empty user data in friend class template: {}, {}, {}",
|
|
|
|
|
|
|
|
ft.name(),
|
|
|
|
|
|
|
|
fmt::ptr(reinterpret_cast<const void *>(&ft.class_())),
|
|
|
|
|
|
|
|
scope.name());
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
spdlog::debug("Entity friend declaration {} ({})", name,
|
|
|
|
|
|
|
|
static_cast<const char *>(ft.user_data()));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
name = static_cast<const char *>(ft.user_data());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
spdlog::debug("Entity friend declaration {} ({},{})", name,
|
|
|
|
|
|
|
|
cppast::is_templated(f.entity().value()),
|
|
|
|
|
|
|
|
cppast::to_string(f.entity().value().kind()));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
name = cx::util::full_name(f.entity().value());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!ctx.config.should_include(name))
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
r.destination = name;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
spdlog::debug("Friend declaration points neither to type or entity.");
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
parent.add_relationship(std::move(r));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void tu_visitor::find_relationships(const cppast::cpp_type &t_,
|
|
|
|
void tu_visitor::find_relationships(const cppast::cpp_type &t_,
|
|
|
|
std::vector<std::pair<std::string, relationship_t>> &relationships,
|
|
|
|
std::vector<std::pair<std::string, relationship_t>> &relationships,
|
|
|
|
relationship_t relationship_hint)
|
|
|
|
relationship_t relationship_hint)
|
|
|
|
@@ -499,6 +593,9 @@ void tu_visitor::find_relationships(const cppast::cpp_type &t_,
|
|
|
|
|
|
|
|
|
|
|
|
const auto &args = tinst.arguments().value();
|
|
|
|
const auto &args = tinst.arguments().value();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Try to match common containers
|
|
|
|
|
|
|
|
// TODO: Refactor to a separate class with configurable
|
|
|
|
|
|
|
|
// container list
|
|
|
|
if (name.find("std::unique_ptr") == 0) {
|
|
|
|
if (name.find("std::unique_ptr") == 0) {
|
|
|
|
find_relationships(args[0u].type().value(), relationships,
|
|
|
|
find_relationships(args[0u].type().value(), relationships,
|
|
|
|
relationship_t::kComposition);
|
|
|
|
relationship_t::kComposition);
|
|
|
|
@@ -524,12 +621,10 @@ void tu_visitor::find_relationships(const cppast::cpp_type &t_,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (t_.kind() == cppast::cpp_type_kind::pointer_t) {
|
|
|
|
else if (t_.kind() == cppast::cpp_type_kind::pointer_t) {
|
|
|
|
auto &p = static_cast<const cppast::cpp_pointer_type &>(t_);
|
|
|
|
auto &p = static_cast<const cppast::cpp_pointer_type &>(t_);
|
|
|
|
spdlog::debug("TEST2");
|
|
|
|
|
|
|
|
find_relationships(
|
|
|
|
find_relationships(
|
|
|
|
p.pointee(), relationships, relationship_t::kAssociation);
|
|
|
|
p.pointee(), relationships, relationship_t::kAssociation);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (t_.kind() == cppast::cpp_type_kind::reference_t) {
|
|
|
|
else if (t_.kind() == cppast::cpp_type_kind::reference_t) {
|
|
|
|
spdlog::debug("TEST3");
|
|
|
|
|
|
|
|
auto &r = static_cast<const cppast::cpp_reference_type &>(t_);
|
|
|
|
auto &r = static_cast<const cppast::cpp_reference_type &>(t_);
|
|
|
|
auto rt = relationship_t::kAssociation;
|
|
|
|
auto rt = relationship_t::kAssociation;
|
|
|
|
if (r.reference_kind() == cppast::cpp_reference::cpp_ref_rvalue) {
|
|
|
|
if (r.reference_kind() == cppast::cpp_reference::cpp_ref_rvalue) {
|
|
|
|
@@ -542,10 +637,12 @@ void tu_visitor::find_relationships(const cppast::cpp_type &t_,
|
|
|
|
if (ctx.config.should_include(cppast::to_string(t_.canonical())))
|
|
|
|
if (ctx.config.should_include(cppast::to_string(t_.canonical())))
|
|
|
|
if (relationship_type != relationship_t::kNone)
|
|
|
|
if (relationship_type != relationship_t::kNone)
|
|
|
|
relationships.emplace_back(
|
|
|
|
relationships.emplace_back(
|
|
|
|
cppast::to_string(cppast::remove_cv(t_)), relationship_type);
|
|
|
|
cppast::to_string(cppast::remove_cv(t_)),
|
|
|
|
|
|
|
|
relationship_type);
|
|
|
|
else
|
|
|
|
else
|
|
|
|
relationships.emplace_back(
|
|
|
|
relationships.emplace_back(
|
|
|
|
cppast::to_string(cppast::remove_cv(t_)), relationship_t::kComposition);
|
|
|
|
cppast::to_string(cppast::remove_cv(t_)),
|
|
|
|
|
|
|
|
relationship_t::kComposition);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -784,8 +881,8 @@ enum CXChildVisitResult method_parameter_visitor(
|
|
|
|
.type_declaration()
|
|
|
|
.type_declaration()
|
|
|
|
.specialized_cursor_template()
|
|
|
|
.specialized_cursor_template()
|
|
|
|
.kind() != CXCursor_InvalidFile)) {
|
|
|
|
.kind() != CXCursor_InvalidFile)) {
|
|
|
|
class_ tinst = build_template_instantiation(
|
|
|
|
class_ tinst =
|
|
|
|
cursor, t.referenced());
|
|
|
|
build_template_instantiation(cursor, t.referenced());
|
|
|
|
|
|
|
|
|
|
|
|
// Add template instantiation relationship
|
|
|
|
// Add template instantiation relationship
|
|
|
|
class_relationship ri;
|
|
|
|
class_relationship ri;
|
|
|
|
@@ -1231,25 +1328,23 @@ enum CXChildVisitResult class_visitor(
|
|
|
|
is_struct = true;
|
|
|
|
is_struct = true;
|
|
|
|
case CXCursor_ClassDecl:
|
|
|
|
case CXCursor_ClassDecl:
|
|
|
|
case CXCursor_ClassTemplate:
|
|
|
|
case CXCursor_ClassTemplate:
|
|
|
|
ret = visit_if_cursor_valid(
|
|
|
|
ret =
|
|
|
|
cursor, [ctx, is_struct](cx::cursor cursor) {
|
|
|
|
visit_if_cursor_valid(cursor, [ctx, is_struct](cx::cursor cursor) {
|
|
|
|
return process_class_declaration(
|
|
|
|
return process_class_declaration(
|
|
|
|
cursor, is_struct, &ctx->element, ctx->ctx);
|
|
|
|
cursor, is_struct, &ctx->element, ctx->ctx);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case CXCursor_EnumDecl:
|
|
|
|
case CXCursor_EnumDecl:
|
|
|
|
ret = visit_if_cursor_valid(cursor, [ctx](cx::cursor cursor) {
|
|
|
|
ret = visit_if_cursor_valid(cursor, [ctx](cx::cursor cursor) {
|
|
|
|
return process_enum_declaration(
|
|
|
|
return process_enum_declaration(cursor, &ctx->element, ctx->ctx);
|
|
|
|
cursor, &ctx->element, ctx->ctx);
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case CXCursor_TemplateTypeParameter:
|
|
|
|
case CXCursor_TemplateTypeParameter:
|
|
|
|
ret = process_template_type_parameter(
|
|
|
|
ret = process_template_type_parameter(cursor, &ctx->element, ctx->ctx);
|
|
|
|
cursor, &ctx->element, ctx->ctx);
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case CXCursor_NonTypeTemplateParameter:
|
|
|
|
case CXCursor_NonTypeTemplateParameter:
|
|
|
|
ret = process_template_nontype_parameter(
|
|
|
|
ret =
|
|
|
|
cursor, &ctx->element, ctx->ctx);
|
|
|
|
process_template_nontype_parameter(cursor, &ctx->element, ctx->ctx);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case CXCursor_TemplateTemplateParameter:
|
|
|
|
case CXCursor_TemplateTemplateParameter:
|
|
|
|
ret = process_template_template_parameter(
|
|
|
|
ret = process_template_template_parameter(
|
|
|
|
@@ -1319,11 +1414,10 @@ enum CXChildVisitResult translation_unit_visitor(
|
|
|
|
case CXCursor_ClassTemplate:
|
|
|
|
case CXCursor_ClassTemplate:
|
|
|
|
[[fallthrough]];
|
|
|
|
[[fallthrough]];
|
|
|
|
case CXCursor_ClassDecl: {
|
|
|
|
case CXCursor_ClassDecl: {
|
|
|
|
spdlog::debug(
|
|
|
|
spdlog::debug("Found class or class template declaration: {}", cursor);
|
|
|
|
"Found class or class template declaration: {}", cursor);
|
|
|
|
|
|
|
|
scope = scope_t::kPublic;
|
|
|
|
scope = scope_t::kPublic;
|
|
|
|
ret = visit_if_cursor_valid(
|
|
|
|
ret =
|
|
|
|
cursor, [ctx, is_struct](cx::cursor cursor) {
|
|
|
|
visit_if_cursor_valid(cursor, [ctx, is_struct](cx::cursor cursor) {
|
|
|
|
return process_class_declaration(
|
|
|
|
return process_class_declaration(
|
|
|
|
cursor, is_struct, nullptr, ctx);
|
|
|
|
cursor, is_struct, nullptr, ctx);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
@@ -1331,8 +1425,8 @@ enum CXChildVisitResult translation_unit_visitor(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case CXCursor_EnumDecl: {
|
|
|
|
case CXCursor_EnumDecl: {
|
|
|
|
spdlog::debug("Found enum declaration: {}", cursor.spelling());
|
|
|
|
spdlog::debug("Found enum declaration: {}", cursor.spelling());
|
|
|
|
ret = visit_if_cursor_valid(
|
|
|
|
ret =
|
|
|
|
cursor, [ctx, is_struct](cx::cursor cursor) {
|
|
|
|
visit_if_cursor_valid(cursor, [ctx, is_struct](cx::cursor cursor) {
|
|
|
|
return process_enum_declaration(cursor, nullptr, ctx);
|
|
|
|
return process_enum_declaration(cursor, nullptr, ctx);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|