aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmltyperegistrar
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2020-04-17 01:00:20 +0200
committerUlf Hermann <ulf.hermann@qt.io>2020-04-17 10:46:57 +0200
commite4707f8ae9dc198abd1460384d1573420f663a84 (patch)
tree6cae05ad48f31f13d05237f1af52e9d7dc394eb7 /src/qmltyperegistrar
parentc3fcbe73189b26e49ad8fa824b2b8e6b7db0a8f4 (diff)
parentb3eb349ddddec6967fcedfdbfc857b99f34e552a (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.cpp23
-rw-r--r--src/qmltyperegistrar/qmltypescreator.cpp37
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();
}