aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmltyperegistrar/qmltypescreator.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-04-14 12:56:39 +0200
committerUlf Hermann <ulf.hermann@qt.io>2020-04-16 13:52:11 +0200
commitf590202cb085e1463e61bd8b645e6f2cdb7d3fe8 (patch)
treeb8885c44364a66d8b2098afe68f623c861e33a17 /src/qmltyperegistrar/qmltypescreator.cpp
parentac179e235ba0c01fff6dd5f4ad2cc9696fe78822 (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/qmltypescreator.cpp')
-rw-r--r--src/qmltyperegistrar/qmltypescreator.cpp31
1 files changed, 23 insertions, 8 deletions
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();
}