From 85e1efe5b3f4993ab2b53914c032ea01219f1876 Mon Sep 17 00:00:00 2001 From: maelstrom Date: Sat, 26 Apr 2025 01:53:00 +0200 Subject: [PATCH] feat(autogen): analyze prop flags --- autogen/src/analysis.cpp | 14 ++++++++++++++ autogen/src/analysis.h | 26 +++++++++++++++++++------ autogen/src/main.cpp | 41 ++++++++++++++++++++-------------------- 3 files changed, 55 insertions(+), 26 deletions(-) diff --git a/autogen/src/analysis.cpp b/autogen/src/analysis.cpp index 9423469..531aef0 100644 --- a/autogen/src/analysis.cpp +++ b/autogen/src/analysis.cpp @@ -143,6 +143,20 @@ void processField(CXCursor cur, ClassAnalysis* state) { anly.name = result["name"]; anly.fieldName = fieldName; + anly.category = result["category"]; + anly.onUpdateCallback = result["on_update"]; + + if (result.count("hidden")) + anly.flags = anly.flags | PropertyFlags::PropertyFlag_Hidden; + if (result.count("no_save")) + anly.flags = anly.flags | PropertyFlags::PropertyFlag_NoSave; + if (result.count("unit_float")) + anly.flags = anly.flags | PropertyFlags::PropertyFlag_UnitFloat; + if (result.count("readonly")) + anly.flags = anly.flags | PropertyFlags::PropertyFlag_Readonly; + + CXType type = clang_getCursorType(cur); + anly.backingFieldType = x_clang_toString(clang_getTypeSpelling(type)).c_str(); state->properties.push_back(anly); } diff --git a/autogen/src/analysis.h b/autogen/src/analysis.h index 5f08147..03cb720 100644 --- a/autogen/src/analysis.h +++ b/autogen/src/analysis.h @@ -4,23 +4,37 @@ #include #include -struct PropertyAnalysis { - std::string name; - std::string fieldName; - std::string backingFieldType; -}; - enum ClassFlags { ClassFlag_NotCreatable = 1<<0, ClassFlag_Service = 1<<1, ClassFlag_Hidden = 1<<2, }; +enum PropertyFlags { + PropertyFlag_Hidden = 1 << 0, + PropertyFlag_NoSave = 1 << 1, + PropertyFlag_UnitFloat = 1 << 2, + PropertyFlag_Readonly = 1 << 3, +}; + +struct PropertyAnalysis { + std::string name; + std::string fieldName; + std::string backingFieldType; + std::string onUpdateCallback; + std::string category; + PropertyFlags flags; +}; + // https://stackoverflow.com/a/1448478/16255372 inline ClassFlags operator|(ClassFlags a, ClassFlags b) { return static_cast(static_cast(a) | static_cast(b)); } +inline PropertyFlags operator|(PropertyFlags a, PropertyFlags b) { + return static_cast(static_cast(a) | static_cast(b)); +} + struct ClassAnalysis { std::string name; std::string baseClass; diff --git a/autogen/src/main.cpp b/autogen/src/main.cpp index 082a983..446d145 100644 --- a/autogen/src/main.cpp +++ b/autogen/src/main.cpp @@ -40,27 +40,28 @@ int main(int argc, char** argv) { analyzeClasses("../core/src/objects/part.h", argv[1], &state); - for (auto& [_, clazz] : state.classes) { - printf("Class: %s\n", clazz.name.c_str()); - if (clazz.baseClass != "") - printf("==> Base class: %s\n", clazz.baseClass.c_str()); - if (clazz.explorerIcon != "") - printf("==> Explorer icon: %s\n", clazz.explorerIcon.c_str()); - printf("==> Flags (%x): ", clazz.flags); - if (clazz.flags & ClassFlag_Service) - printf("INSTANCE_SERVICE "); - if (clazz.flags & ClassFlag_NotCreatable) - printf("INSTANCE_NOT_CREATABLE "); - if (clazz.flags & ClassFlag_Hidden) - printf("INSTANCE_HIDDEN"); - printf("\n"); - if (!clazz.properties.empty()) - printf("==> Properties:\n"); - for (auto prop : clazz.properties) { - printf("====> %s (%s)\n", prop.name.c_str(), prop.fieldName.c_str()); - } - } + // for (auto& [_, clazz] : state.classes) { + // printf("Class: %s\n", clazz.name.c_str()); + // if (clazz.baseClass != "") + // printf("==> Base class: %s\n", clazz.baseClass.c_str()); + // if (clazz.explorerIcon != "") + // printf("==> Explorer icon: %s\n", clazz.explorerIcon.c_str()); + // printf("==> Flags (%x): ", clazz.flags); + // if (clazz.flags & ClassFlag_Service) + // printf("INSTANCE_SERVICE "); + // if (clazz.flags & ClassFlag_NotCreatable) + // printf("INSTANCE_NOT_CREATABLE "); + // if (clazz.flags & ClassFlag_Hidden) + // printf("INSTANCE_HIDDEN"); + // printf("\n"); + + // if (!clazz.properties.empty()) + // printf("==> Properties:\n"); + // for (auto prop : clazz.properties) { + // printf("====> %s (%s) (%s)\n", prop.name.c_str(), prop.fieldName.c_str(), prop.backingFieldType.c_str()); + // } + // } // First-pass: Analyze type hierarchy // for (std::string path : headerFiles) {