123class Q_QML_EXPORT QQmlImports final :
public QQmlRefCounted<QQmlImports>
125 Q_DISABLE_COPY_MOVE(QQmlImports)
126 Q_DECLARE_TR_FUNCTIONS(QQmlImports)
128 enum ImportVersion { FullyVersioned, PartiallyVersioned, Unversioned };
130 enum ImportFlag : quint8 {
132 ImportIncomplete = 0x1,
134 Q_DECLARE_FLAGS(ImportFlags, ImportFlag)
136 QQmlImports() =
default;
139 while (QQmlImportNamespace *ns = m_qualifiedSets.takeFirst())
143 void setBaseUrl(
const QUrl &url,
const QString &urlString = QString());
144 QUrl baseUrl()
const {
return m_baseUrl; }
147 QQmlTypeLoader *typeLoader,
const QHashedStringRef &type, QQmlType *type_return,
148 QTypeRevision *version_return, QQmlImportNamespace **ns_return,
149 QList<QQmlError> *errors =
nullptr,
150 QQmlType::RegistrationType registrationType = QQmlType::AnyRegistrationType,
151 bool *typeRecursionDetected =
nullptr)
const;
153 const QQmlImportInstance *findImportByModuleUri(
const QString &uri,
154 QTypeRevision version)
const;
156 QTypeRevision addImplicitImport(
157 QQmlTypeLoader *typeLoader, QString *localQmldir, QList<QQmlError> *errors)
160 qCDebug(lcQmlImport) <<
"addImplicitImport:" << qPrintable(baseUrl().toString());
162 const ImportFlags flags =
163 ImportFlags(!isLocal(baseUrl()) ? ImportIncomplete : ImportNoFlag);
164 return addFileImport(
165 typeLoader, QLatin1String(
"."), QString(), QTypeRevision(), flags,
166 QQmlImportInstance::Implicit, localQmldir, errors);
169 bool addInlineComponentImport(
170 QQmlImportInstance *
const importInstance,
const QString &name,
const QUrl &importUrl);
172 QTypeRevision addFileImport(
173 QQmlTypeLoader *typeLoader,
const QString &uri,
const QString &prefix,
174 QTypeRevision requestedVersion, ImportFlags flags, quint8 precedence,
175 QString *localQmldir, QList<QQmlError> *errors);
177 QTypeRevision addLibraryImport(
178 QQmlTypeLoader *typeLoader,
const QString &uri,
const QString &prefix,
179 QTypeRevision requestedVersion,
const QString &qmldirIdentifier,
180 const QString &qmldirUrl, ImportFlags flags, quint8 precedence,
181 QList<QQmlError> *errors);
183 QTypeRevision updateQmldirContent(
184 QQmlTypeLoader *typeLoader,
const QString &uri, QTypeRevision version,
185 const QString &prefix,
const QString &qmldirIdentifier,
const QString &qmldirUrl,
186 QList<QQmlError> *errors);
188 void populateCache(QQmlTypeNameCache *cache)
const;
190 struct ScriptReference
198 QList<ScriptReference> resolvedScripts()
const;
200 struct CompositeSingletonReference
204 QTypeRevision version;
207 QList<CompositeSingletonReference> resolvedCompositeSingletons()
const;
209 static QStringList completeQmldirPaths(
210 const QString &uri,
const QStringList &basePaths, QTypeRevision version);
212 static QString versionString(QTypeRevision version, ImportVersion importVersion);
214 static bool isLocal(
const QString &url)
216 return !QQmlFile::urlToLocalFileOrQrc(url).isEmpty();
219 static bool isLocal(
const QUrl &url)
221 return !QQmlFile::urlToLocalFileOrQrc(url).isEmpty();
224 static QUrl urlFromLocalFileOrQrcOrUrl(
const QString &);
226 static void setDesignerSupportRequired(
bool b);
228 static QTypeRevision validVersion(QTypeRevision version = QTypeRevision());
230 static QQmlError moduleNotFoundError(
const QString &uri, QTypeRevision version);
232 static QString redirectQmldirContent(QQmlTypeLoader *typeLoader,
233 QQmlTypeLoaderQmldirContent *qmldir);
236 enum class IsLibrary :
bool { No =
false, Yes =
true };
238 static void insertImport(QQmlImportNamespace *nameSpace, QQmlImportInstance *import)
240 for (
auto it = nameSpace->imports.cbegin(), end = nameSpace->imports.cend();
242 if ((*it)->precedence < import->precedence)
245 nameSpace->imports.insert(it, import);
248 nameSpace->imports.append(import);
251 template<IsLibrary isLibrary>
252 static QQmlImportInstance *addImportToNamespace(
253 QQmlImportNamespace *nameSpace,
const QString &uri,
const QString &url,
254 QTypeRevision version, quint8 precedence)
257 Q_ASSERT(url.isEmpty() || url.endsWith(QLatin1Char(
'/')));
259 QQmlImportInstance *import =
new QQmlImportInstance;
262 import->version = version;
263 import->isLibrary =
bool(isLibrary);
264 import->precedence = precedence;
265 import->implicitlyImported = precedence >= QQmlImportInstance::Implicit;
267 insertImport(nameSpace, import);
271 QQmlImportNamespace *importNamespace(
const QString &prefix);
274 QQmlTypeLoader *typeLoader,
const QHashedStringRef &type, QTypeRevision *version_return,
275 QQmlType *type_return, QList<QQmlError> *errors,
276 QQmlType::RegistrationType registrationType,
277 bool *typeRecursionDetected =
nullptr)
const;
279 QQmlImportNamespace *findQualifiedNamespace(
const QHashedStringRef &)
const;
281 QTypeRevision importExtension(
282 QQmlTypeLoader *typeLoader,
const QString &uri, QTypeRevision version,
283 const QQmlTypeLoaderQmldirContent *qmldir, QList<QQmlError> *errors);
285 void registerBuiltinModuleTypes(
286 const QQmlTypeLoaderQmldirContent &qmldir, QTypeRevision version);
288 bool getQmldirContent(
289 QQmlTypeLoader *typeLoader,
const QString &qmldirIdentifier,
const QString &uri,
290 QQmlTypeLoaderQmldirContent *qmldir, QList<QQmlError> *errors);
292 QString resolvedUri(
const QString &dir_arg, QQmlTypeLoader *typeLoader);
294 template<IsLibrary isLibrary,
typename Handler>
295 QTypeRevision finalizeImport(
296 QQmlImportNamespace *nameSpace,
const QQmlTypeLoaderQmldirContent &qmldir,
297 const QString &importUri,
const QString &url, quint8 precedence,
298 QTypeRevision requestedVersion, QTypeRevision importedVersion,
299 QList<QQmlError> *errors, Handler &&handler)
301 QQmlImportInstance *inserted = addImportToNamespace<isLibrary>(
302 nameSpace, importUri, url, requestedVersion, precedence);
305 registerBuiltinModuleTypes(qmldir, importedVersion);
307 if (!inserted->setQmldirContent(url, qmldir, nameSpace, errors))
308 return QTypeRevision();
310 return handler(inserted);
313 template<IsLibrary isLibrary>
314 QTypeRevision finalizeImport(
315 QQmlImportNamespace *nameSpace,
const QQmlTypeLoaderQmldirContent &qmldir,
316 const QString &importUri,
const QString &url, quint8 precedence,
317 QTypeRevision requestedVersion, QTypeRevision importedVersion,
318 QList<QQmlError> *errors)
320 return finalizeImport<isLibrary>(
321 nameSpace, qmldir, importUri, url, precedence, requestedVersion, importedVersion,
322 errors, [importedVersion](QQmlImportInstance *inserted) {
324 Q_ASSERT(importedVersion.isValid());
325 return importedVersion;
336 mutable QQmlImportNamespace m_unqualifiedset;
339 QFieldList<QQmlImportNamespace, &QQmlImportNamespace::nextNamespace> m_qualifiedSets;