49class Q_QML_EXPORT QQmlTypeNameCache final :
public QQmlRefCounted<QQmlTypeNameCache>
52 QQmlTypeNameCache(
const QQmlRefPointer<QQmlImports> &imports) : m_imports(imports) {}
53 ~QQmlTypeNameCache() {}
55 inline bool isEmpty()
const;
57 void add(
const QHashedString &name,
int sciptIndex = -1,
const QHashedString &nameSpace = QHashedString());
58 void add(
const QHashedString &name,
const QUrl &url,
const QHashedString &nameSpace = QHashedString());
62 inline Result(
const QQmlImportRef *importNamespace);
63 inline Result(
const QQmlType &type);
64 inline Result(
int scriptIndex);
66 inline bool isValid()
const;
69 const QQmlImportRef *importNamespace;
73 enum class QueryNamespaced { No, Yes };
77 template<QQmlImport::RecursionRestriction recursionRestriction = QQmlImport::PreventRecursion>
78 Result query(
const QHashedStringRef &key, QQmlTypeLoader *typeLoader)
const
80 return doQuery<
const QHashedStringRef &, recursionRestriction>(key, typeLoader);
83 template<QueryNamespaced queryNamespaced = QueryNamespaced::Yes>
84 Result query(
const QHashedStringRef &key,
const QQmlImportRef *importNamespace,
85 QQmlTypeLoader *typeLoader)
const
87 return doQuery<
const QHashedStringRef &, queryNamespaced>(key, importNamespace, typeLoader);
90 template<QQmlImport::RecursionRestriction recursionRestriction = QQmlImport::PreventRecursion>
91 Result query(
const QV4::String *key, QQmlTypeLoader *typeLoader)
const
93 return doQuery<
const QV4::String *, recursionRestriction>(key, typeLoader);
96 template<QueryNamespaced queryNamespaced = QueryNamespaced::Yes>
97 Result query(
const QV4::String *key,
const QQmlImportRef *importNamespace,
98 QQmlTypeLoader *typeLoader)
const
100 return doQuery<
const QV4::String *, queryNamespaced>(key, importNamespace, typeLoader);
104 friend class QQmlImports;
106 static QHashedStringRef toHashedStringRef(
const QHashedStringRef &key) {
return key; }
107 static QHashedStringRef toHashedStringRef(
const QV4::String *key)
109 const QV4::Heap::String *heapString = key->d();
114 if (heapString->subtype >= QV4::Heap::String::StringType_Complex)
115 heapString->simplifyString();
120 const QStringPrivate &text = heapString->text();
121 return QHashedStringRef(QStringView(text.ptr, text.size));
124 static QString toQString(
const QHashedStringRef &key) {
return key.toString(); }
125 static QString toQString(
const QV4::String *key) {
return key->toQStringNoThrow(); }
127 template<
typename Key, QQmlImport::RecursionRestriction recursionRestriction>
128 Result doQuery(Key name, QQmlTypeLoader *typeLoader)
const
130 Result result = doQuery(m_namedImports, name);
132 if (!result.isValid())
133 result = typeSearch(m_anonymousImports, name);
135 if (!result.isValid())
136 result = doQuery(m_anonymousCompositeSingletons, name);
138 if (!result.isValid()) {
142 QQmlImportNamespace *typeNamespace =
nullptr;
143 QList<QQmlError> errors;
145 bool typeRecursionDetected =
false;
146 const bool typeFound = m_imports->resolveType(
147 typeLoader, toHashedStringRef(name), &t,
nullptr, &typeNamespace, &errors,
148 QQmlType::AnyRegistrationType,
149 recursionRestriction == QQmlImport::AllowRecursion
150 ? &typeRecursionDetected
160 template<
typename Key, QueryNamespaced queryNamespaced>
161 Result doQuery(Key name,
const QQmlImportRef *importNamespace, QQmlTypeLoader *typeLoader)
const
163 Q_ASSERT(importNamespace && importNamespace->scriptIndex == -1);
165 if constexpr (queryNamespaced == QueryNamespaced::Yes) {
166 QMap<
const QQmlImportRef *, QStringHash<QQmlImportRef> >::const_iterator it
167 = m_namespacedImports.constFind(importNamespace);
168 if (it != m_namespacedImports.constEnd()) {
169 Result r = doQuery(*it, name);
175 Result result = typeSearch(importNamespace->modules, name);
177 if (!result.isValid())
178 result = doQuery(importNamespace->compositeSingletons, name);
180 if (!result.isValid()) {
184 const QString qualifiedTypeName = importNamespace->m_qualifier + u'.' + toQString(name);
185 QQmlImportNamespace *typeNamespace =
nullptr;
186 QList<QQmlError> errors;
188 bool typeFound = m_imports->resolveType(
189 typeLoader, qualifiedTypeName, &t,
nullptr, &typeNamespace, &errors);
197 template<
typename Key>
198 Result doQuery(
const QStringHash<QQmlImportRef> &imports, Key key)
const
200 QQmlImportRef *i = imports.value(key);
202 Q_ASSERT(!i->m_qualifier.isEmpty());
203 if (i->scriptIndex != -1) {
204 return Result(i->scriptIndex);
213 template<
typename Key>
214 Result doQuery(
const QStringHash<QUrl> &urls, Key key)
const
216 QUrl *url = urls.value(key);
218 QQmlType type = QQmlMetaType::qmlType(*url);
225 template<
typename Key>
226 Result typeSearch(
const QList<QQmlTypeModuleVersion> &modules, Key key)
const
228 for (
auto it = modules.crbegin(), end = modules.crend(); it != end; ++it) {
229 QQmlType type = it->type(key);
237 QStringHash<QQmlImportRef> m_namedImports;
238 QMap<
const QQmlImportRef *, QStringHash<QQmlImportRef> > m_namespacedImports;
239 QList<QQmlTypeModuleVersion> m_anonymousImports;
240 QStringHash<QUrl> m_anonymousCompositeSingletons;
241 QQmlRefPointer<QQmlImports> m_imports;