aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-02-28 15:59:15 +0100
committerUlf Hermann <ulf.hermann@qt.io>2020-03-11 14:48:35 +0100
commit547b4d2c2d9424fdcc694e291fe543a4f52cb684 (patch)
tree5beb7cef439c16d86dcc5e682332e5a487b2aaea /src/qml/qml
parent9bd034ea01d01dcc4598c3e3e25e91d0b53a2cda (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.cpp13
-rw-r--r--src/qml/qml/qqml.h42
-rw-r--r--src/qml/qml/qqmlprivate.h17
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