finish codeparser improvements

pip_cmg now works with new nested entities approach
Getters now can access to bitfields
This commit is contained in:
2025-09-18 05:54:31 +03:00
parent af02684dc5
commit 7083b2c32b
15 changed files with 244 additions and 157 deletions

View File

@@ -22,7 +22,8 @@
#include "pitranslator.h"
bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e) {
bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) {
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
PIVector<PICodeParser::Member> ml;
for (const PICodeParser::Member & m: e->members) {
if (m.is_type_ptr || (m.visibility != PICodeParser::Public)) continue;
@@ -30,12 +31,19 @@ bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e) {
}
bool is_union = e->type == "union";
for (const PICodeParser::Member & m: ml) {
if (is_union && m.isBitfield()) continue;
if (m.isBitfield()) continue;
if (m.attributes[PICodeParser::Static]) continue;
if (m.meta.value("id") == "-") continue;
// if (m.meta.contains("id")) cnt = m.meta.value("id").toInt();
auto type = findEntity(rt, m.type);
if (type) {
if (type->is_anonymous) {
writeClassJSONMembersOut(rt, type, var_prefix + m.name);
continue;
}
}
if (m.dims.isEmpty()) {
rt.ts << "\tret[\"" << m.name << "\"] = piSerializeJSON(v." << m.name << ");\n";
rt.ts << "\tret[\"" << var_prefix << m.name << "\"] = piSerializeJSON(v." << var_prefix << m.name << ");\n";
} else {
PIString ptype = m.type.left(m.type.find('[')).trim();
PIString size = m.dims[0];
@@ -43,21 +51,22 @@ bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e) {
size += " * ";
size += m.dims[i];
}
rt.ts << "\tret[\"" << m.name << "\"] = piSerializeJSON(PIVector<" << ptype << " >((const " << ptype << " *)(v." << m.name
<< "), " << size << "));\n";
rt.ts << "\tret[\"" << var_prefix << m.name << "\"] = piSerializeJSON(PIVector<" << ptype << " >((const " << ptype << " *)(v."
<< var_prefix << m.name << "), " << size << "));\n";
}
if (is_union) break;
}
if (is_union) return true;
for (const PICodeParser::Entity * ce: e->children) {
if (ce->has_name) continue;
/*for (const PICodeParser::Entity * ce: e->children) {
if (!ce->is_anonymous) continue;
if (!writeClassJSONMembersOut(rt, ce)) return false;
}
}*/
return true;
}
bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e) {
bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) {
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
PIVector<PICodeParser::Member> ml;
for (const PICodeParser::Member & m: e->members) {
if (m.is_type_ptr || (m.visibility != PICodeParser::Public)) continue;
@@ -66,12 +75,19 @@ bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e) {
bool is_union = e->type == "union";
PISet<int> used_id;
for (const PICodeParser::Member & m: ml) {
if (is_union && m.isBitfield()) continue;
if (m.isBitfield()) continue;
if (m.attributes[PICodeParser::Static]) continue;
if (m.meta.value("id") == "-") continue;
auto type = findEntity(rt, m.type);
if (type) {
if (type->is_anonymous) {
writeClassJSONMembersIn(rt, type, var_prefix + m.name);
continue;
}
}
// if (m.meta.contains("id")) cnt = m.meta.value("id").toInt();
if (m.dims.isEmpty()) {
rt.ts << "\tpiDeserializeJSON(v." << m.name << ", js[\"" << m.name << "\"]);\n";
rt.ts << "\tpiDeserializeJSON(v." << var_prefix << m.name << ", js[\"" << var_prefix << m.name << "\"]);\n";
} else {
PIString ptype = m.type.left(m.type.find('[')).trim();
PIString size = m.dims[0];
@@ -80,19 +96,19 @@ bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e) {
size += m.dims[i];
}
rt.ts << "\t{\n\t\tPIVector<" << ptype << " > d;\n";
rt.ts << "\t\tpiDeserializeJSON(d, js[\"" << m.name << "\"]);\n";
rt.ts << "\t\tpiDeserializeJSON(d, js[\"" << var_prefix << m.name << "\"]);\n";
rt.ts << "\t\tint cnt = piMini(d.size_s(), " << size << ");\n";
rt.ts << "\t\tfor (int i = 0; i < cnt; ++i)\n";
rt.ts << "\t\t\t((" << ptype << " *)(v." << m.name << "))[i] = d[i];\n";
rt.ts << "\t\t\t((" << ptype << " *)(v." << var_prefix << m.name << "))[i] = d[i];\n";
rt.ts << "\t}\n";
}
if (is_union) break;
}
if (is_union) return true;
for (const PICodeParser::Entity * ce: e->children) {
if (ce->has_name) continue;
/*for (const PICodeParser::Entity * ce: e->children) {
if (!ce->is_anonymous) continue;
if (!writeClassJSONMembersIn(rt, ce)) return false;
}
}*/
return true;
}