48class Q_QML_EXPORT QQmlTypeNameCache final :
public QQmlRefCounted<QQmlTypeNameCache>
51 QQmlTypeNameCache(
const QQmlRefPointer<QQmlImports> &imports) : m_imports(imports) {}
52 ~QQmlTypeNameCache() {}
54 inline bool isEmpty()
const;
56 void add(
const QHashedString &name,
int sciptIndex = -1,
const QHashedString &nameSpace = QHashedString());
57 void add(
const QHashedString &name,
const QUrl &url,
const QHashedString &nameSpace = QHashedString());
61 inline Result(
const QQmlImportRef *importNamespace);
62 inline Result(
const QQmlType &type);
63 inline Result(
int scriptIndex);
65 inline bool isValid()
const;
68 const QQmlImportRef *importNamespace;
72 enum class QueryNamespaced { No, Yes };
76 template<QQmlImport::RecursionRestriction recursionRestriction = QQmlImport::PreventRecursion>
77 Result query(
const QHashedStringRef &key, QQmlTypeLoader *typeLoader)
const
79 return doQuery<
const QHashedStringRef &, recursionRestriction>(key, typeLoader);
82 template<QueryNamespaced queryNamespaced = QueryNamespaced::Yes>
83 Result query(
const QHashedStringRef &key,
const QQmlImportRef *importNamespace,
84 QQmlTypeLoader *typeLoader)
const
86 return doQuery<
const QHashedStringRef &, queryNamespaced>(key, importNamespace, typeLoader);
89 template<QQmlImport::RecursionRestriction recursionRestriction = QQmlImport::PreventRecursion>
90 Result query(
const QV4::String *key, QQmlTypeLoader *typeLoader)
const
92 return doQuery<
const QV4::String *, recursionRestriction>(key, typeLoader);
95 template<QueryNamespaced queryNamespaced = QueryNamespaced::Yes>
96 Result query(
const QV4::String *key,
const QQmlImportRef *importNamespace,
97 QQmlTypeLoader *typeLoader)
const
99 return doQuery<
const QV4::String *, queryNamespaced>(key, importNamespace, typeLoader);
103 friend class QQmlImports;
105 static QHashedStringRef toHashedStringRef(
const QHashedStringRef &key) {
return key; }
106 static QHashedStringRef toHashedStringRef(
const QV4::String *key)
108 const QV4::Heap::String *heapString = key->d();
113 if (heapString->subtype >= QV4::Heap::String::StringType_Complex)
114 heapString->simplifyString();
119 const QStringPrivate &text = heapString->text();
120 return QHashedStringRef(QStringView(text.ptr, text.size));
123 static QString toQString(
const QHashedStringRef &key) {
return key.toString(); }
124 static QString toQString(
const QV4::String *key) {
return key->toQStringNoThrow(); }
126 template<
typename Key, QQmlImport::RecursionRestriction recursionRestriction>
127 Result doQuery(Key name, QQmlTypeLoader *typeLoader)
const
129 Result result = doQuery(m_namedImports, name);
131 if (!result.isValid())
132 result = typeSearch(m_anonymousImports, name);
134 if (!result.isValid())
135 result = doQuery(m_anonymousCompositeSingletons, name);
137 if (!result.isValid()) {
141 QQmlImportNamespace *typeNamespace =
nullptr;
142 QList<QQmlError> errors;
144 bool typeRecursionDetected =
false;
145 const bool typeFound = m_imports->resolveType(
146 typeLoader, toHashedStringRef(name), &t,
nullptr, &typeNamespace, &errors,
147 QQmlType::AnyRegistrationType,
148 recursionRestriction == QQmlImport::AllowRecursion
149 ? &typeRecursionDetected
159 template<
typename Key, QueryNamespaced queryNamespaced>
160 Result doQuery(Key name,
const QQmlImportRef *importNamespace, QQmlTypeLoader *typeLoader)
const
162 Q_ASSERT(importNamespace && importNamespace->scriptIndex == -1);
164 if constexpr (queryNamespaced == QueryNamespaced::Yes) {
165 QMap<
const QQmlImportRef *, QStringHash<QQmlImportRef> >::const_iterator it
166 = m_namespacedImports.constFind(importNamespace);
167 if (it != m_namespacedImports.constEnd()) {
168 Result r = doQuery(*it, name);
174 Result result = typeSearch(importNamespace->modules, name);
176 if (!result.isValid())
177 result = doQuery(importNamespace->compositeSingletons, name);
179 if (!result.isValid()) {
183 const QString qualifiedTypeName = importNamespace->m_qualifier + u'.' + toQString(name);
184 QQmlImportNamespace *typeNamespace =
nullptr;
185 QList<QQmlError> errors;
187 bool typeFound = m_imports->resolveType(
188 typeLoader, qualifiedTypeName, &t,
nullptr, &typeNamespace, &errors);
196 template<
typename Key>
197 Result doQuery(
const QStringHash<QQmlImportRef> &imports, Key key)
const
199 QQmlImportRef *i = imports.value(key);
201 Q_ASSERT(!i->m_qualifier.isEmpty());
202 if (i->scriptIndex != -1) {
203 return Result(i->scriptIndex);
212 template<
typename Key>
213 Result doQuery(
const QStringHash<QUrl> &urls, Key key)
const
215 QUrl *url = urls.value(key);
217 QQmlType type = QQmlMetaType::qmlType(*url);
224 template<
typename Key>
225 Result typeSearch(
const QVector<QQmlTypeModuleVersion> &modules, Key key)
const
227 for (
auto it = modules.crbegin(), end = modules.crend(); it != end; ++it) {
228 QQmlType type = it->type(key);
236 QStringHash<QQmlImportRef> m_namedImports;
237 QMap<
const QQmlImportRef *, QStringHash<QQmlImportRef> > m_namespacedImports;
238 QVector<QQmlTypeModuleVersion> m_anonymousImports;
239 QStringHash<QUrl> m_anonymousCompositeSingletons;
240 QQmlRefPointer<QQmlImports> m_imports;