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 QTypeRevision addImplicitImport(
154 QQmlTypeLoader *typeLoader, QString *localQmldir, QList<QQmlError> *errors)
157 qCDebug(lcQmlImport) <<
"addImplicitImport:" << qPrintable(baseUrl().toString());
159 const ImportFlags flags =
160 ImportFlags(!isLocal(baseUrl()) ? ImportIncomplete : ImportNoFlag);
161 return addFileImport(
162 typeLoader, QLatin1String(
"."), QString(), QTypeRevision(), flags,
163 QQmlImportInstance::Implicit, localQmldir, errors);
166 bool addInlineComponentImport(
167 QQmlImportInstance *
const importInstance,
const QString &name,
const QUrl &importUrl);
169 QTypeRevision addFileImport(
170 QQmlTypeLoader *typeLoader,
const QString &uri,
const QString &prefix,
171 QTypeRevision requestedVersion, ImportFlags flags, quint8 precedence,
172 QString *localQmldir, QList<QQmlError> *errors);
174 QTypeRevision addLibraryImport(
175 QQmlTypeLoader *typeLoader,
const QString &uri,
const QString &prefix,
176 QTypeRevision requestedVersion,
const QString &qmldirIdentifier,
177 const QString &qmldirUrl, ImportFlags flags, quint8 precedence,
178 QList<QQmlError> *errors);
180 QTypeRevision updateQmldirContent(
181 QQmlTypeLoader *typeLoader,
const QString &uri, QTypeRevision version,
182 const QString &prefix,
const QString &qmldirIdentifier,
const QString &qmldirUrl,
183 QList<QQmlError> *errors);
185 void populateCache(QQmlTypeNameCache *cache)
const;
187 struct ScriptReference
195 QList<ScriptReference> resolvedScripts()
const;
197 struct CompositeSingletonReference
201 QTypeRevision version;
204 QList<CompositeSingletonReference> resolvedCompositeSingletons()
const;
206 static QStringList completeQmldirPaths(
207 const QString &uri,
const QStringList &basePaths, QTypeRevision version);
209 static QString versionString(QTypeRevision version, ImportVersion importVersion);
211 static bool isLocal(
const QString &url)
213 return !QQmlFile::urlToLocalFileOrQrc(url).isEmpty();
216 static bool isLocal(
const QUrl &url)
218 return !QQmlFile::urlToLocalFileOrQrc(url).isEmpty();
221 static QUrl urlFromLocalFileOrQrcOrUrl(
const QString &);
223 static void setDesignerSupportRequired(
bool b);
225 static QTypeRevision validVersion(QTypeRevision version = QTypeRevision());
227 static QQmlError moduleNotFoundError(
const QString &uri, QTypeRevision version);
230 enum class IsLibrary :
bool { No =
false, Yes =
true };
232 static void insertImport(QQmlImportNamespace *nameSpace, QQmlImportInstance *import)
234 for (
auto it = nameSpace->imports.cbegin(), end = nameSpace->imports.cend();
236 if ((*it)->precedence < import->precedence)
239 nameSpace->imports.insert(it, import);
242 nameSpace->imports.append(import);
245 template<IsLibrary isLibrary>
246 static QQmlImportInstance *addImportToNamespace(
247 QQmlImportNamespace *nameSpace,
const QString &uri,
const QString &url,
248 QTypeRevision version, quint8 precedence)
251 Q_ASSERT(url.isEmpty() || url.endsWith(QLatin1Char(
'/')));
253 QQmlImportInstance *import =
new QQmlImportInstance;
256 import->version = version;
257 import->isLibrary =
bool(isLibrary);
258 import->precedence = precedence;
259 import->implicitlyImported = precedence >= QQmlImportInstance::Implicit;
261 insertImport(nameSpace, import);
265 QQmlImportNamespace *importNamespace(
const QString &prefix);
268 QQmlTypeLoader *typeLoader,
const QHashedStringRef &type, QTypeRevision *version_return,
269 QQmlType *type_return, QList<QQmlError> *errors,
270 QQmlType::RegistrationType registrationType,
271 bool *typeRecursionDetected =
nullptr)
const;
273 QQmlImportNamespace *findQualifiedNamespace(
const QHashedStringRef &)
const;
275 QTypeRevision importExtension(
276 QQmlTypeLoader *typeLoader,
const QString &uri, QTypeRevision version,
277 const QQmlTypeLoaderQmldirContent *qmldir, QList<QQmlError> *errors);
279 void registerBuiltinModuleTypes(
280 const QQmlTypeLoaderQmldirContent &qmldir, QTypeRevision version);
282 QString redirectQmldirContent(
283 QQmlTypeLoader *typeLoader, QQmlTypeLoaderQmldirContent *qmldir);
285 bool getQmldirContent(
286 QQmlTypeLoader *typeLoader,
const QString &qmldirIdentifier,
const QString &uri,
287 QQmlTypeLoaderQmldirContent *qmldir, QList<QQmlError> *errors);
289 QString resolvedUri(
const QString &dir_arg, QQmlTypeLoader *typeLoader);
291 template<IsLibrary isLibrary,
typename Handler>
292 QTypeRevision finalizeImport(
293 QQmlImportNamespace *nameSpace,
const QQmlTypeLoaderQmldirContent &qmldir,
294 const QString &importUri,
const QString &url, quint8 precedence,
295 QTypeRevision requestedVersion, QTypeRevision importedVersion,
296 QList<QQmlError> *errors, Handler &&handler)
298 QQmlImportInstance *inserted = addImportToNamespace<isLibrary>(
299 nameSpace, importUri, url, requestedVersion, precedence);
302 registerBuiltinModuleTypes(qmldir, importedVersion);
304 if (!inserted->setQmldirContent(url, qmldir, nameSpace, errors))
305 return QTypeRevision();
307 return handler(inserted);
310 template<IsLibrary isLibrary>
311 QTypeRevision finalizeImport(
312 QQmlImportNamespace *nameSpace,
const QQmlTypeLoaderQmldirContent &qmldir,
313 const QString &importUri,
const QString &url, quint8 precedence,
314 QTypeRevision requestedVersion, QTypeRevision importedVersion,
315 QList<QQmlError> *errors)
317 return finalizeImport<isLibrary>(
318 nameSpace, qmldir, importUri, url, precedence, requestedVersion, importedVersion,
319 errors, [importedVersion](QQmlImportInstance *inserted) {
321 Q_ASSERT(importedVersion.isValid());
322 return importedVersion;
333 mutable QQmlImportNamespace m_unqualifiedset;
336 QFieldList<QQmlImportNamespace, &QQmlImportNamespace::nextNamespace> m_qualifiedSets;