Added handling of static class fields
This commit is contained in:
@@ -137,6 +137,11 @@ public:
|
|||||||
return clang_CXXMethod_isVirtual(m_cursor);
|
return clang_CXXMethod_isVirtual(m_cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_static() const
|
||||||
|
{
|
||||||
|
return clang_Cursor_getStorageClass(m_cursor) == CX_SC_Static;
|
||||||
|
}
|
||||||
|
|
||||||
bool is_method_static() const { return clang_CXXMethod_isStatic(m_cursor); }
|
bool is_method_static() const { return clang_CXXMethod_isStatic(m_cursor); }
|
||||||
|
|
||||||
bool is_method_const() const { return clang_CXXMethod_isConst(m_cursor); }
|
bool is_method_const() const { return clang_CXXMethod_isConst(m_cursor); }
|
||||||
|
|||||||
@@ -135,6 +135,9 @@ public:
|
|||||||
// Process members
|
// Process members
|
||||||
//
|
//
|
||||||
for (const auto &m : c.members) {
|
for (const auto &m : c.members) {
|
||||||
|
if (m.is_static)
|
||||||
|
ostr << "{static} ";
|
||||||
|
|
||||||
ostr << to_string(m.scope) << m.type << " " << m.name << std::endl;
|
ostr << to_string(m.scope) << m.type << " " << m.name << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ struct class_element {
|
|||||||
|
|
||||||
struct class_member : public class_element {
|
struct class_member : public class_element {
|
||||||
bool is_relationship{false};
|
bool is_relationship{false};
|
||||||
|
bool is_static{false};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct method_argument {
|
struct method_argument {
|
||||||
|
|||||||
@@ -182,6 +182,7 @@ static enum CXChildVisitResult class_visitor(
|
|||||||
ret = CXChildVisit_Continue;
|
ret = CXChildVisit_Continue;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case CXCursor_VarDecl:
|
||||||
case CXCursor_FieldDecl: {
|
case CXCursor_FieldDecl: {
|
||||||
visit_if_cursor_valid(cursor, [c](cx::cursor cursor) {
|
visit_if_cursor_valid(cursor, [c](cx::cursor cursor) {
|
||||||
auto t = cursor.type();
|
auto t = cursor.type();
|
||||||
@@ -190,6 +191,7 @@ static enum CXChildVisitResult class_visitor(
|
|||||||
m.type = cursor.type().spelling();
|
m.type = cursor.type().spelling();
|
||||||
m.scope =
|
m.scope =
|
||||||
cx_access_specifier_to_scope(cursor.cxxaccess_specifier());
|
cx_access_specifier_to_scope(cursor.cxxaccess_specifier());
|
||||||
|
m.is_static = cursor.is_static();
|
||||||
|
|
||||||
spdlog::info("Adding member {} {}::{}", m.type, c->name,
|
spdlog::info("Adding member {} {}::{}", m.type, c->name,
|
||||||
cursor.spelling());
|
cursor.spelling());
|
||||||
@@ -215,11 +217,7 @@ static enum CXChildVisitResult class_visitor(
|
|||||||
t = t.pointee_type();
|
t = t.pointee_type();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/*else if(t.kind == CXType_Elaborated) {
|
else {
|
||||||
t = clang_Type_getNamedType(t);
|
|
||||||
continue;
|
|
||||||
}*/
|
|
||||||
else /*if (t.kind == CXType_Record) */ {
|
|
||||||
spdlog::error("UNKNOWN CXTYPE: {}", t.kind());
|
spdlog::error("UNKNOWN CXTYPE: {}", t.kind());
|
||||||
class_relationship r;
|
class_relationship r;
|
||||||
auto template_argument_count =
|
auto template_argument_count =
|
||||||
@@ -259,9 +257,6 @@ static enum CXChildVisitResult class_visitor(
|
|||||||
spdlog::debug(
|
spdlog::debug(
|
||||||
"Adding relationship to: {}", r.destination);
|
"Adding relationship to: {}", r.destination);
|
||||||
}
|
}
|
||||||
// else {
|
|
||||||
// spdlog::error("UNKNOWN CXTYPE: {}", t.kind);
|
|
||||||
//}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
#include <functional>
|
||||||
|
|
||||||
namespace clanguml {
|
namespace clanguml {
|
||||||
namespace t00003 {
|
namespace t00003 {
|
||||||
|
|
||||||
@@ -11,20 +13,28 @@ public:
|
|||||||
void basic_method() {}
|
void basic_method() {}
|
||||||
static int static_method() { return 0; }
|
static int static_method() { return 0; }
|
||||||
void const_method() const {}
|
void const_method() const {}
|
||||||
|
auto auto_method() { return 1; }
|
||||||
|
|
||||||
int public_member;
|
int public_member;
|
||||||
|
static int static_int;
|
||||||
|
static const int static_const_int = 1;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void protected_method() {}
|
void protected_method() {}
|
||||||
|
|
||||||
int protected_member;
|
int protected_member;
|
||||||
|
|
||||||
|
std::function<bool(const int)> compare = [this](const int v) {
|
||||||
|
return private_member > v;
|
||||||
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void private_method() {}
|
void private_method() {}
|
||||||
|
|
||||||
int private_member;
|
int private_member;
|
||||||
|
|
||||||
int a, b, c;
|
int a, b, c;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int A::static_int = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -204,6 +204,7 @@ TEST_CASE("Test t00003", "[unit-test]")
|
|||||||
REQUIRE_THAT(puml, Contains("-int a"));
|
REQUIRE_THAT(puml, Contains("-int a"));
|
||||||
REQUIRE_THAT(puml, Contains("-int b"));
|
REQUIRE_THAT(puml, Contains("-int b"));
|
||||||
REQUIRE_THAT(puml, Contains("-int c"));
|
REQUIRE_THAT(puml, Contains("-int c"));
|
||||||
|
REQUIRE_THAT(puml, Contains("{static} +int static_int"));
|
||||||
|
|
||||||
save_puml(
|
save_puml(
|
||||||
"./" + config.output_directory + "/" + diagram->name + ".puml", puml);
|
"./" + config.output_directory + "/" + diagram->name + ".puml", puml);
|
||||||
|
|||||||
Reference in New Issue
Block a user