version 3.15.0 - improved pip_cmg and PICodeInfo storage

Important! changed API to access PICodeInfo storage
This commit is contained in:
2023-12-08 16:14:18 +03:00
parent 49a5ed6aa3
commit b8fc44714c
5 changed files with 130 additions and 55 deletions

View File

@@ -31,7 +31,7 @@ const char help_string[] = "-M (Metainfo)\n"
"Generate classes and structs info. It contains\n"
"names, subclass info, all methods and variables.\n"
"Place information:\n"
" * classes and structs - PICodeInfo::classesInfo\n"
" * classes and structs - PICODEINFO->classes()\n"
" * methods - ClassInfo::functions\n"
" * variables - ClassInfo::variables\n"
"\n"
@@ -39,7 +39,7 @@ const char help_string[] = "-M (Metainfo)\n"
"Generate enumeration descriptions.\n"
"Useful for GUI integrations, because\n"
"you can obtain enumerators value and name.\n"
" * enums - PICodeInfo::enumsInfo\n"
" * enums - PICODEINFO->enums()\n"
"\n"
"-S (Stream operators)\n"
"Generate store/restore operators with format\n"
@@ -144,10 +144,10 @@ void makeClassInfo(PIIOTextStream & ts, const PICodeParser::Entity * e) {
while (i.next())
ts << "\tci->meta[\"" << i.key() << "\"] = PIString::fromUTF8(\"" << i.value() << "\");\n";
}
ts << "\t(*classesInfo)[ci->name] = ci;\n";
ts << "\t(*PICODEINFO->classesInfo)[ci->name] = ci;\n";
if (e->parent_scope) {
ts << "\tpci = "
<< "classesInfo->value(\"" << e->parent_scope->name << "\", 0);\n";
<< "PICODEINFO->classesInfo->value(\"" << e->parent_scope->name << "\", 0);\n";
ts << "\tif (pci) pci->children_info << ci;\n";
}
for (const PICodeParser::Entity * p: e->parents)
@@ -270,10 +270,10 @@ void makeClassInfo(PIIOTextStream & ts, const PICodeParser::Entity * e) {
void makeEnumInfo(PIIOTextStream & ts, const PICodeParser::Enum * e) {
if (e->name.isEmpty()) {
ts << "\n\tei = (*enumsInfo)[\"\"];\n";
ts << "\n\tei = (*PICODEINFO->enumsInfo)[\"\"];\n";
} else {
ts << "\n\tei = new EnumInfo();\n";
ts << "\t(*enumsInfo)[\"" << e->name << "\"] = ei;\n";
ts << "\t(*PICODEINFO->enumsInfo)[\"" << e->name << "\"] = ei;\n";
ts << "\tei->name = \"" << e->name << "\";\n";
if (!e->meta.isEmpty()) {
auto i = e->meta.makeIterator();
@@ -512,14 +512,15 @@ bool writeModel(PICodeParser & parser, PICLI & cli, const PIString out, bool met
}
}
ts << "\n\n// Metainformation\n\n__ClassInfo_" << defname << "_Initializer__::__ClassInfo_" << defname << "_Initializer__() {\n";
ts << "\tif (_inited_) return;\n\t_inited_ = true;\n\n";
ts << "\tstatic __ClassInfo_" << defname << "_Initializer__::Content content;\n";
ts << "}\n\n";
ts << "__ClassInfo_" << defname << "_Initializer__::Content::Content() {\n";
if (meta) {
ts << "\tClassInfo * pci = new ClassInfo();\n";
ts << "\t(*classesInfo)[\"\"] = pci;\n";
ts << "\t(*PICODEINFO->classesInfo)[\"\"] = pci;\n";
}
if (enums && !parser.enums.isEmpty()) {
ts << "\tEnumInfo * ei;\n";
ts << "\t(*enumsInfo)[\"\"] = new EnumInfo();\n";
}
if (meta) {
ts << "\n\n// Classes\n";
@@ -538,12 +539,39 @@ bool writeModel(PICodeParser & parser, PICLI & cli, const PIString out, bool met
for (const PICodeParser::Entity * e: parser.entities) {
if (!needClassStream(e)) continue;
if (!e->has_name || e->name.startsWith("_PI")) continue;
ts << "\t(*accessValueFunctions)[\"" << e->name << "\"] = getterValue" << toCName(e->name) << ";\n";
ts << "\t(*accessTypeFunctions)[\"" << e->name << "\"] = getterType" << toCName(e->name) << ";\n";
ts << "\t(*PICODEINFO->accessValueFunctions)[\"" << e->name << "\"] = getterValue" << toCName(e->name) << ";\n";
ts << "\t(*PICODEINFO->accessTypeFunctions)[\"" << e->name << "\"] = getterType" << toCName(e->name) << ";\n";
}
}
ts << "}\n\n";
ts << "__ClassInfo_" << defname << "_Initializer__::Content::~Content() {\n";
if (meta) {
ts << "\n// Classes clean\n";
for (const PICodeParser::Entity * e: parser.entities) {
if (e->name.startsWith("_PI")) continue;
ts << "\tpiDeleteSafety((*PICODEINFO->classesInfo)[\"" << e->name << "\"]);\n";
ts << "\tPICODEINFO->classesInfo->remove(\"" << e->name << "\");\n";
}
}
if (enums) {
ts << "\n// Enums clean\n";
for (const PICodeParser::Enum & e: parser.enums) {
if (e.name.isNotEmpty()) {
ts << "\tpiDeleteSafety((*PICODEINFO->enumsInfo)[\"" << e.name << "\"]);\n";
ts << "\tPICODEINFO->enumsInfo->remove(\"" << e.name << "\");\n";
}
}
}
if (getters) {
ts << "\n// Getters clean\n";
for (const PICodeParser::Entity * e: parser.entities) {
if (!needClassStream(e)) continue;
if (!e->has_name || e->name.startsWith("_PI")) continue;
ts << "\tPICODEINFO->accessValueFunctions->remove(\"" << e->name << "\");\n";
ts << "\tPICODEINFO->accessTypeFunctions->remove(\"" << e->name << "\");\n";
}
}
ts << "}\n";
ts << "\n\nbool __ClassInfo_" << defname << "_Initializer__::_inited_ = false;\n";
}
f.close();
@@ -575,7 +603,14 @@ bool writeModel(PICodeParser & parser, PICLI & cli, const PIString out, bool met
}
if (meta || enums || getters) {
ts << "\n\n// Metainformation\n\nclass __ClassInfo_" << defname << "_Initializer__ {\n";
ts << "public:\n\t__ClassInfo_" << defname << "_Initializer__();\n\tstatic bool _inited_;\n};\n";
ts << "public:\n";
ts << "\t__ClassInfo_" << defname << "_Initializer__();\n";
ts << "\tclass Content {\n";
ts << "\tpublic:\n";
ts << "\t\tContent();\n";
ts << "\t\t~Content();\n";
ts << "\t};\n";
ts << "};\n";
ts << "\nstatic __ClassInfo_" << defname << "_Initializer__ __classinfo_" << defname.toLowerCase() << "_initializer__;\n";
}
ts << "\n\n#endif // " << defname << "\n";