aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlcompiler/qqmljsimportvisitor.cpp
diff options
context:
space:
mode:
authorMaximilian Goldstein <max.goldstein@qt.io>2021-09-13 14:10:37 +0200
committerMaximilian Goldstein <max.goldstein@qt.io>2021-09-21 15:27:49 +0200
commit7517c1b3ae9aa92f36b19d74a4b2de5e8531309b (patch)
treefa5091501b8d3c179d74bd634aa23b96fc76c673 /src/qmlcompiler/qqmljsimportvisitor.cpp
parentc249edb83fa67b3e5f711b28923397e66876182d (diff)
qmllint: Automatically import qmldirs from resources
This is needed in order to faciliate implicit module imports for our new CMake Module API where the qmldir is not in the directory of the file being linted. Implicit imports should be avoided in general but need to be supported by qmllint nonetheless. Change-Id: I725f33ec7acb3624f06c644ea0a451d66aed8a10 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qmlcompiler/qqmljsimportvisitor.cpp')
-rw-r--r--src/qmlcompiler/qqmljsimportvisitor.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/qmlcompiler/qqmljsimportvisitor.cpp b/src/qmlcompiler/qqmljsimportvisitor.cpp
index 4535b0964d..bfdf021b82 100644
--- a/src/qmlcompiler/qqmljsimportvisitor.cpp
+++ b/src/qmlcompiler/qqmljsimportvisitor.cpp
@@ -308,9 +308,28 @@ void QQmlJSImportVisitor::importBaseModules()
// Pulling in the modules and neighboring qml files of the qmltypes we're trying to lint is not
// something we need to do.
- if (!m_logger->fileName().endsWith(u".qmltypes"_qs))
+ if (!m_logger->fileName().endsWith(u".qmltypes"_qs)) {
m_rootScopeImports.insert(m_importer->importDirectory(m_implicitImportDirectory));
+ QQmlJSResourceFileMapper *mapper = m_importer->resourceFileMapper();
+
+ // In instances where a qmldir entry exists somewhere in the resource files, import that
+ // directory in order to allow for implicit imports of modules.
+ if (mapper) {
+ const QStringList filePaths = mapper->filePaths(QQmlJSResourceFileMapper::Filter {
+ QString(), QStringList(),
+ QQmlJSResourceFileMapper::Directory | QQmlJSResourceFileMapper::Recurse });
+ auto qmldirEntry =
+ std::find_if(filePaths.constBegin(), filePaths.constEnd(),
+ [](const QString &path) { return path.endsWith(u"/qmldir"); });
+
+ if (qmldirEntry != filePaths.constEnd()) {
+ m_rootScopeImports.insert(
+ m_importer->importDirectory(QFileInfo(*qmldirEntry).absolutePath()));
+ }
+ }
+ }
+
processImportWarnings(QStringLiteral("base modules"));
}