aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmltyperegistrar
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
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')
-rw-r--r--src/qmltyperegistrar/qmltypesclassdescription.cpp23
-rw-r--r--src/qmltyperegistrar/qmltypescreator.cpp31
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();
}