diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2020-06-17 15:42:05 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-06-24 18:26:14 +0200 |
commit | 36df81b3bc6d721d5598d5163b0a9659de4a69ee (patch) | |
tree | d9032e08f4d27daa9e4b16a2c2e622ed2fa6951b /src/qml/qml/qqmlmetatype.cpp | |
parent | 6de0287d7c3aa4251fe6eb4f970d73ce11cf07fc (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.cpp | 47 |
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) |