diff options
author | BogDan Vatra <bogdan@kdab.com> | 2016-08-19 15:44:42 +0300 |
---|---|---|
committer | BogDan Vatra <bogdan@kdab.com> | 2016-08-19 15:41:27 +0000 |
commit | 691dc71a011a28743e4cdbd716c192b21d63b68b (patch) | |
tree | b54d9513c31c9bfc4d0e29819dced0ffdd3d6768 /src/tools/moc/moc.cpp | |
parent | a1c782062c7f2391178060a7105ad9050b1032e1 (diff) |
Say hello to Q_NAMESPACE
Q_NAMESPACE is useful to add Q_ENUM_NS/Q_ENUMS, Q_FLAG_NS/Q_FLAGS and
Q_CLASSINFO to a namespace.
[ChangeLog] Added Q_NAMESPACE which can be used to add Q_ENUM_NS/
Q_ENUMS, Q_FLAG_NS/Q_FLAGS and Q_CLASSINFO to a namespace
Task-number: QTBUG-54981
Change-Id: Ic61b972794063e77134681fb347d6c4acddcdb44
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
Diffstat (limited to 'src/tools/moc/moc.cpp')
-rw-r--r-- | src/tools/moc/moc.cpp | 62 |
1 files changed, 56 insertions, 6 deletions
diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 87fb1318f9..444da4243b 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -554,14 +554,51 @@ void Moc::parse() until(SEMIC); } else if (!test(SEMIC)) { NamespaceDef def; - def.name = lexem(); + def.classname = lexem(); next(LBRACE); def.begin = index - 1; until(RBRACE); def.end = index; index = def.begin + 1; + while (inNamespace(&def) && hasNext()) { + switch (next()) { + case Q_NAMESPACE_TOKEN: + def.hasQNamespace = true; + break; + case Q_ENUMS_TOKEN: + case Q_ENUM_NS_TOKEN: + parseEnumOrFlag(&def, false); + break; + case Q_FLAGS_TOKEN: + case Q_FLAG_NS_TOKEN: + parseEnumOrFlag(&def, true); + break; + case Q_DECLARE_FLAGS_TOKEN: + parseFlag(&def); + break; + case Q_CLASSINFO_TOKEN: + parseClassInfo(&def); + break; + case ENUM: { + EnumDef enumDef; + if (parseEnum(&enumDef)) + def.enumList += enumDef; + } break; + case CLASS: + case STRUCT: { + ClassDef classdef; + if (!parseClassHead(&classdef)) + continue; + while (inClass(&classdef) && hasNext()) + next(); // consume all Q_XXXX macros from this class + } break; + default: break; + } + } namespaceList += def; index = rewind; + if (!def.hasQNamespace && (!def.classInfoList.isEmpty() || !def.enumDeclarations.isEmpty())) + error("Namespace declaration lacks Q_NAMESPACE macro."); } } break; @@ -618,7 +655,7 @@ void Moc::parse() for (int i = namespaceList.size() - 1; i >= 0; --i) if (inNamespace(&namespaceList.at(i))) - def.qualified.prepend(namespaceList.at(i).name + "::"); + def.qualified.prepend(namespaceList.at(i).classname + "::"); QHash<QByteArray, QByteArray> &classHash = def.hasQObject ? knownQObjectClasses : knownGadgets; classHash.insert(def.classname, def.qualified); @@ -634,7 +671,7 @@ void Moc::parse() FunctionDef::Access access = FunctionDef::Private; for (int i = namespaceList.size() - 1; i >= 0; --i) if (inNamespace(&namespaceList.at(i))) - def.qualified.prepend(namespaceList.at(i).name + "::"); + def.qualified.prepend(namespaceList.at(i).classname + "::"); while (inClass(&def) && hasNext()) { switch ((t = next())) { case PRIVATE: @@ -802,6 +839,19 @@ void Moc::parse() classHash.insert(def.qualified, def.qualified); } } + for (const auto &n : qAsConst(namespaceList)) { + if (!n.hasQNamespace) + continue; + ClassDef def; + static_cast<BaseDef &>(def) = static_cast<BaseDef>(n); + if (!def.qualified.isEmpty()) + def.qualified += "::"; + def.qualified += def.classname; + def.hasQGadget = true; + classList += def; + knownGadgets.insert(def.classname, def.qualified); + knownGadgets.insert(def.qualified, def.qualified); + } } static bool any_type_contains(const QVector<PropertyDef> &properties, const QByteArray &pattern) @@ -1248,7 +1298,7 @@ void Moc::parsePrivateProperty(ClassDef *def) def->propertyList += propDef; } -void Moc::parseEnumOrFlag(ClassDef *def, bool isFlag) +void Moc::parseEnumOrFlag(BaseDef *def, bool isFlag) { next(LPAREN); QByteArray identifier; @@ -1263,7 +1313,7 @@ void Moc::parseEnumOrFlag(ClassDef *def, bool isFlag) next(RPAREN); } -void Moc::parseFlag(ClassDef *def) +void Moc::parseFlag(BaseDef *def) { next(LPAREN); QByteArray flagName, enumName; @@ -1287,7 +1337,7 @@ void Moc::parseFlag(ClassDef *def) next(RPAREN); } -void Moc::parseClassInfo(ClassDef *def) +void Moc::parseClassInfo(BaseDef *def) { next(LPAREN); ClassInfoDef infoDef; |