122class Q_QML_EXPORT QQmlImports final :
public QQmlRefCounted<QQmlImports>
124 Q_DISABLE_COPY_MOVE(QQmlImports)
125 Q_DECLARE_TR_FUNCTIONS(QQmlImports)
127 enum ImportVersion { FullyVersioned, PartiallyVersioned, Unversioned };
129 enum ImportFlag : quint8 {
131 ImportIncomplete = 0x1,
133 Q_DECLARE_FLAGS(ImportFlags, ImportFlag)
135 QQmlImports() =
default;
138 while (QQmlImportNamespace *ns = m_qualifiedSets.takeFirst())
142 void setBaseUrl(
const QUrl &url,
const QString &urlString = QString());
143 QUrl baseUrl()
const {
return m_baseUrl; }
146 QQmlTypeLoader *typeLoader,
const QHashedStringRef &type, QQmlType *type_return,
147 QTypeRevision *version_return, QQmlImportNamespace **ns_return,
148 QList<QQmlError> *errors =
nullptr,
149 QQmlType::RegistrationType registrationType = QQmlType::AnyRegistrationType,
150 bool *typeRecursionDetected =
nullptr)
const;
152 QTypeRevision addImplicitImport(
153 QQmlTypeLoader *typeLoader, QString *localQmldir, QList<QQmlError> *errors)
156 qCDebug(lcQmlImport) <<
"addImplicitImport:" << qPrintable(baseUrl().toString());
158 const ImportFlags flags =
159 ImportFlags(!isLocal(baseUrl()) ? ImportIncomplete : ImportNoFlag);
160 return addFileImport(
161 typeLoader, QLatin1String(
"."), QString(), QTypeRevision(), flags,
162 QQmlImportInstance::Implicit, localQmldir, errors);
165 bool addInlineComponentImport(
166 QQmlImportInstance *
const importInstance,
const QString &name,
const QUrl &importUrl);
168 QTypeRevision addFileImport(
169 QQmlTypeLoader *typeLoader,
const QString &uri,
const QString &prefix,
170 QTypeRevision requestedVersion, ImportFlags flags, quint8 precedence,
171 QString *localQmldir, QList<QQmlError> *errors);
173 QTypeRevision addLibraryImport(
174 QQmlTypeLoader *typeLoader,
const QString &uri,
const QString &prefix,
175 QTypeRevision requestedVersion,
const QString &qmldirIdentifier,
176 const QString &qmldirUrl, ImportFlags flags, quint8 precedence,
177 QList<QQmlError> *errors);
179 QTypeRevision updateQmldirContent(
180 QQmlTypeLoader *typeLoader,
const QString &uri, QTypeRevision version,
181 const QString &prefix,
const QString &qmldirIdentifier,
const QString &qmldirUrl,
182 QList<QQmlError> *errors);
184 void populateCache(QQmlTypeNameCache *cache)
const;
186 struct ScriptReference
194 QList<ScriptReference> resolvedScripts()
const;
196 struct CompositeSingletonReference
200 QTypeRevision version;
203 QList<CompositeSingletonReference> resolvedCompositeSingletons()
const;
205 static QStringList completeQmldirPaths(
206 const QString &uri,
const QStringList &basePaths, QTypeRevision version);
208 static QString versionString(QTypeRevision version, ImportVersion importVersion);
210 static bool isLocal(
const QString &url)
212 return !QQmlFile::urlToLocalFileOrQrc(url).isEmpty();
215 static bool isLocal(
const QUrl &url)
217 return !QQmlFile::urlToLocalFileOrQrc(url).isEmpty();
220 static QUrl urlFromLocalFileOrQrcOrUrl(
const QString &);
222 static void setDesignerSupportRequired(
bool b);
224 static QTypeRevision validVersion(QTypeRevision version = QTypeRevision());
226 static QQmlError moduleNotFoundError(
const QString &uri, QTypeRevision version);
229 enum class IsLibrary :
bool { No =
false, Yes =
true };
231 static void insertImport(QQmlImportNamespace *nameSpace, QQmlImportInstance *import)
233 for (
auto it = nameSpace->imports.cbegin(), end = nameSpace->imports.cend();
235 if ((*it)->precedence < import->precedence)
238 nameSpace->imports.insert(it, import);
241 nameSpace->imports.append(import);
244 template<IsLibrary isLibrary>
245 static QQmlImportInstance *addImportToNamespace(
246 QQmlImportNamespace *nameSpace,
const QString &uri,
const QString &url,
247 QTypeRevision version, quint8 precedence)
250 Q_ASSERT(url.isEmpty() || url.endsWith(QLatin1Char(
'/')));
252 QQmlImportInstance *import =
new QQmlImportInstance;
255 import->version = version;
256 import->isLibrary =
bool(isLibrary);
257 import->precedence = precedence;
258 import->implicitlyImported = precedence >= QQmlImportInstance::Implicit;
260 insertImport(nameSpace, import);
264 QQmlImportNamespace *importNamespace(
const QString &prefix);
267 QQmlTypeLoader *typeLoader,
const QHashedStringRef &type, QTypeRevision *version_return,
268 QQmlType *type_return, QList<QQmlError> *errors,
269 QQmlType::RegistrationType registrationType,
270 bool *typeRecursionDetected =
nullptr)
const;
272 QQmlImportNamespace *findQualifiedNamespace(
const QHashedStringRef &)
const;
274 QTypeRevision importExtension(
275 QQmlTypeLoader *typeLoader,
const QString &uri, QTypeRevision version,
276 const QQmlTypeLoaderQmldirContent *qmldir, QList<QQmlError> *errors);
278 void registerBuiltinModuleTypes(
279 const QQmlTypeLoaderQmldirContent &qmldir, QTypeRevision version);
281 QString redirectQmldirContent(
282 QQmlTypeLoader *typeLoader, QQmlTypeLoaderQmldirContent *qmldir);
284 bool getQmldirContent(
285 QQmlTypeLoader *typeLoader,
const QString &qmldirIdentifier,
const QString &uri,
286 QQmlTypeLoaderQmldirContent *qmldir, QList<QQmlError> *errors);
288 QString resolvedUri(
const QString &dir_arg, QQmlTypeLoader *typeLoader);
290 template<IsLibrary isLibrary,
typename Handler>
291 QTypeRevision finalizeImport(
292 QQmlImportNamespace *nameSpace,
const QQmlTypeLoaderQmldirContent &qmldir,
293 const QString &importUri,
const QString &url, quint8 precedence,
294 QTypeRevision requestedVersion, QTypeRevision importedVersion,
295 QList<QQmlError> *errors, Handler &&handler)
297 QQmlImportInstance *inserted = addImportToNamespace<isLibrary>(
298 nameSpace, importUri, url, requestedVersion, precedence);
301 registerBuiltinModuleTypes(qmldir, importedVersion);
303 if (!inserted->setQmldirContent(url, qmldir, nameSpace, errors))
304 return QTypeRevision();
306 return handler(inserted);
309 template<IsLibrary isLibrary>
310 QTypeRevision finalizeImport(
311 QQmlImportNamespace *nameSpace,
const QQmlTypeLoaderQmldirContent &qmldir,
312 const QString &importUri,
const QString &url, quint8 precedence,
313 QTypeRevision requestedVersion, QTypeRevision importedVersion,
314 QList<QQmlError> *errors)
316 return finalizeImport<isLibrary>(
317 nameSpace, qmldir, importUri, url, precedence, requestedVersion, importedVersion,
318 errors, [importedVersion](QQmlImportInstance *inserted) {
320 Q_ASSERT(importedVersion.isValid());
321 return importedVersion;
332 mutable QQmlImportNamespace m_unqualifiedset;
335 QFieldList<QQmlImportNamespace, &QQmlImportNamespace::nextNamespace> m_qualifiedSets;