finish codeparser improvements
pip_cmg now works with new nested entities approach Getters now can access to bitfields
This commit is contained in:
@@ -120,15 +120,15 @@ struct PIP_EXPORT FunctionInfo {
|
||||
//! \~english Class or struct information
|
||||
//! \~russian Информация о классе или структуре
|
||||
struct PIP_EXPORT ClassInfo {
|
||||
ClassInfo() { has_name = true; }
|
||||
ClassInfo() { is_anonymous = false; }
|
||||
|
||||
//! \~english Custom PIMETA content
|
||||
//! \~russian Произвольное содержимое PIMETA
|
||||
MetaMap meta;
|
||||
|
||||
//! \~english Has name or not
|
||||
//! \~russian Имеет или нет имя
|
||||
bool has_name;
|
||||
//! \~english Anonymous or not
|
||||
//! \~russian Анонимный или нет
|
||||
bool is_anonymous;
|
||||
|
||||
//! \~english Type
|
||||
//! \~russian Тип
|
||||
@@ -294,61 +294,67 @@ private:
|
||||
NO_COPY_CLASS(__Storage__)
|
||||
};
|
||||
|
||||
class PIP_EXPORT __StorageAccess__ {
|
||||
public:
|
||||
//! \~english Getter for single storage of PICodeInfo::ClassInfo, access by name
|
||||
//! \~russian Доступ к единому хранилищу PICodeInfo::ClassInfo, доступ по имени
|
||||
static const PIMap<PIConstChars, PICodeInfo::ClassInfo *> & classes() { return *(__Storage__::instance()->classesInfo); }
|
||||
class PIP_EXPORT
|
||||
__StorageAccess__{public:
|
||||
//! \~english Getter for single storage of PICodeInfo::ClassInfo, access by name
|
||||
//! \~russian Доступ к единому хранилищу PICodeInfo::ClassInfo, доступ по имени
|
||||
static const PIMap<PIConstChars, PICodeInfo::ClassInfo *> & classes(){return *(__Storage__::instance()->classesInfo);
|
||||
} // namespace PICodeInfo
|
||||
|
||||
//! \~english Getter for single storage of PICodeInfo::EnumInfo, access by name
|
||||
//! \~russian Доступ к единому хранилищу хранилище PICodeInfo::EnumInfo, доступ по имени
|
||||
static const PIMap<PIConstChars, PICodeInfo::EnumInfo *> & enums() { return *(__Storage__::instance()->enumsInfo); }
|
||||
//! \~english Getter for single storage of PICodeInfo::EnumInfo, access by name
|
||||
//! \~russian Доступ к единому хранилищу хранилище PICodeInfo::EnumInfo, доступ по имени
|
||||
static const PIMap<PIConstChars, PICodeInfo::EnumInfo *> & enums() {
|
||||
return *(__Storage__::instance()->enumsInfo);
|
||||
}
|
||||
|
||||
static const PIMap<PIConstChars, PICodeInfo::AccessValueFunction> & accessValueFunctions() {
|
||||
return *(__Storage__::instance()->accessValueFunctions);
|
||||
}
|
||||
static const PIMap<PIConstChars, PICodeInfo::AccessValueFunction> & accessValueFunctions() {
|
||||
return *(__Storage__::instance()->accessValueFunctions);
|
||||
}
|
||||
|
||||
static const PIMap<PIConstChars, PICodeInfo::AccessTypeFunction> & accessTypeFunctions() {
|
||||
return *(__Storage__::instance()->accessTypeFunctions);
|
||||
}
|
||||
};
|
||||
static const PIMap<PIConstChars, PICodeInfo::AccessTypeFunction> & accessTypeFunctions() {
|
||||
return *(__Storage__::instance()->accessTypeFunctions);
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
#define PICODEINFO PICodeInfo::__StorageAccess__
|
||||
|
||||
|
||||
class PIP_EXPORT ClassInfoInterface {
|
||||
public:
|
||||
const PIMap<PIConstChars, PICodeInfo::ClassInfo *> * operator->() const DEPRECATEDM("use PICODEINFO::classes()") {
|
||||
return __Storage__::instance()->classesInfo;
|
||||
}
|
||||
};
|
||||
class PIP_EXPORT
|
||||
ClassInfoInterface{public: const PIMap<PIConstChars, PICodeInfo::ClassInfo *> * operator->() const DEPRECATEDM("use PICODEINFO::classes()"){
|
||||
return __Storage__::instance() -> classesInfo;
|
||||
}
|
||||
}
|
||||
;
|
||||
static ClassInfoInterface classesInfo;
|
||||
|
||||
|
||||
class PIP_EXPORT EnumsInfoInterface {
|
||||
public:
|
||||
const PIMap<PIConstChars, PICodeInfo::EnumInfo *> * operator->() const DEPRECATEDM("use PICODEINFO::enums()") {
|
||||
return __Storage__::instance()->enumsInfo;
|
||||
}
|
||||
};
|
||||
class PIP_EXPORT
|
||||
EnumsInfoInterface{public: const PIMap<PIConstChars, PICodeInfo::EnumInfo *> * operator->() const DEPRECATEDM("use PICODEINFO::enums()"){
|
||||
return __Storage__::instance() -> enumsInfo;
|
||||
}
|
||||
}
|
||||
;
|
||||
static EnumsInfoInterface enumsInfo;
|
||||
|
||||
|
||||
class PIP_EXPORT AccessValueFunctionInterface {
|
||||
public:
|
||||
const PIMap<PIConstChars, PICodeInfo::AccessValueFunction> * operator->() const DEPRECATEDM("use PICODEINFO::accessValueFunctions()") {
|
||||
return __Storage__::instance()->accessValueFunctions;
|
||||
}
|
||||
};
|
||||
class PIP_EXPORT AccessValueFunctionInterface{
|
||||
public: const PIMap<PIConstChars, PICodeInfo::AccessValueFunction> * operator->()
|
||||
const DEPRECATEDM("use PICODEINFO::accessValueFunctions()"){
|
||||
return __Storage__::instance() -> accessValueFunctions;
|
||||
}
|
||||
}
|
||||
;
|
||||
static AccessValueFunctionInterface accessValueFunctions;
|
||||
|
||||
|
||||
class PIP_EXPORT AccessTypeFunctionInterface {
|
||||
public:
|
||||
const PIMap<PIConstChars, PICodeInfo::AccessTypeFunction> * operator->() const DEPRECATEDM("use PICODEINFO::accessTypeFunctions()") {
|
||||
return __Storage__::instance()->accessTypeFunctions;
|
||||
}
|
||||
};
|
||||
class PIP_EXPORT AccessTypeFunctionInterface{
|
||||
public: const PIMap<PIConstChars, PICodeInfo::AccessTypeFunction> * operator->()
|
||||
const DEPRECATEDM("use PICODEINFO::accessTypeFunctions()"){
|
||||
return __Storage__::instance() -> accessTypeFunctions;
|
||||
}
|
||||
}
|
||||
;
|
||||
static AccessTypeFunctionInterface accessTypeFunctions;
|
||||
|
||||
|
||||
|
||||
@@ -94,10 +94,10 @@ void PICodeParser::parseFile(const PIString & file, bool follow_includes) {
|
||||
if (c->parent_scope)
|
||||
piCout << "parent" << c->parent_scope->name;
|
||||
piCout << "Functions:";
|
||||
for (const auto & m: c->functions)
|
||||
for (const auto & m: c->functions)
|
||||
piCout << m.type << m.name << m.meta;
|
||||
piCout << "Members:";
|
||||
for (const auto & m: c->members)
|
||||
for (const auto & m: c->members)
|
||||
piCout << m.type << m.name << m.meta;
|
||||
}
|
||||
piCout << "\n\nDefines:";
|
||||
@@ -110,7 +110,7 @@ void PICodeParser::parseFile(const PIString & file, bool follow_includes) {
|
||||
piCout << "\n\nEnums:";
|
||||
for (const auto & c: enums) {
|
||||
piCout << PIStringAscii("enum") << c.name << c.meta;
|
||||
for (const auto & e: c.members)
|
||||
for (const auto & e: c.members)
|
||||
piCout << " " << e.name << '=' << e.value << e.meta;
|
||||
}
|
||||
piCout << "\n\nTypedefs:";
|
||||
@@ -137,7 +137,7 @@ void PICodeParser::parseFiles(const PIStringList & files, bool follow_includes)
|
||||
piCout << PIStringAscii("enum") << c.name << c.members;
|
||||
piCout << "\n\nTypedefs:";
|
||||
for (const auto & c: typedefs)
|
||||
piCout << PIStringAscii("typedef") << c;*/
|
||||
piCout << PIStringAscii("typedef") << c;*/
|
||||
}
|
||||
|
||||
|
||||
@@ -330,7 +330,7 @@ void PICodeParser::clear() {
|
||||
<< "a2"
|
||||
<< "n2"
|
||||
<< "a3"
|
||||
<< "n3");
|
||||
<< "n3");
|
||||
}
|
||||
|
||||
|
||||
@@ -611,17 +611,17 @@ PICodeParser::Entity * PICodeParser::parseClassDeclaration(const PIString & fc)
|
||||
Visibility vis = cur_def_vis;
|
||||
cur_def_vis = (is_class ? Private : Public);
|
||||
PIString cn = cd.mid(6).trim();
|
||||
bool has_name = !cn.isEmpty();
|
||||
bool is_anonymous = cn.isEmpty();
|
||||
if (cn.isEmpty()) cn = PIStringAscii("<unnamed_") + PIString::fromNumber(anon_num++) + '>';
|
||||
// piCout << "found " << typename_ << cn;
|
||||
Entity * e = new Entity();
|
||||
e->meta = meta;
|
||||
e->name = cur_namespace + cn;
|
||||
e->type = typename_;
|
||||
e->has_name = has_name;
|
||||
e->parents = parents;
|
||||
e->visibility = vis;
|
||||
e->file = cur_file;
|
||||
Entity * e = new Entity();
|
||||
e->meta = meta;
|
||||
e->name = cur_namespace + cn;
|
||||
e->type = typename_;
|
||||
e->is_anonymous = is_anonymous;
|
||||
e->parents = parents;
|
||||
e->visibility = vis;
|
||||
e->file = cur_file;
|
||||
entities << e;
|
||||
return e;
|
||||
}
|
||||
@@ -651,7 +651,6 @@ PICodeParser::Entity * PICodeParser::parseClass(Entity * parent, PIString & fc,
|
||||
}
|
||||
// piCout << "found class <****\n" << fc << "\n****>";
|
||||
if (ce) {
|
||||
if (parent) parent->children << ce;
|
||||
ce->parent_scope = parent;
|
||||
}
|
||||
int ps = -1;
|
||||
@@ -693,7 +692,7 @@ PICodeParser::Entity * PICodeParser::parseClass(Entity * parent, PIString & fc,
|
||||
fc.takeSymbol();
|
||||
continue;
|
||||
}
|
||||
tmp = fc.takeLeft(fc.find('{'));
|
||||
tmp = fc.takeLeft(fc.find('{')).trim();
|
||||
stmp = fc.takeRange('{', '}');
|
||||
stmp = cw + ' ' + tmp + '{' + stmp + '}';
|
||||
auto new_entity = parseClass(ce, stmp, false);
|
||||
@@ -706,15 +705,13 @@ PICodeParser::Entity * PICodeParser::parseClass(Entity * parent, PIString & fc,
|
||||
if (fc.takeSymbol() == ";") break;
|
||||
} while (var.isNotEmpty());
|
||||
if (new_entity) {
|
||||
if (vars.isNotEmpty()) {
|
||||
ce->children.removeAll(new_entity);
|
||||
Member me;
|
||||
me.visibility = cur_def_vis;
|
||||
me.type = new_entity->name;
|
||||
for (const auto & v: vars) {
|
||||
me.name = v;
|
||||
ce->members << me;
|
||||
}
|
||||
Member me;
|
||||
me.visibility = cur_def_vis;
|
||||
me.type = new_entity->name;
|
||||
if (tmp.isEmpty() && vars.isEmpty()) vars = {""};
|
||||
for (const auto & v: vars) {
|
||||
me.name = v;
|
||||
ce->members << me;
|
||||
}
|
||||
}
|
||||
// piCout << "!!! <" << vars;
|
||||
@@ -1261,7 +1258,7 @@ void PICodeParser::replaceMeta(PIString & dn) {
|
||||
PICodeParser::Entity * PICodeParser::findEntityByName(const PIString & en) {
|
||||
for (auto * e: entities)
|
||||
if (e->name == en) return e;
|
||||
return 0;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
struct PIP_EXPORT Entity {
|
||||
Entity() {
|
||||
visibility = Global;
|
||||
has_name = true;
|
||||
is_anonymous = false;
|
||||
size = 0;
|
||||
parent_scope = 0;
|
||||
}
|
||||
@@ -110,10 +110,9 @@ public:
|
||||
PIString file;
|
||||
Visibility visibility;
|
||||
int size;
|
||||
bool has_name;
|
||||
bool is_anonymous;
|
||||
Entity * parent_scope;
|
||||
PIVector<Entity *> parents;
|
||||
PIVector<Entity *> children;
|
||||
PIVector<Member> functions;
|
||||
PIVector<Member> members;
|
||||
PIVector<Typedef> typedefs;
|
||||
|
||||
@@ -225,17 +225,20 @@ bool PIVariant::operator==(const PIVariant & v) const {
|
||||
PIVariant::Type PIVariant::typeFromName(const PIString & tname) {
|
||||
PIString s = tname.trimmed().toLowerCase().replaceAll(" ", "");
|
||||
if (s == "bool" || s == "boolean") return PIVariant::pivBool;
|
||||
if (s == "char" || s == "sbyte") return PIVariant::pivChar;
|
||||
if (s == "short" || s == "shortint" || s == "signedshort" || s == "signedshortint" || s == "sword") return PIVariant::pivShort;
|
||||
if (s == "int" || s == "signed" || s == "signedint") return PIVariant::pivInt;
|
||||
if (s == "char" || s == "sbyte" || s == "int8_t") return PIVariant::pivChar;
|
||||
if (s == "short" || s == "shortint" || s == "signedshort" || s == "signedshortint" || s == "sword" || s == "int16_t")
|
||||
return PIVariant::pivShort;
|
||||
if (s == "int" || s == "signed" || s == "signedint" || s == "int32_t") return PIVariant::pivInt;
|
||||
if (s == "long" || s == "longint" || s == "signedlong" || s == "signedlongint" || s == "sdword") return PIVariant::pivInt;
|
||||
if (s == "llong" || s == "longlong" || s == "longlongint" || s == "signedlonglong" || s == "signedlonglongint" || s == "sqword")
|
||||
if (s == "llong" || s == "longlong" || s == "longlongint" || s == "signedlonglong" || s == "signedlonglongint" || s == "sqword" ||
|
||||
s == "int64_t")
|
||||
return PIVariant::pivLLong;
|
||||
if (s == "uchar" || s == "byte") return PIVariant::pivUChar;
|
||||
if (s == "ushort" || s == "unsignedshort" || s == "unsignedshortint" || s == "word") return PIVariant::pivUShort;
|
||||
if (s == "uint" || s == "unsigned" || s == "unsignedint") return PIVariant::pivUInt;
|
||||
if (s == "uchar" || s == "byte" || s == "uint8_t") return PIVariant::pivUChar;
|
||||
if (s == "ushort" || s == "unsignedshort" || s == "unsignedshortint" || s == "word" || s == "uint16_t") return PIVariant::pivUShort;
|
||||
if (s == "uint" || s == "unsigned" || s == "unsignedint" || s == "uint32_t") return PIVariant::pivUInt;
|
||||
if (s == "ulong" || s == "unsignedlong" || s == "unsignedlongint" || s == "dword") return PIVariant::pivUInt;
|
||||
if (s == "ullong" || s == "unsignedlonglong" || s == "unsignedlonglongint" || s == "qword") return PIVariant::pivULLong;
|
||||
if (s == "ullong" || s == "unsignedlonglong" || s == "unsignedlonglongint" || s == "qword" || s == "uint64_t")
|
||||
return PIVariant::pivULLong;
|
||||
if (s == "float") return PIVariant::pivFloat;
|
||||
if (s == "double" || s == "real") return PIVariant::pivDouble;
|
||||
if (s == "ldouble" || s == "longdouble") return PIVariant::pivLDouble;
|
||||
|
||||
Reference in New Issue
Block a user