diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2020-02-28 15:59:15 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-03-11 14:48:35 +0100 |
commit | 547b4d2c2d9424fdcc694e291fe543a4f52cb684 (patch) | |
tree | 5beb7cef439c16d86dcc5e682332e5a487b2aaea /src/qml/qml | |
parent | 9bd034ea01d01dcc4598c3e3e25e91d0b53a2cda (diff) |
Optionally return type IDs from qmlRegisterTypeAndRevisions()
This allows us to save the type IDs and later unregister the types in
qmltyperegistrar-generated code.
Change-Id: Id1bc73e2832c6d76e513ee3ee267b8d52e3851da
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/qml')
-rw-r--r-- | src/qml/qml/qqml.cpp | 13 | ||||
-rw-r--r-- | src/qml/qml/qqml.h | 42 | ||||
-rw-r--r-- | src/qml/qml/qqmlprivate.h | 17 |
3 files changed, 46 insertions, 26 deletions
diff --git a/src/qml/qml/qqml.cpp b/src/qml/qml/qqml.cpp index 20dd3827c5..79f853487c 100644 --- a/src/qml/qml/qqml.cpp +++ b/src/qml/qml/qqml.cpp @@ -253,7 +253,9 @@ int QQmlPrivate::qmlregister(RegistrationType type, void *data) assignVersions(&revisionRegistration, revision, type.version); revisionRegistration.customParser = type.customParserFactory(); - qmlregister(TypeRegistration, &revisionRegistration); + const int id = qmlregister(TypeRegistration, &revisionRegistration); + if (type.qmlTypeIds) + type.qmlTypeIds->append(id); } break; } @@ -301,7 +303,9 @@ int QQmlPrivate::qmlregister(RegistrationType type, void *data) } assignVersions(&revisionRegistration, revision, type.version); - qmlregister(SingletonRegistration, &revisionRegistration); + const int id = qmlregister(SingletonRegistration, &revisionRegistration); + if (type.qmlTypeIds) + type.qmlTypeIds->append(id); } break; } @@ -362,7 +366,8 @@ void QQmlPrivate::qmlunregister(RegistrationType type, quintptr data) namespace QQmlPrivate { template<> void qmlRegisterTypeAndRevisions<QQmlTypeNotAvailable, void>( - const char *uri, int versionMajor, const QMetaObject *classInfoMetaObject) + const char *uri, int versionMajor, const QMetaObject *classInfoMetaObject, + QVector<int> *qmlTypeIds) { using T = QQmlTypeNotAvailable; @@ -386,7 +391,7 @@ namespace QQmlPrivate { StaticCastSelector<T, QQmlPropertyValueSource>::cast(), StaticCastSelector<T, QQmlPropertyValueInterceptor>::cast(), - nullptr, nullptr, qmlCreateCustomParser<T> + nullptr, nullptr, qmlCreateCustomParser<T>, qmlTypeIds }; qmlregister(TypeAndRevisionsRegistration, &type); diff --git a/src/qml/qml/qqml.h b/src/qml/qml/qqml.h index 840c6aaee3..fff1db5125 100644 --- a/src/qml/qml/qqml.h +++ b/src/qml/qml/qqml.h @@ -86,7 +86,7 @@ enum class QmlIsSingleton {yes = true}; \ template<typename, typename> friend struct QML_PRIVATE_NAMESPACE::QmlSingleton; \ template<typename T, typename... Args> \ - friend void QML_REGISTER_TYPES_AND_REVISIONS(const char *uri, int versionMajor); + friend void QML_REGISTER_TYPES_AND_REVISIONS(const char *uri, int versionMajor, QVector<int> *); #define QML_ADDED_IN_MINOR_VERSION(VERSION) \ Q_CLASSINFO("QML.AddedInVersion", Q_REVISION(VERSION)) @@ -111,21 +111,21 @@ using QmlExtendedType = EXTENDED_TYPE; \ template<class, class> friend struct QML_PRIVATE_NAMESPACE::QmlExtended; \ template<typename T, typename... Args> \ - friend void QML_REGISTER_TYPES_AND_REVISIONS(const char *uri, int versionMajor); + friend void QML_REGISTER_TYPES_AND_REVISIONS(const char *uri, int versionMajor, QVector<int> *); #define QML_FOREIGN(FOREIGN_TYPE) \ Q_CLASSINFO("QML.Foreign", #FOREIGN_TYPE) \ using QmlForeignType = FOREIGN_TYPE; \ template<class, class> friend struct QML_PRIVATE_NAMESPACE::QmlResolved; \ template<typename T, typename... Args> \ - friend void QML_REGISTER_TYPES_AND_REVISIONS(const char *uri, int versionMajor); + friend void QML_REGISTER_TYPES_AND_REVISIONS(const char *uri, int versionMajor, QVector<int> *); #define QML_INTERFACE \ Q_CLASSINFO("QML.Element", "anonymous") \ enum class QmlIsInterface {yes = true}; \ template<typename, typename> friend struct QML_PRIVATE_NAMESPACE::QmlInterface; \ template<typename T, typename... Args> \ - friend void QML_REGISTER_TYPES_AND_REVISIONS(const char *uri, int versionMajor); + friend void QML_REGISTER_TYPES_AND_REVISIONS(const char *uri, int versionMajor, QVector<int> *); #define QML_UNAVAILABLE \ QML_FOREIGN(QQmlTypeNotAvailable) @@ -780,50 +780,57 @@ struct QmlTypeAndRevisionsRegistration; template<class T, class Resolved, class Extended> struct QmlTypeAndRevisionsRegistration<T, Resolved, Extended, false, false> { - static void registerTypeAndRevisions(const char *uri, int versionMajor) + static void registerTypeAndRevisions(const char *uri, int versionMajor, + QVector<int> *qmlTypeIds) { QQmlPrivate::qmlRegisterTypeAndRevisions<Resolved, Extended>( - uri, versionMajor, &T::staticMetaObject); + uri, versionMajor, &T::staticMetaObject, qmlTypeIds); } }; template<class T, class Resolved> struct QmlTypeAndRevisionsRegistration<T, Resolved, void, true, false> { - static void registerTypeAndRevisions(const char *uri, int versionMajor) + static void registerTypeAndRevisions(const char *uri, int versionMajor, + QVector<int> *qmlTypeIds) { QQmlPrivate::qmlRegisterSingletonAndRevisions<Resolved>( - uri, versionMajor, &T::staticMetaObject); + uri, versionMajor, &T::staticMetaObject, qmlTypeIds); } }; template<class T, class Resolved> struct QmlTypeAndRevisionsRegistration<T, Resolved, void, false, true> { - static void registerTypeAndRevisions(const char *uri, int versionMajor) + static void registerTypeAndRevisions(const char *uri, int versionMajor, + QVector<int> *qmlTypeIds) { - qmlRegisterInterface<Resolved>(uri, versionMajor); + const int id = qmlRegisterInterface<Resolved>(uri, versionMajor); + if (qmlTypeIds) + qmlTypeIds->append(id); } }; template<typename T = void, typename... Args> -void qmlRegisterTypesAndRevisions(const char *uri, int versionMajor); +void qmlRegisterTypesAndRevisions(const char *uri, int versionMajor, + QVector<int> *qmlTypeIds = nullptr); template<typename T, typename... Args> -void qmlRegisterTypesAndRevisions(const char *uri, int versionMajor) +void qmlRegisterTypesAndRevisions(const char *uri, int versionMajor, QVector<int> *qmlTypeIds) { QmlTypeAndRevisionsRegistration< T, typename QQmlPrivate::QmlResolved<T>::Type, typename QQmlPrivate::QmlExtended<T>::Type, QQmlPrivate::QmlSingleton<T>::Value, QQmlPrivate::QmlInterface<T>::Value> - ::registerTypeAndRevisions(uri, versionMajor); - qmlRegisterTypesAndRevisions<Args...>(uri, versionMajor); + ::registerTypeAndRevisions(uri, versionMajor, qmlTypeIds); + qmlRegisterTypesAndRevisions<Args...>(uri, versionMajor, qmlTypeIds); } template<> -inline void qmlRegisterTypesAndRevisions<>(const char *, int) {} +inline void qmlRegisterTypesAndRevisions<>(const char *, int, QVector<int> *) {} inline void qmlRegisterNamespaceAndRevisions(const QMetaObject *metaObject, - const char *uri, int versionMajor) + const char *uri, int versionMajor, + QVector<int> *qmlTypeIds = nullptr) { QQmlPrivate::RegisterTypeAndRevisions type = { 0, @@ -848,7 +855,8 @@ inline void qmlRegisterNamespaceAndRevisions(const QMetaObject *metaObject, nullptr, nullptr, - &qmlCreateCustomParser<void> + &qmlCreateCustomParser<void>, + qmlTypeIds }; qmlregister(QQmlPrivate::TypeAndRevisionsRegistration, &type); diff --git a/src/qml/qml/qqmlprivate.h b/src/qml/qml/qqmlprivate.h index 8a1cbc2ddf..968811e602 100644 --- a/src/qml/qml/qqmlprivate.h +++ b/src/qml/qml/qqmlprivate.h @@ -384,6 +384,7 @@ namespace QQmlPrivate const QMetaObject *extensionMetaObject; QQmlCustomParser *(*customParserFactory)(); + QVector<int> *qmlTypeIds; }; struct RegisterInterface { @@ -431,6 +432,7 @@ namespace QQmlPrivate QMetaType typeId; std::function<QObject*(QQmlEngine *, QJSEngine *)> generalizedQobjectApi; // new in version 3 + QVector<int> *qmlTypeIds; }; struct RegisterCompositeType { @@ -582,7 +584,8 @@ namespace QQmlPrivate template<typename T> void qmlRegisterSingletonAndRevisions(const char *uri, int versionMajor, - const QMetaObject *classInfoMetaObject) + const QMetaObject *classInfoMetaObject, + QVector<int> *qmlTypeIds) { RegisterSingletonTypeAndRevisions api = { 0, @@ -596,7 +599,8 @@ namespace QQmlPrivate classInfoMetaObject, QMetaType::fromType<T *>(), - Constructors<T>::createSingletonInstance + Constructors<T>::createSingletonInstance, + qmlTypeIds }; qmlregister(SingletonAndRevisionsRegistration, &api); @@ -604,7 +608,8 @@ namespace QQmlPrivate template<typename T, typename E> void qmlRegisterTypeAndRevisions(const char *uri, int versionMajor, - const QMetaObject *classInfoMetaObject) + const QMetaObject *classInfoMetaObject, + QVector<int> *qmlTypeIds) { RegisterTypeAndRevisions type = { 0, @@ -629,7 +634,8 @@ namespace QQmlPrivate ExtendedType<E>::createParent, ExtendedType<E>::staticMetaObject, - &qmlCreateCustomParser<T> + &qmlCreateCustomParser<T>, + qmlTypeIds }; qmlregister(TypeAndRevisionsRegistration, &type); @@ -637,7 +643,8 @@ namespace QQmlPrivate template<> void Q_QML_EXPORT qmlRegisterTypeAndRevisions<QQmlTypeNotAvailable, void>( - const char *uri, int versionMajor, const QMetaObject *classInfoMetaObject); + const char *uri, int versionMajor, const QMetaObject *classInfoMetaObject, + QVector<int> *qmlTypeIds); } // namespace QQmlPrivate |