121class Q_QML_EXPORT QQmlImports final :
public QQmlRefCounted<QQmlImports>
123 Q_DISABLE_COPY_MOVE(QQmlImports)
124 Q_DECLARE_TR_FUNCTIONS(QQmlImports)
126 enum ImportVersion { FullyVersioned, PartiallyVersioned, Unversioned };
128 enum ImportFlag : quint8 {
130 ImportIncomplete = 0x1,
132 Q_DECLARE_FLAGS(ImportFlags, ImportFlag)
134 QQmlImports() =
default;
137 while (QQmlImportNamespace *ns = m_qualifiedSets.takeFirst())
141 void setBaseUrl(
const QUrl &url,
const QString &urlString = QString());
142 QUrl baseUrl()
const {
return m_baseUrl; }
145 QQmlTypeLoader *typeLoader,
const QHashedStringRef &type, QQmlType *type_return,
146 QTypeRevision *version_return, QQmlImportNamespace **ns_return,
147 QList<QQmlError> *errors =
nullptr,
148 QQmlType::RegistrationType registrationType = QQmlType::AnyRegistrationType,
149 bool *typeRecursionDetected =
nullptr)
const;
151 QTypeRevision addImplicitImport(
152 QQmlTypeLoader *typeLoader, QString *localQmldir, QList<QQmlError> *errors)
155 qCDebug(lcQmlImport) <<
"addImplicitImport:" << qPrintable(baseUrl().toString());
157 const ImportFlags flags =
158 ImportFlags(!isLocal(baseUrl()) ? ImportIncomplete : ImportNoFlag);
159 return addFileImport(
160 typeLoader, QLatin1String(
"."), QString(), QTypeRevision(), flags,
161 QQmlImportInstance::Implicit, localQmldir, errors);
164 bool addInlineComponentImport(
165 QQmlImportInstance *
const importInstance,
const QString &name,
const QUrl &importUrl);
167 QTypeRevision addFileImport(
168 QQmlTypeLoader *typeLoader,
const QString &uri,
const QString &prefix,
169 QTypeRevision requestedVersion, ImportFlags flags, quint8 precedence,
170 QString *localQmldir, QList<QQmlError> *errors);
172 QTypeRevision addLibraryImport(
173 QQmlTypeLoader *typeLoader,
const QString &uri,
const QString &prefix,
174 QTypeRevision requestedVersion,
const QString &qmldirIdentifier,
175 const QString &qmldirUrl, ImportFlags flags, quint8 precedence,
176 QList<QQmlError> *errors);
178 QTypeRevision updateQmldirContent(
179 QQmlTypeLoader *typeLoader,
const QString &uri, QTypeRevision version,
180 const QString &prefix,
const QString &qmldirIdentifier,
const QString &qmldirUrl,
181 QList<QQmlError> *errors);
183 void populateCache(QQmlTypeNameCache *cache)
const;
185 struct ScriptReference
193 QList<ScriptReference> resolvedScripts()
const;
195 struct CompositeSingletonReference
199 QTypeRevision version;
202 QList<CompositeSingletonReference> resolvedCompositeSingletons()
const;
204 static QStringList completeQmldirPaths(
205 const QString &uri,
const QStringList &basePaths, QTypeRevision version);
207 static QString versionString(QTypeRevision version, ImportVersion importVersion);
209 static bool isLocal(
const QString &url)
211 return !QQmlFile::urlToLocalFileOrQrc(url).isEmpty();
214 static bool isLocal(
const QUrl &url)
216 return !QQmlFile::urlToLocalFileOrQrc(url).isEmpty();
219 static QUrl urlFromLocalFileOrQrcOrUrl(
const QString &);
221 static void setDesignerSupportRequired(
bool b);
223 static QTypeRevision validVersion(QTypeRevision version = QTypeRevision());
225 static QQmlError moduleNotFoundError(
const QString &uri, QTypeRevision version);
228 enum class IsLibrary :
bool { No =
false, Yes =
true };
230 static void insertImport(QQmlImportNamespace *nameSpace, QQmlImportInstance *import)
232 for (
auto it = nameSpace->imports.cbegin(), end = nameSpace->imports.cend();
234 if ((*it)->precedence < import->precedence)
237 nameSpace->imports.insert(it, import);
240 nameSpace->imports.append(import);
243 template<IsLibrary isLibrary>
244 static QQmlImportInstance *addImportToNamespace(
245 QQmlImportNamespace *nameSpace,
const QString &uri,
const QString &url,
246 QTypeRevision version, quint8 precedence)
249 Q_ASSERT(url.isEmpty() || url.endsWith(QLatin1Char(
'/')));
251 QQmlImportInstance *import =
new QQmlImportInstance;
254 import->version = version;
255 import->isLibrary =
bool(isLibrary);
256 import->precedence = precedence;
257 import->implicitlyImported = precedence >= QQmlImportInstance::Implicit;
259 insertImport(nameSpace, import);
263 QQmlImportNamespace *importNamespace(
const QString &prefix);
266 QQmlTypeLoader *typeLoader,
const QHashedStringRef &type, QTypeRevision *version_return,
267 QQmlType *type_return, QList<QQmlError> *errors,
268 QQmlType::RegistrationType registrationType,
269 bool *typeRecursionDetected =
nullptr)
const;
271 QQmlImportNamespace *findQualifiedNamespace(
const QHashedStringRef &)
const;
273 QTypeRevision importExtension(
274 QQmlTypeLoader *typeLoader,
const QString &uri, QTypeRevision version,
275 const QQmlTypeLoaderQmldirContent *qmldir, QList<QQmlError> *errors);
277 void registerBuiltinModuleTypes(
278 const QQmlTypeLoaderQmldirContent &qmldir, QTypeRevision version);
280 QString redirectQmldirContent(
281 QQmlTypeLoader *typeLoader, QQmlTypeLoaderQmldirContent *qmldir);
283 bool getQmldirContent(
284 QQmlTypeLoader *typeLoader,
const QString &qmldirIdentifier,
const QString &uri,
285 QQmlTypeLoaderQmldirContent *qmldir, QList<QQmlError> *errors);
287 QString resolvedUri(
const QString &dir_arg, QQmlTypeLoader *typeLoader);
289 template<IsLibrary isLibrary,
typename Handler>
290 QTypeRevision finalizeImport(
291 QQmlImportNamespace *nameSpace,
const QQmlTypeLoaderQmldirContent &qmldir,
292 const QString &importUri,
const QString &url, quint8 precedence,
293 QTypeRevision requestedVersion, QTypeRevision importedVersion,
294 QList<QQmlError> *errors, Handler &&handler)
296 QQmlImportInstance *inserted = addImportToNamespace<isLibrary>(
297 nameSpace, importUri, url, requestedVersion, precedence);
300 registerBuiltinModuleTypes(qmldir, importedVersion);
302 if (!inserted->setQmldirContent(url, qmldir, nameSpace, errors))
303 return QTypeRevision();
305 return handler(inserted);
308 template<IsLibrary isLibrary>
309 QTypeRevision finalizeImport(
310 QQmlImportNamespace *nameSpace,
const QQmlTypeLoaderQmldirContent &qmldir,
311 const QString &importUri,
const QString &url, quint8 precedence,
312 QTypeRevision requestedVersion, QTypeRevision importedVersion,
313 QList<QQmlError> *errors)
315 return finalizeImport<isLibrary>(
316 nameSpace, qmldir, importUri, url, precedence, requestedVersion, importedVersion,
317 errors, [importedVersion](QQmlImportInstance *inserted) {
319 Q_ASSERT(importedVersion.isValid());
320 return importedVersion;
331 mutable QQmlImportNamespace m_unqualifiedset;
334 QFieldList<QQmlImportNamespace, &QQmlImportNamespace::nextNamespace> m_qualifiedSets;