diff options
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/moc/generator.cpp | 36 | ||||
-rw-r--r-- | src/tools/moc/generator.h | 4 | ||||
-rw-r--r-- | src/tools/moc/moc.cpp | 8 | ||||
-rw-r--r-- | src/tools/moc/moc.h | 3 |
4 files changed, 34 insertions, 17 deletions
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index b688400cd4..0740a860ba 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -87,7 +87,7 @@ QT_FOR_EACH_STATIC_TYPE(RETURN_METATYPENAME_STRING) return 0; } -Generator::Generator(ClassDef *classDef, const QList<QByteArray> &metaTypes, const QSet<QByteArray> &knownQObjectClasses, FILE *outfile) +Generator::Generator(ClassDef *classDef, const QList<QByteArray> &metaTypes, const QHash<QByteArray, QByteArray> &knownQObjectClasses, FILE *outfile) : out(outfile), cdef(classDef), metaTypes(metaTypes), knownQObjectClasses(knownQObjectClasses) { if (cdef->superclassList.size()) @@ -438,15 +438,31 @@ void Generator::generateCode() QList<QByteArray> extraList; for (int i = 0; i < cdef->propertyList.count(); ++i) { const PropertyDef &p = cdef->propertyList.at(i); - if (!isBuiltinType(p.type) && !metaTypes.contains(p.type) && !p.type.contains('*') && - !p.type.contains('<') && !p.type.contains('>')) { - int s = p.type.lastIndexOf("::"); - if (s > 0) { - QByteArray scope = p.type.left(s); - if (scope != "Qt" && !qualifiedNameEquals(cdef->qualified, scope) && !extraList.contains(scope)) - extraList += scope; - } - } + if (isBuiltinType(p.type)) + continue; + + if (p.type.contains('*') || p.type.contains('<') || p.type.contains('>')) + continue; + + int s = p.type.lastIndexOf("::"); + if (s <= 0) + continue; + + QByteArray unqualifiedScope = p.type.left(s); + + // The scope may be a namespace for example, so it's only safe to include scopes that are known QObjects (QTBUG-2151) + QHash<QByteArray, QByteArray>::ConstIterator scopeIt = knownQObjectClasses.find(unqualifiedScope); + if (scopeIt == knownQObjectClasses.constEnd()) + continue; + const QByteArray &scope = *scopeIt; + + if (scope == "Qt") + continue; + if (qualifiedNameEquals(cdef->qualified, scope)) + continue; + + if (!extraList.contains(scope)) + extraList += scope; } // QTBUG-20639 - Accept non-local enums for QML signal/slot parameters. diff --git a/src/tools/moc/generator.h b/src/tools/moc/generator.h index 203c856b7c..725c4ffb12 100644 --- a/src/tools/moc/generator.h +++ b/src/tools/moc/generator.h @@ -52,7 +52,7 @@ class Generator ClassDef *cdef; QVector<uint> meta_data; public: - Generator(ClassDef *classDef, const QList<QByteArray> &metaTypes, const QSet<QByteArray> &knownQObjectClasses, FILE *outfile = 0); + Generator(ClassDef *classDef, const QList<QByteArray> &metaTypes, const QHash<QByteArray, QByteArray> &knownQObjectClasses, FILE *outfile = 0); void generateCode(); private: bool registerableMetaType(const QByteArray &propertyType); @@ -79,7 +79,7 @@ private: QList<QByteArray> strings; QByteArray purestSuperClass; QList<QByteArray> metaTypes; - QSet<QByteArray> knownQObjectClasses; + QHash<QByteArray, QByteArray> knownQObjectClasses; }; QT_END_NAMESPACE diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 8ff481d5b1..15b65d2045 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -621,8 +621,8 @@ void Moc::parse() if (inNamespace(&namespaceList.at(i))) def.qualified.prepend(namespaceList.at(i).name + "::"); - knownQObjectClasses.insert(def.classname); - knownQObjectClasses.insert(def.qualified); + knownQObjectClasses.insert(def.classname, def.qualified); + knownQObjectClasses.insert(def.qualified, def.qualified); continue; } default: break; @@ -795,8 +795,8 @@ void Moc::parse() checkProperties(&def); classList += def; - knownQObjectClasses.insert(def.classname); - knownQObjectClasses.insert(def.qualified); + knownQObjectClasses.insert(def.classname, def.qualified); + knownQObjectClasses.insert(def.qualified, def.qualified); } } } diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h index 2e22435653..4bbdde47dc 100644 --- a/src/tools/moc/moc.h +++ b/src/tools/moc/moc.h @@ -215,7 +215,8 @@ public: QList<ClassDef> classList; QMap<QByteArray, QByteArray> interface2IdMap; QList<QByteArray> metaTypes; - QSet<QByteArray> knownQObjectClasses; + // map from class name to fully qualified name + QHash<QByteArray, QByteArray> knownQObjectClasses; QMap<QString, QJsonArray> metaArgs; void parse(); |