diff options
author | Maximilian Goldstein <max.goldstein@qt.io> | 2021-09-13 14:10:37 +0200 |
---|---|---|
committer | Maximilian Goldstein <max.goldstein@qt.io> | 2021-09-21 15:27:49 +0200 |
commit | 7517c1b3ae9aa92f36b19d74a4b2de5e8531309b (patch) | |
tree | fa5091501b8d3c179d74bd634aa23b96fc76c673 /src/qmlcompiler/qqmljsimportvisitor.cpp | |
parent | c249edb83fa67b3e5f711b28923397e66876182d (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.cpp | 21 |
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")); } |