diff --git a/libs/main/code/picodeparser.cpp b/libs/main/code/picodeparser.cpp index 545059e3..a7a5a071 100644 --- a/libs/main/code/picodeparser.cpp +++ b/libs/main/code/picodeparser.cpp @@ -577,28 +577,36 @@ bool PICodeParser::parseFileContent(PIString & fc, bool main) { PICodeParser::Entity * PICodeParser::parseClassDeclaration(const PIString & fc) { - static const PIString s_ss = PIStringAscii(" "); - static const PIString s_M = PIStringAscii("$M"); - static const PIString s_class = PIStringAscii("class"); - PIString cd = fc.trimmed().removeAll('\n').replaceAll('\t', ' ').replaceAll(s_ss, ' '), pn; + static const PIString s_ss = PIStringAscii(" "); + static const PIString s_M = PIStringAscii("$M"); + static const PIString s_class = PIStringAscii("class"); + static const PIString s_public = PIStringAscii("public"); + PIString cd = fc.trimmed().removeAll('\n').replaceAll('\t', ' ').replaceAll(s_ss, ' '), pn; MetaMap meta; int ind = cd.find(s_M); if (ind >= 0) { meta = tmp_meta.value(cd.takeMid(ind, 5)); cd.replaceAll(s_ss, ' '); } + PIString typename_ = cd.left(6).trim(); + bool is_class = typename_ == s_class; + ind = cd.find(':'); // piCout << "found class <****\n" << cd << "\n****>"; - ind = cd.find(':'); PIVector parents; if (ind > 0) { PIStringList pl = cd.takeMid(ind + 1).trim().split(','); cd.cutRight(1); Entity * pe = 0; for (const auto & p: pl) { - if (p.contains(' ')) - pn = p.mid(p.find(' ') + 1); - else + PIString access; + if (p.contains(' ')) { + access = p.left(p.find(' ')).trim(); + pn = p.mid(p.find(' ') + 1); + } else { pn = p; + } + bool is_public = access.isEmpty() ? !is_class : access == s_public; + if (!is_public) continue; pe = findEntityByName(pn); if (pe == 0) ; //{piCout << "Error: can`t find" << pn;} @@ -606,12 +614,10 @@ PICodeParser::Entity * PICodeParser::parseClassDeclaration(const PIString & fc) parents << pe; } } - PIString typename_ = cd.left(6).trim(); - bool is_class = typename_ == s_class; - Visibility vis = cur_def_vis; - cur_def_vis = (is_class ? Private : Public); - PIString cn = cd.mid(6).trim(); - bool is_anonymous = cn.isEmpty(); + Visibility vis = cur_def_vis; + cur_def_vis = (is_class ? Private : Public); + PIString cn = cd.mid(6).trim(); + bool is_anonymous = cn.isEmpty(); if (cn.isEmpty()) cn = PIStringAscii("'; // piCout << "found " << typename_ << cn; Entity * e = new Entity(); diff --git a/utils/code_model_generator/getter.cpp b/utils/code_model_generator/getter.cpp index 5f76f16c..c553e0f4 100644 --- a/utils/code_model_generator/getter.cpp +++ b/utils/code_model_generator/getter.cpp @@ -24,6 +24,10 @@ void writeGetterTypeMembers(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) { if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += "."; + for (const PICodeParser::Entity * p: e->parents) { + if (p->is_anonymous) continue; + writeGetterTypeMembers(rt, p, var_prefix); + } PISet used_id; for (const PICodeParser::Member & m: e->members) { if (m.is_type_ptr || !m.dims.isEmpty() || (m.visibility != PICodeParser::Public)) continue; @@ -43,6 +47,10 @@ void writeGetterTypeMembers(Runtime & rt, const PICodeParser::Entity * e, PIStri void writeGetterValueMembers(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) { if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += "."; + for (const PICodeParser::Entity * p: e->parents) { + if (p->is_anonymous) continue; + writeGetterValueMembers(rt, p, var_prefix); + } PISet used_id; for (const PICodeParser::Member & m: e->members) { if (m.is_type_ptr || !m.dims.isEmpty() || (m.visibility != PICodeParser::Public)) continue; @@ -65,6 +73,10 @@ void writeGetterValueMembers(Runtime & rt, const PICodeParser::Entity * e, PIStr void writeGetterOffsetMembers(Runtime & rt, const PICodeParser::Entity * e, PIString entity_name, PIString var_prefix) { if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += "."; + for (const PICodeParser::Entity * p: e->parents) { + if (p->is_anonymous) continue; + writeGetterOffsetMembers(rt, p, entity_name, var_prefix); + } PISet used_id; for (const PICodeParser::Member & m: e->members) { if (m.is_type_ptr || !m.dims.isEmpty() || m.isBitfield() || (m.visibility != PICodeParser::Public)) continue; @@ -117,5 +129,9 @@ bool needClassGetter(const PICodeParser::Entity * e) { if (m.attributes[PICodeParser::Static]) continue; return true; } + for (const PICodeParser::Entity * p: e->parents) { + if (p->is_anonymous) continue; + if (needClassGetter(p)) return true; + } return false; } diff --git a/utils/code_model_generator/json.cpp b/utils/code_model_generator/json.cpp index 16ae6b97..07f547e9 100644 --- a/utils/code_model_generator/json.cpp +++ b/utils/code_model_generator/json.cpp @@ -24,6 +24,10 @@ bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) { if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += "."; + for (const PICodeParser::Entity * p: e->parents) { + if (p->is_anonymous) continue; + writeClassJSONMembersOut(rt, p, var_prefix); + } PIVector ml; for (const PICodeParser::Member & m: e->members) { if (m.is_type_ptr || (m.visibility != PICodeParser::Public)) continue; @@ -57,16 +61,16 @@ bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e, PISt if (is_union) break; } if (is_union) return true; - /*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, PIString var_prefix) { if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += "."; + for (const PICodeParser::Entity * p: e->parents) { + if (p->is_anonymous) continue; + writeClassJSONMembersIn(rt, p, var_prefix); + } PIVector ml; for (const PICodeParser::Member & m: e->members) { if (m.is_type_ptr || (m.visibility != PICodeParser::Public)) continue; @@ -105,10 +109,6 @@ bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e, PIStr if (is_union) break; } if (is_union) return true; - /*for (const PICodeParser::Entity * ce: e->children) { - if (!ce->is_anonymous) continue; - if (!writeClassJSONMembersIn(rt, ce)) return false; - }*/ return true; } @@ -121,6 +121,10 @@ bool needClassJSON(const PICodeParser::Entity * e) { if (m.meta.value("id") == "-") continue; return true; } + for (const PICodeParser::Entity * p: e->parents) { + if (p->is_anonymous) continue; + if (needClassJSON(p)) return true; + } return false; } diff --git a/utils/code_model_generator/metainfo.cpp b/utils/code_model_generator/metainfo.cpp index c7664d7c..54b1efe4 100644 --- a/utils/code_model_generator/metainfo.cpp +++ b/utils/code_model_generator/metainfo.cpp @@ -22,6 +22,10 @@ void writeClassInfoMembers(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) { if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += "."; + for (const PICodeParser::Entity * p: e->parents) { + if (p->is_anonymous) continue; + writeClassInfoMembers(rt, p, var_prefix); + } for (const PICodeParser::Member & m: e->members) { auto type = findEntity(rt, m.type); if (type) { diff --git a/utils/code_model_generator/stream.cpp b/utils/code_model_generator/stream.cpp index f560d29e..b04e15cc 100644 --- a/utils/code_model_generator/stream.cpp +++ b/utils/code_model_generator/stream.cpp @@ -24,6 +24,10 @@ bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple, PIString var_prefix) { if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += "."; + for (const PICodeParser::Entity * p: e->parents) { + if (p->is_anonymous) continue; + if (!writeClassStreamMembersOut(rt, p, cnt, simple, var_prefix)) return false; + } PIVector ml; for (const PICodeParser::Member & m: e->members) { if (m.is_type_ptr || (m.visibility != PICodeParser::Public)) continue; @@ -83,6 +87,10 @@ bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, in bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple, PIString var_prefix) { if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += "."; + for (const PICodeParser::Entity * p: e->parents) { + if (p->is_anonymous) continue; + if (!writeClassStreamMembersIn(rt, p, cnt, simple, var_prefix)) return false; + } PIVector ml; for (const PICodeParser::Member & m: e->members) { if (m.is_type_ptr || (m.visibility != PICodeParser::Public)) continue; @@ -166,6 +174,10 @@ bool needClassStream(const PICodeParser::Entity * e) { if (m.meta.value("id") == "-") continue; return true; } + for (const PICodeParser::Entity * p: e->parents) { + if (p->is_anonymous) continue; + if (needClassStream(p)) return true; + } return false; }