diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2020-04-17 01:00:20 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-04-17 10:46:57 +0200 |
commit | e4707f8ae9dc198abd1460384d1573420f663a84 (patch) | |
tree | 6cae05ad48f31f13d05237f1af52e9d7dc394eb7 /src/qmltyperegistrar | |
parent | c3fcbe73189b26e49ad8fa824b2b8e6b7db0a8f4 (diff) | |
parent | b3eb349ddddec6967fcedfdbfc857b99f34e552a (diff) |
Merge remote-tracking branch 'origin/5.15' into dev
Conflicts:
src/qmltyperegistrar/qmltypesclassdescription.cpp
src/quick/items/qquickrendertarget.h
Change-Id: I9e24d2252a35b8e74af89ad72af796df658167ca
Diffstat (limited to 'src/qmltyperegistrar')
-rw-r--r-- | src/qmltyperegistrar/qmltypesclassdescription.cpp | 23 | ||||
-rw-r--r-- | src/qmltyperegistrar/qmltypescreator.cpp | 37 |
2 files changed, 47 insertions, 13 deletions
diff --git a/src/qmltyperegistrar/qmltypesclassdescription.cpp b/src/qmltyperegistrar/qmltypesclassdescription.cpp index 778d057240..94f06a81ee 100644 --- a/src/qmltyperegistrar/qmltypesclassdescription.cpp +++ b/src/qmltyperegistrar/qmltypesclassdescription.cpp @@ -63,6 +63,7 @@ void QmlTypesClassDescription::collect(const QJsonObject *classDef, const QVector<QJsonObject> &foreign, CollectMode mode, QTypeRevision defaultRevision) { + 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(); @@ -132,22 +133,34 @@ 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; const CollectMode superMode = (mode == TopLevel) ? SuperClass : AttachedType; if (const QJsonObject *other = findType(types, superName)) collect(other, types, foreign, superMode, defaultRevision); else if (const QJsonObject *other = findType(foreign, superName)) collect(other, types, foreign, superMode, defaultRevision); + 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.isValid()) { revisions.append(defaultRevision); addedInRevision = defaultRevision; diff --git a/src/qmltyperegistrar/qmltypescreator.cpp b/src/qmltyperegistrar/qmltypescreator.cpp index d1378d809d..1bccbc36d8 100644 --- a/src/qmltyperegistrar/qmltypescreator.cpp +++ b/src/qmltyperegistrar/qmltypescreator.cpp @@ -214,11 +214,30 @@ void QmlTypesCreator::writeEnums(const QJsonArray &enums) m_qml.writeStartObject(QLatin1String("Enum")); m_qml.writeScriptBinding(QLatin1String("name"), enquote(obj.value(QLatin1String("name")).toString())); + auto alias = obj.find(QLatin1String("alias")); + if (alias != obj.end()) + m_qml.writeScriptBinding(alias.key(), enquote(alias->toString())); + auto isFlag = obj.find(QLatin1String("isFlag")); + if (isFlag != obj.end() && isFlag->toBool()) + m_qml.writeBooleanBinding(isFlag.key(), true); m_qml.writeArrayBinding(QLatin1String("values"), valueList); m_qml.writeEndObject(); } } +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"); @@ -254,15 +273,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); @@ -272,8 +291,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); @@ -307,9 +328,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(); } |