79 QQmlMetaTypeData *data,
const QString &elementName,
80 const QQmlPrivate::RegisterSingletonType &type,
81 const QQmlType::SingletonInstanceInfo::ConstPtr &siinfo)
83 auto *d =
new QQmlTypePrivate(QQmlType::SingletonType);
84 data->registerType(d);
86 d->setName(QString::fromUtf8(type.uri), elementName);
87 d->version = type.version;
89 if (type.qObjectApi) {
90 d->baseMetaObject = type.instanceMetaObject;
91 d->typeId = type.typeId;
92 d->revision = type.revision;
95 d->extraData.singletonTypeData->singletonInstanceInfo = siinfo;
96 d->extraData.singletonTypeData->extFunc = type.extensionObjectCreate;
97 d->extraData.singletonTypeData->extMetaObject = type.extensionMetaObject;
103 const QQmlPrivate::RegisterType &type)
105 QQmlTypePrivate *d =
new QQmlTypePrivate(QQmlType::CppType);
106 data->registerType(d);
107 d->setName(QString::fromUtf8(type.uri), elementName);
109 d->version = type.version;
110 d->revision = type.revision;
111 d->typeId = type.typeId;
112 d->listId = type.listId;
113 d->extraData.cppTypeData->allocationSize = type.objectSize;
114 d->extraData.cppTypeData->userdata = type.userdata;
115 d->extraData.cppTypeData->newFunc = type.create;
116 d->extraData.cppTypeData->noCreationReason = type.noCreationReason;
117 d->extraData.cppTypeData->createValueTypeFunc = type.createValueType;
118 d->baseMetaObject = type.metaObject;
119 d->extraData.cppTypeData->attachedPropertiesFunc = type.attachedPropertiesFunction;
120 d->extraData.cppTypeData->attachedPropertiesType = type.attachedPropertiesMetaObject;
121 d->extraData.cppTypeData->parserStatusCast = type.parserStatusCast;
122 d->extraData.cppTypeData->propertyValueSourceCast = type.valueSourceCast;
123 d->extraData.cppTypeData->propertyValueInterceptorCast = type.valueInterceptorCast;
124 d->extraData.cppTypeData->finalizerCast = type.has(QQmlPrivate::RegisterType::FinalizerCast)
127 d->extraData.cppTypeData->extFunc = type.extensionObjectCreate;
128 d->extraData.cppTypeData->customParser =
reinterpret_cast<QQmlCustomParser *>(type.customParser);
129 d->extraData.cppTypeData->registerEnumClassesUnscoped =
true;
130 d->extraData.cppTypeData->registerEnumsFromRelatedTypes =
true;
131 d->extraData.cppTypeData->constructValueType = type.has(QQmlPrivate::RegisterType::CreationMethod)
132 && type.creationMethod != QQmlPrivate::ValueTypeCreationMethod::None;
133 d->extraData.cppTypeData->populateValueType = type.has(QQmlPrivate::RegisterType::CreationMethod)
134 && type.creationMethod == QQmlPrivate::ValueTypeCreationMethod::Structured;
136 if (type.extensionMetaObject)
137 d->extraData.cppTypeData->extMetaObject = type.extensionMetaObject;
140 if (d->baseMetaObject) {
141 auto indexOfUnscoped = d->baseMetaObject->indexOfClassInfo(
"RegisterEnumClassesUnscoped");
142 if (indexOfUnscoped != -1
143 && qstrcmp(d->baseMetaObject->classInfo(indexOfUnscoped).value(),
"false") == 0) {
144 d->extraData.cppTypeData->registerEnumClassesUnscoped =
false;
147 auto indexOfRelated = d->baseMetaObject->indexOfClassInfo(
"RegisterEnumsFromRelatedTypes");
148 if (indexOfRelated != -1
149 && qstrcmp(d->baseMetaObject->classInfo(indexOfRelated).value(),
"false") == 0) {
150 d->extraData.cppTypeData->registerEnumsFromRelatedTypes =
false;
158 QQmlMetaTypeData *data,
const QUrl &url, QQmlTypePrivate *priv,
const QByteArray &className)
160 Q_ASSERT(!className.isEmpty());
161 QByteArray ptr = className +
'*';
162 QByteArray lst =
"QQmlListProperty<" + className +
'>';
164 QQmlMetaTypeData::CompositeMetaTypes &types = data->compositeMetaTypes[url];
166 Q_ASSERT(types.listType);
168 QMetaType::unregisterMetaType(QMetaType(types.type));
169 QMetaType::unregisterMetaType(QMetaType(types.listType));
171 types.type->name = std::move(ptr);
172 types.type->QMetaTypeInterface::name = types.type->name.constData();
173 types.listType->name = std::move(lst);
174 types.listType->QMetaTypeInterface::name = types.listType->name.constData();
176 types.type =
new QQmlMetaTypeInterface(std::move(ptr));
177 types.listType =
new QQmlListMetaTypeInterface(std::move(lst), types.type);
180 QMetaType ptr_type(types.type);
181 QMetaType lst_type(types.listType);
187 priv->typeId = ptr_type;
188 priv->listId = lst_type;
192 const QQmlPrivate::RegisterCompositeType &type)
194 auto *d =
new QQmlTypePrivate(QQmlType::CompositeType);
195 data->registerType(d);
196 d->setName(QString::fromUtf8(type.uri), elementName);
197 d->version = type.version;
199 const QUrl normalized = QQmlMetaType::normalizedUrl(type.url);
200 d->extraData.compositeTypeData = normalized;
201 addQQmlMetaTypeInterfaces(
202 data, normalized, d, QQmlPropertyCacheCreatorBase::createClassNameTypeByUrl(normalized));
207 QQmlMetaTypeData *data,
const QString &elementName,
208 const QQmlPrivate::RegisterCompositeSingletonType &type,
209 const QQmlType::SingletonInstanceInfo::ConstPtr &siinfo)
211 auto *d =
new QQmlTypePrivate(QQmlType::CompositeSingletonType);
212 data->registerType(d);
213 d->setName(QString::fromUtf8(type.uri), elementName);
215 d->version = type.version;
217 d->extraData.singletonTypeData->singletonInstanceInfo = siinfo;
218 const QUrl &url = siinfo->url;
219 addQQmlMetaTypeInterfaces(
220 data, url, d, QQmlPropertyCacheCreatorBase::createClassNameTypeByUrl(url));
224void QQmlMetaType::clone(QMetaObjectBuilder &builder,
const QMetaObject *mo,
225 const QMetaObject *ignoreStart,
const QMetaObject *ignoreEnd,
226 QQmlMetaType::ClonePolicy policy)
229 builder.setClassName(mo->className());
232 for (
int ii = mo->classInfoOffset(); ii < mo->classInfoCount(); ++ii) {
233 QMetaClassInfo info = mo->classInfo(ii);
235 int otherIndex = ignoreEnd->indexOfClassInfo(info.name());
236 if (otherIndex >= ignoreStart->classInfoOffset() + ignoreStart->classInfoCount()) {
239 builder.addClassInfo(info.name(), info.value());
243 if (policy != QQmlMetaType::CloneEnumsOnly) {
245 for (
int ii = mo->methodOffset(); ii < mo->methodCount(); ++ii) {
246 QMetaMethod method = mo->method(ii);
249 QByteArray name = method.name();
253 for (
int ii = ignoreStart->methodOffset() + ignoreStart->methodCount();
254 !found && ii < ignoreEnd->methodOffset() + ignoreEnd->methodCount(); ++ii) {
256 QMetaMethod other = ignoreEnd->method(ii);
258 found = name == other.name();
261 QMetaMethodBuilder m = builder.addMethod(method);
263 m.setAccess(QMetaMethod::Private);
267 for (
int ii = mo->propertyOffset(); ii < mo->propertyCount(); ++ii) {
268 QMetaProperty property = mo->property(ii);
270 int otherIndex = ignoreEnd->indexOfProperty(property.name());
271 if (otherIndex >= ignoreStart->propertyOffset() + ignoreStart->propertyCount()) {
272 builder.addProperty(QByteArray(
"__qml_ignore__") + property.name(),
276 builder.addProperty(property);
282 for (
int ii = mo->enumeratorOffset(); ii < mo->enumeratorCount(); ++ii) {
283 QMetaEnum enumerator = mo->enumerator(ii);
285 int otherIndex = ignoreEnd->indexOfEnumerator(enumerator.name());
286 if (otherIndex >= ignoreStart->enumeratorOffset() + ignoreStart->enumeratorCount()) {
289 builder.addEnumerator(enumerator);
322void QQmlMetaType::clearTypeRegistrations()
325 QQmlMetaTypeDataPtr data;
327 data->uriToModule.clear();
329 data->idToType.clear();
330 data->nameToType.clear();
331 data->urlToType.clear();
332 data->metaObjectToType.clear();
333 data->undeletableTypes.clear();
334 data->propertyCaches.clear();
336 qDeleteAll(data->metaTypeToValueType);
337 data->metaTypeToValueType.clear();
339 data->moduleImports.clear();
341 data->clearCompositeTypes();
343 qDeleteAll(data->metaTypeToValueType);
344 data->metaTypeToValueType.clear();
346 data->clearCompositeMetaTypes();
349void QQmlMetaType::registerTypeAlias(
int typeIndex,
const QString &name)
351 QQmlMetaTypeDataPtr data;
352 const QQmlType type = data->types.value(typeIndex).type;
353 const QQmlTypePrivate *priv = type.priv();
354 data->nameToType.insert(name, priv);
357int QQmlMetaType::registerAutoParentFunction(
const QQmlPrivate::RegisterAutoParent &function)
359 if (function.structVersion > 1)
360 qFatal(
"qmlRegisterType(): Cannot mix incompatible QML versions.");
362 QQmlMetaTypeDataPtr data;
364 data->parentFunctions.append(function.function);
366 return data->parentFunctions.size() - 1;
375QQmlType QQmlMetaType::registerInterface(
const QQmlPrivate::RegisterInterface &type)
377 if (type.structVersion > 1)
378 qFatal(
"qmlRegisterType(): Cannot mix incompatible QML versions.");
380 QQmlMetaTypeDataPtr data;
381 QQmlTypePrivate *priv = createQQmlType(data, type);
385 data->idToType.insert(priv->typeId.id(), priv);
386 data->idToType.insert(priv->listId.id(), priv);
388 return QQmlType(priv);
394 if (typeType == QQmlType::CppType)
395 typeStr = QStringLiteral(
"element");
396 else if (typeType == QQmlType::SingletonType)
397 typeStr = QStringLiteral(
"singleton type");
398 else if (typeType == QQmlType::CompositeSingletonType)
399 typeStr = QStringLiteral(
"composite singleton type");
400 else if (typeType == QQmlType::SequentialContainerType)
401 typeStr = QStringLiteral(
"sequential container type");
403 typeStr = QStringLiteral(
"type");
409 QQmlType::RegistrationType typeType, QQmlMetaTypeData *data,
const char *uri,
410 const QString &typeName, QTypeRevision version, QMetaType::TypeFlags flags)
412 if (!typeName.isEmpty()) {
413 if (typeName.at(0).isLower() && (flags & QMetaType::PointerToQObject)) {
414 QString failure(QCoreApplication::translate(
"qmlRegisterType",
"Invalid QML %1 name \"%2\"; type names must begin with an uppercase letter"));
415 data->recordTypeRegFailure(failure.arg(registrationTypeString(typeType), typeName));
419 if (typeName.at(0).isUpper()
420 && (flags & (QMetaType::IsGadget | QMetaType::PointerToGadget))) {
421 qCWarning(lcTypeRegistration).noquote()
422 << QCoreApplication::translate(
424 "Invalid QML %1 name \"%2\"; "
425 "value type names should begin with a lowercase letter")
426 .arg(registrationTypeString(typeType), typeName);
432 int typeNameLen = typeName.size();
433 for (
int ii = 0; ii < typeNameLen; ++ii) {
434 if (!(typeName.at(ii).isLetterOrNumber() || typeName.at(ii) == u'_')) {
435 QString failure(QCoreApplication::translate(
"qmlRegisterType",
"Invalid QML %1 name \"%2\""));
436 data->recordTypeRegFailure(failure.arg(registrationTypeString(typeType), typeName));
442 if (uri && !typeName.isEmpty()) {
443 QString nameSpace = QString::fromUtf8(uri);
445 if (qqtm && qqtm->lockLevel() != QQmlTypeModule::LockLevel::Open) {
446 QString failure(QCoreApplication::translate(
448 "Cannot install %1 '%2' into protected module '%3' version '%4'"));
449 data->recordTypeRegFailure(failure
450 .arg(registrationTypeString(typeType), typeName, nameSpace)
451 .arg(version.majorVersion()));
473 if (!type->elementName.isEmpty())
474 data->nameToType.insert(type->elementName, type);
476 if (type->baseMetaObject)
477 data->metaObjectToType.insert(type->baseMetaObject, type);
479 if (type->regType == QQmlType::SequentialContainerType) {
480 if (type->listId.isValid())
481 data->idToType.insert(type->listId.id(), type);
483 if (type->typeId.isValid())
484 data->idToType.insert(type->typeId.id(), type);
486 if (type->listId.flags().testFlag(QMetaType::IsQmlList))
487 data->idToType.insert(type->listId.id(), type);
490 if (!type->module.isEmpty()) {
491 const QHashedString &mod = type->module;
499QQmlType QQmlMetaType::registerType(
const QQmlPrivate::RegisterType &type)
501 if (type.structVersion >
int(QQmlPrivate::RegisterType::CurrentVersion))
502 qFatal(
"qmlRegisterType(): Cannot mix incompatible QML versions.");
504 QQmlMetaTypeDataPtr data;
506 QString elementName = QString::fromUtf8(type.elementName);
507 if (!checkRegistration(QQmlType::CppType, data, type.uri, elementName, type.version,
508 QMetaType(type.typeId).flags())) {
512 QQmlTypePrivate *priv = createQQmlType(data, elementName, type);
513 addTypeToData(priv, data);
515 return QQmlType(priv);
518QQmlType QQmlMetaType::registerSingletonType(
519 const QQmlPrivate::RegisterSingletonType &type,
520 const QQmlType::SingletonInstanceInfo::ConstPtr &siinfo)
522 if (type.structVersion > 1)
523 qFatal(
"qmlRegisterType(): Cannot mix incompatible QML versions.");
525 QQmlMetaTypeDataPtr data;
527 QString typeName = QString::fromUtf8(type.typeName);
528 if (!checkRegistration(QQmlType::SingletonType, data, type.uri, typeName, type.version,
529 QMetaType(type.typeId).flags())) {
533 QQmlTypePrivate *priv = createQQmlType(data, typeName, type, siinfo);
535 addTypeToData(priv, data);
537 return QQmlType(priv);
540QQmlType QQmlMetaType::registerCompositeSingletonType(
541 const QQmlPrivate::RegisterCompositeSingletonType &type,
542 const QQmlType::SingletonInstanceInfo::ConstPtr &siinfo)
544 if (type.structVersion > 1)
545 qFatal(
"qmlRegisterType(): Cannot mix incompatible QML versions.");
548 QQmlMetaTypeDataPtr data;
550 QString typeName = QString::fromUtf8(type.typeName);
551 if (!checkRegistration(
552 QQmlType::CompositeSingletonType, data, type.uri, typeName, type.version, {})) {
556 QQmlTypePrivate *priv = createQQmlType(data, typeName, type, siinfo);
557 addTypeToData(priv, data);
559 data->urlToType.insert(siinfo->url, priv);
561 return QQmlType(priv);
564QQmlType QQmlMetaType::registerCompositeType(
const QQmlPrivate::RegisterCompositeType &type)
566 if (type.structVersion > 1)
567 qFatal(
"qmlRegisterType(): Cannot mix incompatible QML versions.");
570 QQmlMetaTypeDataPtr data;
572 QString typeName = QString::fromUtf8(type.typeName);
573 if (!checkRegistration(QQmlType::CompositeType, data, type.uri, typeName, type.version, {}))
576 QQmlTypePrivate *priv = createQQmlType(data, typeName, type);
577 addTypeToData(priv, data);
579 data->urlToType.insert(QQmlMetaType::normalizedUrl(type.url), priv);
581 return QQmlType(priv);
604 QQmlMetaTypeData *data,
const QUrl &url,
const QHashedStringRef &qualifiedType,
605 QQmlMetaType::CompositeTypeLookupMode mode, QList<QQmlError> *errors, QTypeRevision version)
607 const int dot = qualifiedType.indexOf(QLatin1Char(
'.'));
608 const QString typeName = dot < 0
609 ? qualifiedType.toString()
610 : QString(qualifiedType.constData() + dot + 1, qualifiedType.length() - dot - 1);
612 QStringList failures;
632 QQmlType::RegistrationType registrationType;
634 case QQmlMetaType::Singleton:
635 registrationType = QQmlType::CompositeSingletonType;
637 case QQmlMetaType::NonSingleton:
638 registrationType = QQmlType::CompositeType;
640 case QQmlMetaType::JavaScript:
641 registrationType = QQmlType::JavaScriptType;
644 Q_UNREACHABLE_RETURN(QQmlType());
647 if (checkRegistration(registrationType, data,
nullptr, typeName, version, {})) {
654 auto *priv =
new QQmlTypePrivate(registrationType);
655 addQQmlMetaTypeInterfaces(
656 data, url, priv, QQmlPropertyCacheCreatorBase::createClassNameTypeByUrl(url));
658 priv->setName(QString(), typeName);
659 priv->version = version;
662 case QQmlMetaType::Singleton: {
663 QQmlType::SingletonInstanceInfo::Ptr siinfo = QQmlType::SingletonInstanceInfo::create();
665 siinfo->typeName = typeName.toUtf8();
666 priv->extraData.singletonTypeData->singletonInstanceInfo =
667 QQmlType::SingletonInstanceInfo::ConstPtr(
668 siinfo.take(), QQmlType::SingletonInstanceInfo::ConstPtr::Adopt);
671 case QQmlMetaType::NonSingleton: {
672 priv->extraData.compositeTypeData = url;
675 case QQmlMetaType::JavaScript: {
676 priv->extraData.javaScriptTypeData = url;
681 data->registerType(priv);
682 addTypeToData(priv, data);
683 return QQmlType(priv);
691 error.setDescription(failures.join(u'\n'));
692 errors->prepend(error);
694 qWarning(
"%s", failures.join(u'\n').toLatin1().constData());
699QQmlType QQmlMetaType::findCompositeType(
700 const QUrl &url,
const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit,
701 CompositeTypeLookupMode mode)
703 const QUrl normalized = QQmlMetaType::normalizedUrl(url);
704 QQmlMetaTypeDataPtr data;
706 bool urlExists =
true;
707 auto found = data->urlToType.constFind(normalized);
708 if (found == data->urlToType.cend())
712 if (compilationUnit.isNull())
713 return QQmlType(*found);
714 const auto [begin, end]
715 = std::as_const(data->compositeTypes).equal_range(found.value()->typeId.iface());
717 return QQmlType(*found);
718 for (
auto it = begin; it != end; ++it) {
719 if (it.value() == compilationUnit)
720 return QQmlType(*found);
724 const QQmlType type = createTypeForUrl(
725 data, normalized, QHashedStringRef(), mode,
nullptr, QTypeRevision());
727 if (!urlExists && type.isValid())
728 data->urlToType.insert(normalized, type.priv());
735 QQmlTypePrivate *priv =
new QQmlTypePrivate(QQmlType::InlineComponentType);
736 priv->setName(QString(), url.fragment());
738 priv->extraData.inlineComponentTypeData = url;
739 data->registerType(priv);
741 addQQmlMetaTypeInterfaces(
742 data, url, priv, QQmlPropertyCacheCreatorBase::createClassNameForInlineComponent(url));
743 data->urlToType.insert(url, priv);
745 data->idToType.insert(priv->typeId.id(), priv);
746 data->idToType.insert(priv->listId.id(), priv);
748 return QQmlType(priv);
751QQmlType QQmlMetaType::findInlineComponentType(
752 const QUrl &url,
const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit)
754 QQmlMetaTypeDataPtr data;
758 const auto it = data->urlToType.constFind(url);
759 if (it != data->urlToType.constEnd()) {
760 const auto [begin, end]
761 = std::as_const(data->compositeTypes).equal_range((*it)->typeId.iface());
763 return QQmlType(*it);
764 for (
auto jt = begin; jt != end; ++jt) {
765 if (*jt == compilationUnit)
766 return QQmlType(*it);
770 return doRegisterInlineComponentType(data, url);
773int QQmlMetaType::registerUnitCacheHook(
774 const QQmlPrivate::RegisterQmlUnitCacheHook &hookRegistration)
776 if (hookRegistration.structVersion > 1)
777 qFatal(
"qmlRegisterType(): Cannot mix incompatible QML versions.");
779 QQmlMetaTypeDataPtr data;
780 data->lookupCachedQmlUnit << hookRegistration.lookupCachedQmlUnit;
784QQmlType QQmlMetaType::registerSequentialContainer(
785 const QQmlPrivate::RegisterSequentialContainer &container)
787 if (container.structVersion > 1)
788 qFatal(
"qmlRegisterSequenceContainer(): Cannot mix incompatible QML versions.");
790 QQmlMetaTypeDataPtr data;
792 if (!checkRegistration(QQmlType::SequentialContainerType, data, container.uri, QString(),
793 container.version, {})) {
797 QQmlTypePrivate *priv =
new QQmlTypePrivate(QQmlType::SequentialContainerType);
799 data->registerType(priv);
800 priv->setName(QString::fromUtf8(container.uri), QString());
801 priv->version = container.version;
802 priv->revision = container.revision;
803 priv->typeId = container.metaSequence.valueMetaType();
804 priv->listId = container.typeId;
805 priv->extraData.sequentialContainerTypeData = container.metaSequence;
807 addTypeToData(priv, data);
809 return QQmlType(priv);
817bool QQmlMetaType::protectModule(
const QString &uri, QTypeRevision version,
818 bool weakProtectAllVersions)
820 QQmlMetaTypeDataPtr data;
821 if (version.hasMajorVersion()) {
822 if (QQmlTypeModule *module = data->findTypeModule(uri, version)) {
823 if (!weakProtectAllVersions) {
824 module->setLockLevel(QQmlTypeModule::LockLevel::Strong);
832 const auto range = std::equal_range(
833 data->uriToModule.begin(), data->uriToModule.end(), uri,
834 std::less<ModuleUri>());
836 for (
auto it = range.first; it != range.second; ++it)
837 (*it)->setLockLevel(QQmlTypeModule::LockLevel::Weak);
839 return range.first != range.second;
842void QQmlMetaType::registerModuleImport(
const QString &uri, QTypeRevision moduleVersion,
843 const QQmlDirParser::Import &import)
845 QQmlMetaTypeDataPtr data;
847 data->moduleImports.insert(QQmlMetaTypeData::VersionedUri(uri, moduleVersion), import);
850void QQmlMetaType::unregisterModuleImport(
const QString &uri, QTypeRevision moduleVersion,
851 const QQmlDirParser::Import &import)
853 QQmlMetaTypeDataPtr data;
854 data->moduleImports.remove(QQmlMetaTypeData::VersionedUri(uri, moduleVersion), import);
857QList<QQmlDirParser::Import> QQmlMetaType::moduleImports(
858 const QString &uri, QTypeRevision version)
860 QQmlMetaTypeDataPtr data;
861 QList<QQmlDirParser::Import> result;
863 const auto unrevisioned = data->moduleImports.equal_range(
864 QQmlMetaTypeData::VersionedUri(uri, QTypeRevision()));
865 for (
auto it = unrevisioned.second; it != unrevisioned.first;)
866 result.append(*(--it));
868 if (version.hasMajorVersion()) {
869 const auto revisioned = data->moduleImports.equal_range(
870 QQmlMetaTypeData::VersionedUri(uri, version));
871 for (
auto it = revisioned.second; it != revisioned.first;)
872 result.append(*(--it));
877 const auto begin = data->moduleImports.begin();
878 auto it = unrevisioned.first;
882 const QQmlMetaTypeData::VersionedUri latestVersion = (--it).key();
883 if (latestVersion.uri != uri)
888 }
while (it != begin && (--it).key() == latestVersion);
893void QQmlMetaType::registerModule(
const char *uri, QTypeRevision version)
895 QQmlMetaTypeDataPtr data;
897 QQmlTypeModule *module = getTypeModule(QString::fromUtf8(uri), version, data);
900 if (version.hasMinorVersion())
901 module->addMinorVersion(version.minorVersion());
904int QQmlMetaType::typeId(
const char *uri, QTypeRevision version,
const char *qmlName)
906 QQmlMetaTypeDataPtr data;
908 QQmlTypeModule *module = getTypeModule(QString::fromUtf8(uri), version, data);
912 QQmlType type = module->type(QHashedStringRef(QString::fromUtf8(qmlName)), version);
939QQmlMetaType::RegistrationResult QQmlMetaType::registerPluginTypes(
940 QObject *instance,
const QString &basePath,
const QString &uri,
941 const QString &typeNamespace, QTypeRevision version, QList<QQmlError> *errors)
943 if (!typeNamespace.isEmpty() && typeNamespace != uri) {
948 error.setDescription(
949 QStringLiteral(
"Module namespace '%1' does not match import URI '%2'")
950 .arg(typeNamespace, uri));
951 errors->prepend(error);
953 return RegistrationResult::Failure;
956 QStringList failures;
957 QQmlMetaTypeDataPtr data;
959 QQmlMetaTypeRegistrationFailureRecorder failureRecorder(data, &failures);
960 if (!typeNamespace.isEmpty()) {
962 if (namespaceContainsRegistrations(data, typeNamespace, version)) {
966 error.setDescription(QStringLiteral(
"Namespace '%1' has already been used "
967 "for type registration")
968 .arg(typeNamespace));
969 errors->prepend(error);
971 return RegistrationResult::Failure;
975 qWarning().nospace() << qPrintable(
976 QStringLiteral(
"Module '%1' does not contain a module identifier directive - "
977 "it cannot be protected from external registrations.").arg(uri));
980 if (instance && !qobject_cast<QQmlEngineExtensionInterface *>(instance)) {
981 QQmlTypesExtensionInterface *iface = qobject_cast<QQmlTypesExtensionInterface *>(instance);
986 error.setDescription(QStringLiteral(
"Module loaded for URI '%1' does not implement "
987 "QQmlEngineExtensionInterface").arg(typeNamespace));
988 errors->prepend(error);
990 return RegistrationResult::Failure;
993#if QT_DEPRECATED_SINCE(6
, 3
)
994 if (
auto *plugin = qobject_cast<QQmlExtensionPlugin *>(instance)) {
996 QQmlExtensionPluginPrivate::get(plugin)->baseUrl
997 = QQmlImports::urlFromLocalFileOrQrcOrUrl(basePath);
1003 const QByteArray bytes = uri.toUtf8();
1004 const char *moduleId = bytes.constData();
1005 iface->registerTypes(moduleId);
1008 if (failures.isEmpty() && !data->registerModuleTypes(uri))
1009 return RegistrationResult::NoRegistrationFunction;
1011 if (!failures.isEmpty()) {
1013 for (
const QString &failure : std::as_const(failures)) {
1015 error.setDescription(failure);
1016 errors->prepend(error);
1019 return RegistrationResult::Failure;
1023 return RegistrationResult::Success;
1037QQmlType QQmlMetaType::typeForUrl(
1038 const QUrl &url,
const QHashedStringRef &qualifiedType, CompositeTypeLookupMode mode,
1039 QList<QQmlError> *errors, QTypeRevision version)
1042 const QUrl normalized = QQmlMetaType::normalizedUrl(url);
1044 QQmlMetaTypeDataPtr data;
1046 QQmlType ret(data->urlToType.value(normalized));
1047 if (ret.isValid() && ret.sourceUrl() == normalized)
1051 const QQmlType type = createTypeForUrl(
1052 data, normalized, qualifiedType, mode, errors, version);
1053 data->urlToType.insert(normalized, type.priv());
1060QTypeRevision QQmlMetaType::latestModuleVersion(
const QString &uri)
1062 QQmlMetaTypeDataPtr data;
1063 auto upper = std::upper_bound(data->uriToModule.begin(), data->uriToModule.end(), uri,
1064 std::less<ModuleUri>());
1065 if (upper == data->uriToModule.begin())
1066 return QTypeRevision();
1068 const auto module = (--upper)->get();
1069 return (module->module() == uri)
1070 ? QTypeRevision::fromVersion(module->majorVersion(), module->maximumMinorVersion())
1077bool QQmlMetaType::isStronglyLockedModule(
const QString &uri, QTypeRevision version)
1079 QQmlMetaTypeDataPtr data;
1081 if (QQmlTypeModule* qqtm = data->findTypeModule(uri, version))
1082 return qqtm->lockLevel() == QQmlTypeModule::LockLevel::Strong;
1093QTypeRevision QQmlMetaType::matchingModuleVersion(
const QString &module, QTypeRevision version)
1095 if (!version.hasMajorVersion())
1096 return latestModuleVersion(module);
1098 QQmlMetaTypeDataPtr data;
1101 if (QQmlTypeModule *tm = data->findTypeModule(module, version)) {
1102 if (!version.hasMinorVersion())
1103 return QTypeRevision::fromVersion(version.majorVersion(), tm->maximumMinorVersion());
1105 if (tm->minimumMinorVersion() <= version.minorVersion()
1106 && tm->maximumMinorVersion() >= version.minorVersion()) {
1111 return QTypeRevision();
1114QQmlTypeModule *QQmlMetaType::typeModule(
const QString &uri, QTypeRevision version)
1116 QQmlMetaTypeDataPtr data;
1118 if (version.hasMajorVersion())
1119 return data->findTypeModule(uri, version);
1121 auto range = std::equal_range(data->uriToModule.begin(), data->uriToModule.end(),
1122 uri, std::less<ModuleUri>());
1124 return range.first == range.second ?
nullptr : (--range.second)->get();
1148QMetaType QQmlMetaType::listValueType(QMetaType metaType)
1150 if (isList(metaType)) {
1151 const auto iface = metaType.iface();
1152 if (iface && iface->metaObjectFn == &dynamicQmlListMarker)
1153 return QMetaType(
static_cast<
const QQmlListMetaTypeInterface *>(iface)->valueType);
1154 }
else if (metaType.flags() & QMetaType::PointerToQObject) {
1158 QQmlMetaTypeDataPtr data;
1160 QQmlTypePrivate *type = data->idToType.value(metaType.id());
1162 if (type && type->listId == metaType)
1163 return type->typeId;
1165 return QMetaType {};
1168QQmlAttachedPropertiesFunc QQmlMetaType::attachedPropertiesFunc(
1169 QQmlTypeLoader *typeLoader,
const QMetaObject *mo)
1171 QQmlMetaTypeDataPtr data;
1173 QQmlType type(data->metaObjectToType.value(mo));
1174 return type.attachedPropertiesFunction(typeLoader);
1177QMetaProperty QQmlMetaType::defaultProperty(
const QMetaObject *metaObject)
1179 int idx = metaObject->indexOfClassInfo(
"DefaultProperty");
1181 return QMetaProperty();
1183 QMetaClassInfo info = metaObject->classInfo(idx);
1185 return QMetaProperty();
1187 idx = metaObject->indexOfProperty(info.value());
1189 return QMetaProperty();
1191 return metaObject->property(idx);
1257QQmlType QQmlMetaType::qmlType(
const QString &qualifiedName, QTypeRevision version)
1259 int slash = qualifiedName.indexOf(QLatin1Char(
'/'));
1263 QHashedStringRef module(qualifiedName.constData(), slash);
1264 QHashedStringRef name(qualifiedName.constData() + slash + 1, qualifiedName.size() - slash - 1);
1266 return qmlType(name, module, version);
1277QQmlType QQmlMetaType::qmlType(
const QHashedStringRef &name,
const QHashedStringRef &module,
1278 QTypeRevision version)
1280 const QQmlMetaTypeDataPtr data;
1282 const QHashedString key(QString::fromRawData(name.constData(), name.length()), name.hash());
1283 QQmlMetaTypeData::Names::ConstIterator it = data->nameToType.constFind(key);
1284 while (it != data->nameToType.cend() && it.key() == name) {
1286 if (module.isEmpty() || t.availableInVersion(module, version))
1309QQmlType QQmlMetaType::qmlType(
const QMetaObject *metaObject,
const QHashedStringRef &module,
1310 QTypeRevision version)
1312 const QQmlMetaTypeDataPtr data;
1314 const auto range = data->metaObjectToType.equal_range(metaObject);
1315 for (
auto it = range.first; it != range.second; ++it) {
1317 if (module.isEmpty() || t.availableInVersion(module, version))
1343QQmlType QQmlMetaType::firstQmlTypeForAttachmentMetaObject(
const QMetaObject *attachmentMetaObject)
1345 const QQmlMetaTypeDataPtr data;
1346 if (
auto qmlTypePriv = data->metaObjectToType.value(attachmentMetaObject)) {
1348 if (qmlTypePriv->regType == QQmlType::CppType &&
1349 qmlTypePriv->extraData.cppTypeData->attachedPropertiesType == attachmentMetaObject)
1350 return QQmlType(qmlTypePriv);
1352 auto getAttachmentMetaObject = [](
const QQmlTypePrivate *priv) ->
const QMetaObject * {
1353 if (priv->regType != QQmlType::CppType)
1355 return priv->extraData.cppTypeData->attachedPropertiesType;
1357 auto it = std::find_if(data->metaObjectToType.constBegin(),
1358 data->metaObjectToType.constEnd(),
1359 [&](
const QQmlTypePrivate *type) {
return attachmentMetaObject == getAttachmentMetaObject(type); }
1361 if (it == data->metaObjectToType.constEnd())
1363 return QQmlType(*it);
1390QQmlType QQmlMetaType::qmlType(
const QUrl &unNormalizedUrl)
1392 const QUrl url = QQmlMetaType::normalizedUrl(unNormalizedUrl);
1393 const QQmlMetaTypeDataPtr data;
1395 QQmlType type(data->urlToType.value(url));
1397 if (type.sourceUrl() == url)
1403QQmlType QQmlMetaType::fetchOrCreateInlineComponentTypeForUrl(
const QUrl &url)
1405 QQmlMetaTypeDataPtr data;
1406 const auto it = data->urlToType.constFind(url);
1407 if (it != data->urlToType.constEnd())
1408 return QQmlType(*it);
1410 return doRegisterInlineComponentType(data, url);
1419QQmlPropertyCache::ConstPtr QQmlMetaType::propertyCache(QObject *obj, QTypeRevision version)
1421 if (!obj || QObjectPrivate::get(obj)->metaObject || QObjectPrivate::get(obj)->wasDeleted)
1422 return QQmlPropertyCache::ConstPtr();
1423 return QQmlMetaType::propertyCache(obj->metaObject(), version);
1426QQmlPropertyCache::ConstPtr QQmlMetaType::propertyCache(
1427 const QMetaObject *metaObject, QTypeRevision version)
1429 QQmlMetaTypeDataPtr data;
1430 return data->propertyCache(metaObject, version);
1445QQmlMetaObject QQmlMetaType::rawMetaObjectForType(QMetaType metaType)
1447 const QQmlMetaTypeDataPtr data;
1448 if (
auto composite = data->findPropertyCacheInCompositeTypes(metaType))
1449 return QQmlMetaObject(composite);
1451 const QQmlTypePrivate *type = data->idToType.value(metaType.id());
1452 return (type && type->typeId == metaType) ? type->baseMetaObject :
nullptr;
1460QQmlMetaObject QQmlMetaType::metaObjectForType(QMetaType metaType)
1462 const QQmlMetaTypeDataPtr data;
1463 if (
auto composite = data->findPropertyCacheInCompositeTypes(metaType))
1464 return QQmlMetaObject(composite);
1466 const QQmlTypePrivate *type = data->idToType.value(metaType.id());
1467 return (type && type->typeId == metaType)
1468 ? QQmlType(type).metaObject()
1477QQmlPropertyCache::ConstPtr QQmlMetaType::propertyCacheForType(QMetaType metaType)
1479 QQmlMetaTypeDataPtr data;
1480 if (
auto composite = data->findPropertyCacheInCompositeTypes(metaType))
1483 const QQmlTypePrivate *type = data->idToType.value(metaType.id());
1484 if (type && type->typeId == metaType) {
1485 if (
const QMetaObject *mo = QQmlType(type).metaObject())
1486 return data->propertyCache(mo, type->version);
1489 return QQmlPropertyCache::ConstPtr();
1499QQmlPropertyCache::ConstPtr QQmlMetaType::rawPropertyCacheForType(QMetaType metaType)
1501 QQmlMetaTypeDataPtr data;
1502 if (
auto composite = QQmlMetaType::findPropertyCacheInCompositeTypes(metaType))
1505 const QQmlTypePrivate *type = data->idToType.value(metaType.id());
1506 if (!type || type->typeId != metaType)
1507 return QQmlPropertyCache::ConstPtr();
1509 const QMetaObject *metaObject = type->isValueType()
1510 ? type->metaObjectForValueType()
1511 : type->baseMetaObject;
1514 ? data->propertyCache(metaObject, QTypeRevision())
1515 : QQmlPropertyCache::ConstPtr();
1524QQmlPropertyCache::ConstPtr QQmlMetaType::rawPropertyCacheForType(
1525 QMetaType metaType, QTypeRevision version)
1527 QQmlMetaTypeDataPtr data;
1528 if (
auto composite = data->findPropertyCacheInCompositeTypes(metaType))
1531 const QQmlTypePrivate *typePriv = data->idToType.value(metaType.id());
1532 if (!typePriv || typePriv->typeId != metaType)
1533 return QQmlPropertyCache::ConstPtr();
1535 const QQmlType type(typePriv);
1536 if (type.containsRevisionedAttributes()) {
1538 Q_ASSERT(type.metaObject());
1539 return data->propertyCache(type, version);
1542 if (
const QMetaObject *metaObject = type.metaObject())
1543 return data->propertyCache(metaObject, version);
1545 return QQmlPropertyCache::ConstPtr();
1548bool QQmlMetaType::canConvert(QObject *o, QMetaType metaType)
1550 QQmlMetaTypeDataPtr data;
1558 auto [it, end] = data->compositeTypes.equal_range(metaType.iface());
1561 if (QQmlMetaObject::canConvert(
1562 o, QQmlMetaTypeData::propertyCacheForPotentialInlineComponentType(
1566 }
while(++it != end);
1573 const QQmlTypePrivate *type = data->idToType.value(metaType.id());
1574 if (type && type->typeId == metaType)
1575 return QQmlMetaObject::canConvert(o, type->baseMetaObject);
1578 if (
const QMetaObject *metaObject = metaType.metaObject())
1579 return QQmlMetaObject::canConvert(o, metaObject);
1584void QQmlMetaType::unregisterType(
int typeIndex)
1586 QQmlMetaTypeDataPtr data;
1587 const QQmlType type = data->types.value(typeIndex).type;
1588 if (
const QQmlTypePrivate *d = type.priv()) {
1589 if (d->regType == QQmlType::CompositeType || d->regType == QQmlType::CompositeSingletonType)
1590 removeFromInlineComponents(data->urlToType, d);
1591 removeQQmlTypePrivate(data->idToType, d);
1592 removeQQmlTypePrivate(data->nameToType, d);
1593 removeQQmlTypePrivate(data->urlToType, d);
1594 removeQQmlTypePrivate(data->metaObjectToType, d);
1595 for (
auto & module : data->uriToModule)
1597 data->types[typeIndex] = QQmlMetaTypeData::Type();
1598 data->undeletableTypes.remove(type);
1625 QQmlMetaTypeData *data,
1626 const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit)
1629 auto doCheck = [&](
const QtPrivate::QMetaTypeInterface *iface) {
1633 const auto [begin, end] = std::as_const(data->compositeTypes).equal_range(iface);
1634 for (
auto it = begin; it != end; ++it) {
1635 if (*it == compilationUnit)
1640 doCheck(compilationUnit->metaType().iface());
1641 for (
auto &&inlineData: compilationUnit->inlineComponentData)
1642 doCheck(inlineData.qmlType.typeId().iface());
1647void QQmlMetaType::freeUnusedTypesAndCaches()
1649 QQmlMetaTypeDataPtr data;
1652 if (!data.isValid())
1655 bool droppedAtLeastOneComposite;
1657 droppedAtLeastOneComposite =
false;
1658 auto it = data->compositeTypes.cbegin();
1659 while (it != data->compositeTypes.cend()) {
1660 const auto &cu = *it;
1661 if (cu->count() <= doCountInternalCompositeTypeSelfReferences(data, cu)) {
1662 QQmlMetaTypeData::clearCompositeType(cu);
1663 it = data->compositeTypes.erase(it);
1664 droppedAtLeastOneComposite =
true;
1669 }
while (droppedAtLeastOneComposite);
1671 bool deletedAtLeastOneType;
1673 deletedAtLeastOneType =
false;
1674 auto it = data->types.begin();
1675 while (it != data->types.end()) {
1676 const QQmlTypePrivate *d = it->type.priv();
1677 if (d && d->count() == 1 && !hasActiveInlineComponents(data, d)) {
1678 deletedAtLeastOneType =
true;
1680 if (d->regType == QQmlType::CompositeType
1681 || d->regType == QQmlType::CompositeSingletonType) {
1682 removeFromInlineComponents(data->urlToType, d);
1684 removeQQmlTypePrivate(data->idToType, d);
1685 removeQQmlTypePrivate(data->nameToType, d);
1686 removeQQmlTypePrivate(data->urlToType, d);
1687 removeQQmlTypePrivate(data->metaObjectToType, d);
1689 for (
auto &module : data->uriToModule)
1692 *it = QQmlMetaTypeData::Type();
1697 }
while (deletedAtLeastOneType);
1699 bool deletedAtLeastOneCache;
1701 deletedAtLeastOneCache =
false;
1702 auto it = data->propertyCaches.begin();
1703 while (it != data->propertyCaches.end()) {
1704 if ((*it)->count() == 1) {
1705 it = data->propertyCaches.erase(it);
1706 deletedAtLeastOneCache =
true;
1711 }
while (deletedAtLeastOneCache);
1717QList<QString> QQmlMetaType::qmlTypeNames()
1719 const QQmlMetaTypeDataPtr data;
1721 QList<QString> names;
1722 names.reserve(data->nameToType.size());
1723 QQmlMetaTypeData::Names::ConstIterator it = data->nameToType.cbegin();
1724 while (it != data->nameToType.cend()) {
1726 names += t.qmlTypeName();
1750QList<QQmlType> QQmlMetaType::qmlAllTypes()
1752 const QQmlMetaTypeDataPtr data;
1753 QList<QQmlType> types;
1754 types.reserve(data->types.size());
1756 data->types.constBegin(), data->types.constEnd(),
1757 std::back_inserter(types), [](
const auto &type) {
return type.type; });
1790const QQmlPrivate::CachedQmlUnit *QQmlMetaType::findCachedCompilationUnit(
1791 const QUrl &uri, QQmlMetaType::CacheMode mode, CachedUnitLookupError *status)
1793 Q_ASSERT(mode != RejectAll);
1794 const QQmlMetaTypeDataPtr data;
1796 for (
const auto lookup : std::as_const(data->lookupCachedQmlUnit)) {
1797 if (
const QQmlPrivate::CachedQmlUnit *unit = lookup(uri)) {
1799 if (!unit->qmlData->verifyHeader(QDateTime(), &error)) {
1800 qCDebug(DBG_DISK_CACHE) <<
"Error loading pre-compiled file " << uri <<
":" << error;
1802 *status = CachedUnitLookupError::VersionMismatch;
1806 if (mode == RequireFullyTyped && !isFullyTyped(unit)) {
1807 qCDebug(DBG_DISK_CACHE)
1808 <<
"Error loading pre-compiled file " << uri
1809 <<
": compilation unit contains functions not compiled to native code.";
1811 *status = CachedUnitLookupError::NotFullyTyped;
1816 *status = CachedUnitLookupError::NoError;
1822 *status = CachedUnitLookupError::NoUnitFound;
1842QString QQmlMetaType::prettyTypeName(
const QObject *object)
1849 QQmlType type = QQmlMetaType::qmlType(object->metaObject());
1850 if (type.isValid()) {
1851 typeName = type.qmlTypeName();
1852 const int lastSlash = typeName.lastIndexOf(QLatin1Char(
'/'));
1853 if (lastSlash != -1)
1854 typeName = typeName.mid(lastSlash + 1);
1857 if (typeName.isEmpty()) {
1858 typeName = QString::fromUtf8(object->metaObject()->className());
1859 int marker = typeName.indexOf(QLatin1String(
"_QMLTYPE_"));
1861 typeName = typeName.left(marker);
1863 marker = typeName.indexOf(QLatin1String(
"_QML_"));
1865 typeName = QStringView{typeName}.left(marker) + QLatin1Char(
'*');
1866 type = QQmlMetaType::qmlType(QMetaType::fromName(typeName.toUtf8()));
1867 if (type.isValid()) {
1868 QString qmlTypeName = type.qmlTypeName();
1869 const int lastSlash = qmlTypeName.lastIndexOf(QLatin1Char(
'/'));
1870 if (lastSlash != -1)
1871 qmlTypeName = qmlTypeName.mid(lastSlash + 1);
1872 if (!qmlTypeName.isEmpty())
1873 typeName = qmlTypeName;
1881QList<QQmlProxyMetaObject::ProxyData> QQmlMetaType::proxyData(
const QMetaObject *mo,
1882 const QMetaObject *baseMetaObject,
1883 QMetaObject *lastMetaObject)
1885 QList<QQmlProxyMetaObject::ProxyData> metaObjects;
1886 mo = mo->d.superdata;
1891 auto createProxyMetaObject = [&](
const QQmlTypePrivate *This,
1892 const QMetaObject *superdataBaseMetaObject,
1893 const QMetaObject *extMetaObject,
1894 QObject *(*extFunc)(QObject *)) {
1898 QMetaObjectBuilder builder;
1899 clone(builder, extMetaObject, superdataBaseMetaObject, baseMetaObject,
1900 extFunc ? QQmlMetaType::CloneAll : QQmlMetaType::CloneEnumsOnly);
1901 QMetaObject *mmo = builder.toMetaObject();
1902 mmo->d.superdata = baseMetaObject;
1903 if (!metaObjects.isEmpty())
1904 metaObjects.constLast().metaObject->d.superdata = mmo;
1905 else if (lastMetaObject)
1906 lastMetaObject->d.superdata = mmo;
1907 QQmlProxyMetaObject::ProxyData data = { mmo, extFunc, 0, 0 };
1908 metaObjects << data;
1909 registerMetaObjectForType(mmo, This);
1912 for (
const QQmlMetaTypeDataPtr data; mo; mo = mo->d.superdata) {
1919 if (
const QQmlTypePrivate *t = data->metaObjectToType.value(mo)) {
1920 if (t->regType == QQmlType::CppType) {
1921 createProxyMetaObject(
1922 t, t->baseMetaObject, t->extraData.cppTypeData->extMetaObject,
1923 t->extraData.cppTypeData->extFunc);
1924 }
else if (t->regType == QQmlType::SingletonType) {
1925 createProxyMetaObject(
1926 t, t->baseMetaObject, t->extraData.singletonTypeData->extMetaObject,
1927 t->extraData.singletonTypeData->extFunc);
1965const QMetaObject *QQmlMetaType::metaObjectForValueType(QMetaType metaType)
1967 switch (metaType.id()) {
1968 case QMetaType::QPoint:
1969 return &QQmlPointValueType::staticMetaObject;
1970 case QMetaType::QPointF:
1971 return &QQmlPointFValueType::staticMetaObject;
1972 case QMetaType::QSize:
1973 return &QQmlSizeValueType::staticMetaObject;
1974 case QMetaType::QSizeF:
1975 return &QQmlSizeFValueType::staticMetaObject;
1976 case QMetaType::QRect:
1977 return &QQmlRectValueType::staticMetaObject;
1978 case QMetaType::QRectF:
1979 return &QQmlRectFValueType::staticMetaObject;
1980#if QT_CONFIG(easingcurve)
1981 case QMetaType::QEasingCurve:
1982 return &QQmlEasingValueType::staticMetaObject;
1991 if (!(metaType.flags() & QMetaType::PointerToQObject)) {
1992 const QQmlMetaTypeDataPtr data;
1993 const QQmlTypePrivate *type = data->idToType.value(metaType.id());
1994 if (type && type->regType == QQmlType::CppType && type->typeId == metaType) {
1995 if (
const QMetaObject *mo = type->metaObjectForValueType())
2001 if (metaType.flags() & QMetaType::IsGadget)
2002 return metaType.metaObject();
2007QQmlValueType *QQmlMetaType::valueType(QMetaType type)
2009 QQmlMetaTypeDataPtr data;
2011 const auto it = data->metaTypeToValueType.constFind(type.id());
2012 if (it != data->metaTypeToValueType.constEnd())
2015 if (
const QMetaObject *mo = metaObjectForValueType(type))
2016 return *data->metaTypeToValueType.insert(type.id(),
new QQmlValueType(type, mo));
2017 return *data->metaTypeToValueType.insert(type.id(),
nullptr);
2026void QQmlMetaType::registerInternalCompositeType(
2027 const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit)
2029 QQmlMetaTypeDataPtr data;
2031 auto doInsert = [&data, &compilationUnit](
const QtPrivate::QMetaTypeInterface *iface) {
2033 Q_ASSERT(compilationUnit);
2038 auto it = data->compositeTypes.insert(iface, compilationUnit);
2044 const auto end = data->compositeTypes.end();
2045 while (++it != end && it.key() == iface) {
2046 if (*it == compilationUnit) {
2047 data->compositeTypes.erase(it);
2053 doInsert(compilationUnit->metaType().iface());
2054 for (
auto &&inlineData: compilationUnit->inlineComponentData)
2055 doInsert(inlineData.qmlType.typeId().iface());
2058void QQmlMetaType::unregisterInternalCompositeType(
2059 const QQmlRefPointer<QV4::CompiledData::CompilationUnit> &compilationUnit)
2061 QQmlMetaTypeDataPtr data;
2063 auto doRemove = [&](
const QtPrivate::QMetaTypeInterface *iface) {
2067 const auto [begin, end] = std::as_const(data->compositeTypes).equal_range(iface);
2068 for (
auto it = begin; it != end; ++it) {
2069 if (*it == compilationUnit) {
2070 QQmlMetaTypeData::clearCompositeType(compilationUnit);
2071 data->compositeTypes.erase(it);
2077 doRemove(compilationUnit->metaType().iface());
2078 for (
auto &&inlineData: compilationUnit->inlineComponentData)
2079 doRemove(inlineData.qmlType.typeId().iface());
2098QQmlRefPointer<QV4::CompiledData::CompilationUnit> QQmlMetaType::obtainCompilationUnit(
2101 const QUrl normalized = QQmlMetaType::normalizedUrl(url);
2102 QQmlMetaTypeDataPtr data;
2104 auto found = data->urlToType.constFind(normalized);
2105 if (found == data->urlToType.constEnd())
2106 return QQmlRefPointer<QV4::CompiledData::CompilationUnit>();
2109 const auto composite = data->compositeTypes.constFind(found.value()->typeId.iface());
2110 return composite == data->compositeTypes.constEnd()
2111 ? QQmlRefPointer<QV4::CompiledData::CompilationUnit>()
2112 : composite.value();