49class Q_QML_EXPORT QQmlTypeNameCache final :
public QQmlRefCounted<QQmlTypeNameCache>
52 QQmlTypeNameCache(
const QQmlRefPointer<QQmlImports> &imports) : m_imports(imports) {}
53 ~QQmlTypeNameCache() {}
55 const QQmlImportInstance *findImportByModuleUri(
const QString &uri, QTypeRevision version)
const
57 return m_imports->findImportByModuleUri(uri, version);
60 inline bool isEmpty()
const;
62 void add(
const QHashedString &name,
int sciptIndex = -1,
const QHashedString &nameSpace = QHashedString());
63 void add(
const QHashedString &name,
const QUrl &url,
const QHashedString &nameSpace = QHashedString());
67 inline Result(
const QQmlImportRef *importNamespace);
68 inline Result(
const QQmlType &type);
69 inline Result(
int scriptIndex);
71 inline bool isValid()
const;
74 const QQmlImportRef *importNamespace;
78 enum class QueryNamespaced { No, Yes };
82 template<QQmlImport::RecursionRestriction recursionRestriction = QQmlImport::PreventRecursion>
83 Result query(
const QHashedStringRef &key, QQmlTypeLoader *typeLoader)
const
85 return doQuery<
const QHashedStringRef &, recursionRestriction>(key, typeLoader);
88 template<QueryNamespaced queryNamespaced = QueryNamespaced::Yes>
89 Result query(
const QHashedStringRef &key,
const QQmlImportRef *importNamespace,
90 QQmlTypeLoader *typeLoader)
const
92 return doQuery<
const QHashedStringRef &, queryNamespaced>(key, importNamespace, typeLoader);
95 template<QQmlImport::RecursionRestriction recursionRestriction = QQmlImport::PreventRecursion>
96 Result query(
const QV4::String *key, QQmlTypeLoader *typeLoader)
const
98 return doQuery<
const QV4::String *, recursionRestriction>(key, typeLoader);
101 template<QueryNamespaced queryNamespaced = QueryNamespaced::Yes>
102 Result query(
const QV4::String *key,
const QQmlImportRef *importNamespace,
103 QQmlTypeLoader *typeLoader)
const
105 return doQuery<
const QV4::String *, queryNamespaced>(key, importNamespace, typeLoader);
109 friend class QQmlImports;
111 static QHashedStringRef toHashedStringRef(
const QHashedStringRef &key) {
return key; }
112 static QHashedStringRef toHashedStringRef(
const QV4::String *key)
114 const QV4::Heap::String *heapString = key->d();
119 if (heapString->subtype >= QV4::Heap::String::StringType_Complex)
120 heapString->simplifyString();
125 const QStringPrivate &text = heapString->text();
126 return QHashedStringRef(QStringView(text.ptr, text.size));
129 static QString toQString(
const QHashedStringRef &key) {
return key.toString(); }
130 static QString toQString(
const QV4::String *key) {
return key->toQStringNoThrow(); }
132 template<
typename Key, QQmlImport::RecursionRestriction recursionRestriction>
133 Result doQuery(Key name, QQmlTypeLoader *typeLoader)
const
135 Result result = doQuery(m_namedImports, name);
137 if (!result.isValid())
138 result = typeSearch(m_anonymousImports, name);
140 if (!result.isValid())
141 result = doQuery(m_anonymousCompositeSingletons, name);
143 if (!result.isValid()) {
147 QQmlImportNamespace *typeNamespace =
nullptr;
148 QList<QQmlError> errors;
150 bool typeRecursionDetected =
false;
151 const bool typeFound = m_imports->resolveType(
152 typeLoader, toHashedStringRef(name), &t,
nullptr, &typeNamespace, &errors,
153 QQmlType::AnyRegistrationType,
154 recursionRestriction == QQmlImport::AllowRecursion
155 ? &typeRecursionDetected
165 template<
typename Key, QueryNamespaced queryNamespaced>
166 Result doQuery(Key name,
const QQmlImportRef *importNamespace, QQmlTypeLoader *typeLoader)
const
168 Q_ASSERT(importNamespace && importNamespace->scriptIndex == -1);
170 if constexpr (queryNamespaced == QueryNamespaced::Yes) {
171 const auto it = m_namespacedImports.constFind(importNamespace);
172 if (it != m_namespacedImports.constEnd()) {
173 Result r = doQuery(*it, name);
179 Result result = typeSearch(importNamespace->modules, name);
181 if (!result.isValid())
182 result = doQuery(importNamespace->compositeSingletons, name);
184 if (!result.isValid()) {
188 const QString qualifiedTypeName = importNamespace->m_qualifier + u'.' + toQString(name);
189 QQmlImportNamespace *typeNamespace =
nullptr;
190 QList<QQmlError> errors;
192 bool typeFound = m_imports->resolveType(
193 typeLoader, qualifiedTypeName, &t,
nullptr, &typeNamespace, &errors);
201 template<
typename Key>
202 Result doQuery(
const QStringHash<QQmlImportRef> &imports, Key key)
const
204 QQmlImportRef *i = imports.value(key);
206 Q_ASSERT(!i->m_qualifier.isEmpty());
207 if (i->scriptIndex != -1) {
208 return Result(i->scriptIndex);
217 template<
typename Key>
218 Result doQuery(
const QStringHash<QUrl> &urls, Key key)
const
220 QUrl *url = urls.value(key);
222 QQmlType type = QQmlMetaType::qmlType(*url);
229 template<
typename Key>
230 Result typeSearch(
const QList<QQmlTypeModuleVersion> &modules, Key key)
const
232 for (
auto it = modules.crbegin(), end = modules.crend(); it != end; ++it) {
233 QQmlType type = it->type(key);
241 QStringHash<QQmlImportRef> m_namedImports;
242 QHash<
const QQmlImportRef *, QStringHash<QQmlImportRef>> m_namespacedImports;
243 QList<QQmlTypeModuleVersion> m_anonymousImports;
244 QStringHash<QUrl> m_anonymousCompositeSingletons;
245 QQmlRefPointer<QQmlImports> m_imports;