From d79da31749163e6880df07652cc3af5a40e8c548 Mon Sep 17 00:00:00 2001 From: ouczbs Date: Mon, 25 Nov 2024 19:53:52 +0800 Subject: [PATCH] refl support static member --- src/refl/ClassMeta.cs | 11 ++++++++++- src/refl/GenMetaImpl.cs | 6 ++++++ src/refl/template/meta_impl.liquid | 7 ++++--- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/refl/ClassMeta.cs b/src/refl/ClassMeta.cs index 0c4e8ea..90c2af7 100644 --- a/src/refl/ClassMeta.cs +++ b/src/refl/ClassMeta.cs @@ -22,11 +22,13 @@ namespace refl internal class FieldMeta { public List MemberList { get; set; } + public List StaticMemberList { get; set; } public List MethodList { get; set; } public List CtorList { get; set; } public FieldMeta() { MemberList = new List(); + StaticMemberList = new List(); MethodList = new List(); CtorList = new List(); } @@ -90,7 +92,14 @@ namespace refl { cls_meta.Fields.Add(key, new FieldMeta()); } - cls_meta.Fields[key].MemberList.Add(new FieldData(field.Name, value)); + if(field.StorageQualifier == CppStorageQualifier.Static) + { + cls_meta.Fields[key].StaticMemberList.Add(new FieldData(field.Name, value)); + } + else + { + cls_meta.Fields[key].MemberList.Add(new FieldData(field.Name, value)); + } } } foreach (var func in cppClass.Constructors) diff --git a/src/refl/GenMetaImpl.cs b/src/refl/GenMetaImpl.cs index 2a148bb..07703f8 100644 --- a/src/refl/GenMetaImpl.cs +++ b/src/refl/GenMetaImpl.cs @@ -27,6 +27,7 @@ namespace refl public string MetaName { get; set; } = ""; public int MetaType { get; set; } = 0; public int MemberCount { get; set; } = 0; + public int StaticMemberCount { get; set; } = 0; public int CtorCount { get; set; } = 0; public int LastAttrIndex { get; set; } = 0; public List FieldList = new List(); @@ -64,6 +65,10 @@ namespace refl data.FieldList.Add(new FieldMetaImplData(field, 1)); } data.LastAttrIndex = data.FieldList.Count; + foreach (var field in pair.Value.StaticMemberList) + { + data.FieldList.Add(new FieldMetaImplData(field, 1)); + } foreach (var field in pair.Value.CtorList) { data.FieldList.Add(new FieldMetaImplData(field, 2)); @@ -74,6 +79,7 @@ namespace refl data.FieldList.Add(new FieldMetaImplData(field, type)); } data.MemberCount = pair.Value.MemberList.Count; + data.StaticMemberCount = pair.Value.StaticMemberList.Count; data.CtorCount = pair.Value.CtorList.Count; data.MetaType = isMulty ? 1 : 0; if (isMulty && pair.Key.Equals("Meta")) diff --git a/src/refl/template/meta_impl.liquid b/src/refl/template/meta_impl.liquid index 15cdbd3..9592b90 100644 --- a/src/refl/template/meta_impl.liquid +++ b/src/refl/template/meta_impl.liquid @@ -2,6 +2,7 @@ namespace gen{ template<> struct MetaImpl<{{FullName}}, string_hash("{{MetaName}}")> : public refl::MetaHelp { using T = {{FullName}}; consteval static int MemberCount() { return {{MemberCount}}; }; + consteval static int StaticMemberCount() { return {{StaticMemberCount}}; }; consteval static int CtorCount() { return {{CtorCount}}; }; consteval static auto Fields(){ return std::make_tuple({% for field in FieldList limit:LastAttrIndex%}{%- if field.Type == 1 %}FProperty(&T::{{field.Name}},"{{field.Name}}"){% unless forloop.last %}, {% endunless %}{%- endif %}{% endfor %}); @@ -10,13 +11,13 @@ namespace gen{ return std::array{ {%- for field in FieldList %} {%- if field.Type == 1 %} - MemberField(&T::{{field.Name}}, FName("{{field.Name}}"), {{field.Meta}}), + MemberField(&T::{{field.Name}}, "{{field.Name}}", {{field.Meta}}), {%- elsif field.Type == 2 %} CtorField((T::{{field.Ref}})nullptr, {{field.Meta}}), {%- elsif field.Type == 3 %} - MethodField(&T::{{field.Name}}, FName("{{field.Name}}"), {{field.Meta}}), + MethodField(&T::{{field.Name}}, "{{field.Name}}", {{field.Meta}}), {%- else %} - MethodField((T::{{field.Ref}})&T::{{field.Name}}, FName("{{field.Name}}"), {{field.Meta}}), + MethodField((T::{{field.Ref}})&T::{{field.Name}}, "{{field.Name}}", {{field.Meta}}), {%- endif %} {%- endfor %} };