feat(autogen): analyze prop flags
This commit is contained in:
parent
10c78cd647
commit
85e1efe5b3
3 changed files with 55 additions and 26 deletions
|
@ -143,6 +143,20 @@ void processField(CXCursor cur, ClassAnalysis* state) {
|
||||||
|
|
||||||
anly.name = result["name"];
|
anly.name = result["name"];
|
||||||
anly.fieldName = fieldName;
|
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);
|
state->properties.push_back(anly);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,23 +4,37 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
struct PropertyAnalysis {
|
|
||||||
std::string name;
|
|
||||||
std::string fieldName;
|
|
||||||
std::string backingFieldType;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum ClassFlags {
|
enum ClassFlags {
|
||||||
ClassFlag_NotCreatable = 1<<0,
|
ClassFlag_NotCreatable = 1<<0,
|
||||||
ClassFlag_Service = 1<<1,
|
ClassFlag_Service = 1<<1,
|
||||||
ClassFlag_Hidden = 1<<2,
|
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
|
// https://stackoverflow.com/a/1448478/16255372
|
||||||
inline ClassFlags operator|(ClassFlags a, ClassFlags b) {
|
inline ClassFlags operator|(ClassFlags a, ClassFlags b) {
|
||||||
return static_cast<ClassFlags>(static_cast<int>(a) | static_cast<int>(b));
|
return static_cast<ClassFlags>(static_cast<int>(a) | static_cast<int>(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline PropertyFlags operator|(PropertyFlags a, PropertyFlags b) {
|
||||||
|
return static_cast<PropertyFlags>(static_cast<int>(a) | static_cast<int>(b));
|
||||||
|
}
|
||||||
|
|
||||||
struct ClassAnalysis {
|
struct ClassAnalysis {
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string baseClass;
|
std::string baseClass;
|
||||||
|
|
|
@ -40,27 +40,28 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
analyzeClasses("../core/src/objects/part.h", argv[1], &state);
|
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())
|
// for (auto& [_, clazz] : state.classes) {
|
||||||
printf("==> Properties:\n");
|
// printf("Class: %s\n", clazz.name.c_str());
|
||||||
for (auto prop : clazz.properties) {
|
// if (clazz.baseClass != "")
|
||||||
printf("====> %s (%s)\n", prop.name.c_str(), prop.fieldName.c_str());
|
// 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
|
// First-pass: Analyze type hierarchy
|
||||||
// for (std::string path : headerFiles) {
|
// for (std::string path : headerFiles) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue