aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlmetatype.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-06-17 15:42:05 +0200
committerUlf Hermann <ulf.hermann@qt.io>2020-06-24 18:26:14 +0200
commit36df81b3bc6d721d5598d5163b0a9659de4a69ee (patch)
treed9032e08f4d27daa9e4b16a2c2e622ed2fa6951b /src/qml/qml/qqmlmetatype.cpp
parent6de0287d7c3aa4251fe6eb4f970d73ce11cf07fc (diff)
Discern between "auto" and versioned imports in qmldirs
You can now import the latest version, a specific version, or, "auto" which is the same version as the parent module. [ChangeLog][QtQml] You can now procedurally add module imports to modules, using qmlRegisterModuleImport(). However, actual import statements in qmldir files should be preferred wherever possible. Fixes: QTBUG-84899 Change-Id: I3b32dd8b07a19d31b6538b9a6bb436840862f345 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlmetatype.cpp')
-rw-r--r--src/qml/qml/qqmlmetatype.cpp47
1 files changed, 39 insertions, 8 deletions
diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp
index 78f1d984e5..77d3571a05 100644
--- a/src/qml/qml/qqmlmetatype.cpp
+++ b/src/qml/qml/qqmlmetatype.cpp
@@ -628,22 +628,53 @@ bool QQmlMetaType::protectModule(const QString &uri, QTypeRevision version, bool
return range.first != range.second;
}
-void QQmlMetaType::registerModuleImport(const QString &uri, QTypeRevision version, const QString &import)
+void QQmlMetaType::registerModuleImport(const QString &uri, QTypeRevision moduleVersion,
+ const QQmlDirParser::Import &import)
{
QQmlMetaTypeDataPtr data;
- QQmlTypeModule *module = getTypeModule(uri, version, data);
- Q_ASSERT(module);
- module->addImport(import);
+ data->moduleImports.insert(QQmlMetaTypeData::VersionedUri(uri, moduleVersion), import);
+}
+
+static bool operator==(const QQmlDirParser::Import &a, const QQmlDirParser::Import &b)
+{
+ return a.module == b.module && a.version == b.version && a.isAutoImport == b.isAutoImport;
}
-void QQmlMetaType::unregisterModuleImport(const QString &uri, QTypeRevision version, const QString &import)
+void QQmlMetaType::unregisterModuleImport(const QString &uri, QTypeRevision moduleVersion,
+ const QQmlDirParser::Import &import)
{
QQmlMetaTypeDataPtr data;
+ data->moduleImports.remove(QQmlMetaTypeData::VersionedUri(uri, moduleVersion), import);
+}
- QQmlTypeModule *module = getTypeModule(uri, version, data);
- Q_ASSERT(module);
- module->removeImport(import);
+QList<QQmlDirParser::Import> QQmlMetaType::moduleImports(
+ const QString &uri, QTypeRevision version)
+{
+ QQmlMetaTypeDataPtr data;
+
+ const auto unrevisioned = data->moduleImports.equal_range(
+ QQmlMetaTypeData::VersionedUri(uri, QTypeRevision()));
+
+ QList<QQmlDirParser::Import> result(unrevisioned.first, unrevisioned.second);
+ if (version.hasMajorVersion())
+ return result + data->moduleImports.values(QQmlMetaTypeData::VersionedUri(uri, version));
+
+ // Use latest module available with that URI.
+ const auto begin = data->moduleImports.begin();
+ auto it = unrevisioned.first;
+ if (it == begin)
+ return result;
+
+ const QQmlMetaTypeData::VersionedUri latestVersion = (--it).key();
+ if (latestVersion.uri != uri)
+ return result;
+
+ do {
+ result += *it;
+ } while (it != begin && (--it).key() == latestVersion);
+
+ return result;
}
void QQmlMetaType::registerModule(const char *uri, QTypeRevision version)