diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2020-04-14 12:56:39 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-04-16 13:52:11 +0200 |
commit | f590202cb085e1463e61bd8b645e6f2cdb7d3fe8 (patch) | |
tree | b8885c44364a66d8b2098afe68f623c861e33a17 /src/qmltyperegistrar | |
parent | ac179e235ba0c01fff6dd5f4ad2cc9696fe78822 (diff) |
qmltyperegistrar: Correctly handle foreign and super classes
Previously, if there were multiple super classes, revisions were only
collected for the first one. Also, properties and enums declared in the
type itself were ignored when QML.Foreign was specified. Finally, we
would previously re-set resolvedClass and re-sort the revisions on each
super and attached type.
Change-Id: Iccb939cae66a5c4e2e5c312359e389463df80b4e
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qmltyperegistrar')
-rw-r--r-- | src/qmltyperegistrar/qmltypesclassdescription.cpp | 23 | ||||
-rw-r--r-- | src/qmltyperegistrar/qmltypescreator.cpp | 31 |
2 files changed, 41 insertions, 13 deletions
diff --git a/src/qmltyperegistrar/qmltypesclassdescription.cpp b/src/qmltyperegistrar/qmltypesclassdescription.cpp index 7756fda9e4..9aadd75acc 100644 --- a/src/qmltyperegistrar/qmltypesclassdescription.cpp +++ b/src/qmltyperegistrar/qmltypesclassdescription.cpp @@ -62,6 +62,7 @@ void QmlTypesClassDescription::collect(const QJsonObject *classDef, const QVector<QJsonObject> &foreign, CollectMode mode) { + const QJsonObject *origClassDef = classDef; // if we find QML.Foreign, classDef changes. if (file.isEmpty() && classDef->value(QLatin1String("registerable")).toBool()) file = classDef->value(QLatin1String("inputFile")).toString(); const auto classInfos = classDef->value(QLatin1String("classInfos")).toArray(); @@ -130,21 +131,33 @@ void QmlTypesClassDescription::collect(const QJsonObject *classDef, collectExtraVersions(classDef, QString::fromLatin1("signals"), revisions); } - const auto supers = classDef->value(QLatin1String("superClasses")).toArray(); - if (!supers.isEmpty()) { - const QJsonObject superObject = supers.first().toObject(); + auto supers = classDef->value(QLatin1String("superClasses")).toArray(); + if (classDef != origClassDef) { + const QJsonArray origSupers = origClassDef->value(QLatin1String("superClasses")).toArray(); + for (const QJsonValue &origSuper : origSupers) + supers.append(origSuper); + } + + for (const QJsonValue &superValue : qAsConst(supers)) { + const QJsonObject superObject = superValue.toObject(); if (superObject[QLatin1String("access")].toString() == QLatin1String("public")) { const QString superName = superObject[QLatin1String("name")].toString(); - if (mode == TopLevel && superClass.isEmpty()) - superClass = superName; if (const QJsonObject *other = findType(types, superName)) collect(other, types, foreign, mode == TopLevel ? SuperClass : AttachedType); else if (const QJsonObject *other = findType(foreign, superName)) collect(other, types, foreign, mode == TopLevel ? SuperClass : AttachedType); + else // If we cannot locate a type for it, there is no point in recording the superClass + continue; + + if (mode == TopLevel && superClass.isEmpty()) + superClass = superName; } } + if (mode != TopLevel) + return; + if (addedInRevision == -1) { revisions.append(0); addedInRevision = 0; diff --git a/src/qmltyperegistrar/qmltypescreator.cpp b/src/qmltyperegistrar/qmltypescreator.cpp index 1119f88282..e74550c6c2 100644 --- a/src/qmltyperegistrar/qmltypescreator.cpp +++ b/src/qmltyperegistrar/qmltypescreator.cpp @@ -224,6 +224,19 @@ void QmlTypesCreator::writeEnums(const QJsonArray &enums) } } +static QJsonArray members(const QJsonObject *classDef, const QJsonObject *origClassDef, const QString &key) +{ + QJsonArray classDefMembers = classDef->value(key).toArray(); + + if (classDef != origClassDef) { + const QJsonArray origClassDefMembers = origClassDef->value(key).toArray(); + for (const auto &member : origClassDefMembers) + classDefMembers.append(member); + } + + return classDefMembers; +} + void QmlTypesCreator::writeComponents() { const QLatin1String nameKey("name"); @@ -259,15 +272,15 @@ void QmlTypesCreator::writeComponents() writeClassProperties(collector); const QJsonObject *classDef = collector.resolvedClass; - writeEnums(classDef->value(enumsKey).toArray()); + writeEnums(members(classDef, &component, enumsKey)); QSet<QString> notifySignals; - writeProperties(classDef->value(propertiesKey).toArray(), notifySignals); + writeProperties(members(classDef, &component, propertiesKey), notifySignals); if (collector.isRootClass) { // Hide destroyed() signals - QJsonArray componentSignals = classDef->value(signalsKey).toArray(); + QJsonArray componentSignals = members(classDef, &component, signalsKey); for (auto it = componentSignals.begin(); it != componentSignals.end();) { if (it->toObject().value(nameKey).toString() == destroyedName) it = componentSignals.erase(it); @@ -277,8 +290,10 @@ void QmlTypesCreator::writeComponents() writeMethods(componentSignals, signalElement, notifySignals); // Hide deleteLater() methods - QJsonArray componentMethods = classDef->value(methodsKey).toArray() - + classDef->value(slotsKey).toArray(); + QJsonArray componentMethods = members(classDef, &component, methodsKey); + const QJsonArray componentSlots = members(classDef, &component, slotsKey); + for (const QJsonValue &componentSlot : componentSlots) + componentMethods.append(componentSlot); for (auto it = componentMethods.begin(); it != componentMethods.end();) { if (it->toObject().value(nameKey).toString() == deleteLaterName) it = componentMethods.erase(it); @@ -312,9 +327,9 @@ void QmlTypesCreator::writeComponents() writeMethods(componentMethods, methodElement); } else { - writeMethods(classDef->value(signalsKey).toArray(), signalElement, notifySignals); - writeMethods(classDef->value(slotsKey).toArray(), methodElement); - writeMethods(classDef->value(methodsKey).toArray(), methodElement); + writeMethods(members(classDef, &component, signalsKey), signalElement, notifySignals); + writeMethods(members(classDef, &component, slotsKey), methodElement); + writeMethods(members(classDef, &component, methodsKey), methodElement); } m_qml.writeEndObject(); } |