diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2021-12-09 11:22:52 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-12-13 16:31:51 +0000 |
commit | 17feb7753607c51eee8a624fd9e4e19d48a0a793 (patch) | |
tree | c3307e0931216f0fcbdcd67204c9e82518515caa /src/qmlcompiler | |
parent | 9d2bd53fda855dd8795bca583cbcb3eca66a6bc6 (diff) |
Pass qmldir to qmlcachegen, qmllint and qmltc, not the qmltypes file
The tools will still grudgingly accept qmltypes files being passed via
the -i option. We generally expect qmldir files, though. Ignoring the
qmldir file and importing the qmltypes directly, ignores qmldir imports,
dependencies and other component entries. This leads to unresolvable
types.
[ChangeLog][QML Tooling] qmllint expects qmldir files, not qmltypes
files to be passed via the -i option now. This enables it to see the
imports and dependencies of the module being imported. For backwards
compatibility it still accepts qmltypes files, with a warning.
Fixes: QTBUG-99043
Change-Id: I5ed32d7e78df1e604aaf1bfa2ebda09d5d57b628
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
(cherry picked from commit 576fafd1e69429d7387e4c35f6d15fc42af6513e)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src/qmlcompiler')
-rw-r--r-- | src/qmlcompiler/qqmljscompiler.cpp | 6 | ||||
-rw-r--r-- | src/qmlcompiler/qqmljscompiler_p.h | 4 | ||||
-rw-r--r-- | src/qmlcompiler/qqmljsimporter.cpp | 27 | ||||
-rw-r--r-- | src/qmlcompiler/qqmljsimporter_p.h | 2 | ||||
-rw-r--r-- | src/qmlcompiler/qqmljsimportvisitor.cpp | 8 | ||||
-rw-r--r-- | src/qmlcompiler/qqmljsimportvisitor_p.h | 4 | ||||
-rw-r--r-- | src/qmlcompiler/qqmljstypereader.cpp | 3 | ||||
-rw-r--r-- | src/qmlcompiler/qqmljstypereader_p.h | 6 |
8 files changed, 36 insertions, 24 deletions
diff --git a/src/qmlcompiler/qqmljscompiler.cpp b/src/qmlcompiler/qqmljscompiler.cpp index bfb434aada..79fa6a69ff 100644 --- a/src/qmlcompiler/qqmljscompiler.cpp +++ b/src/qmlcompiler/qqmljscompiler.cpp @@ -620,11 +620,11 @@ bool qSaveQmlJSUnitAsCpp(const QString &inputFileName, const QString &outputFile } QQmlJSAotCompiler::QQmlJSAotCompiler( - QQmlJSImporter *importer, const QString &resourcePath, const QStringList &qmltypesFiles, + QQmlJSImporter *importer, const QString &resourcePath, const QStringList &qmldirFiles, QQmlJSLogger *logger) : m_typeResolver(importer) , m_resourcePath(resourcePath) - , m_qmltypesFiles(qmltypesFiles) + , m_qmldirFiles(qmldirFiles) , m_importer(importer) , m_logger(logger) { @@ -642,7 +642,7 @@ void QQmlJSAotCompiler::setDocument( m_entireSourceCodeLines = irDocument->code.split(u'\n'); QQmlJSImportVisitor visitor(m_importer, m_logger, resourcePathInfo.canonicalPath() + u'/', - m_qmltypesFiles); + m_qmldirFiles); m_typeResolver.init(&visitor, irDocument->program); } diff --git a/src/qmlcompiler/qqmljscompiler_p.h b/src/qmlcompiler/qqmljscompiler_p.h index ec7529b054..15b7f3062f 100644 --- a/src/qmlcompiler/qqmljscompiler_p.h +++ b/src/qmlcompiler/qqmljscompiler_p.h @@ -77,7 +77,7 @@ class QQmlJSAotCompiler { public: QQmlJSAotCompiler(QQmlJSImporter *importer, const QString &resourcePath, - const QStringList &qmltypesFiles, QQmlJSLogger *logger); + const QStringList &qmldirFiles, QQmlJSLogger *logger); virtual ~QQmlJSAotCompiler() = default; @@ -98,7 +98,7 @@ protected: QStringList m_entireSourceCodeLines; const QString m_resourcePath; - const QStringList m_qmltypesFiles; + const QStringList m_qmldirFiles; const QmlIR::Document *m_document = nullptr; const QmlIR::Object *m_currentObject = nullptr; diff --git a/src/qmlcompiler/qqmljsimporter.cpp b/src/qmlcompiler/qqmljsimporter.cpp index c7320eaac8..3d4f2fe838 100644 --- a/src/qmlcompiler/qqmljsimporter.cpp +++ b/src/qmlcompiler/qqmljsimporter.cpp @@ -439,17 +439,32 @@ QQmlJSImporter::AvailableTypes QQmlJSImporter::builtinImportHelper() /*! * Imports types from the specified \a qmltypesFiles. */ -void QQmlJSImporter::importQmltypes(const QStringList &qmltypesFiles) +void QQmlJSImporter::importQmldirs(const QStringList &qmldirFiles) { AvailableTypes types(builtinImportHelper().cppNames); - for (const auto &qmltypeFile : qmltypesFiles) { + for (const auto &file : qmldirFiles) { Import result; - readQmltypes(qmltypeFile, &result.objects, &result.dependencies); + QString qmldirName; + if (file.endsWith(SlashQmldir)) { + result = readQmldir(file.chopped(SlashQmldir.size())); + qmldirName = file; + } else { + m_warnings.append({ + QStringLiteral("Argument %1 to -i option is not a qmldir file. Assuming qmltypes.") + .arg(file), + QtWarningMsg, + QQmlJS::SourceLocation() + }); + + readQmltypes(file, &result.objects, &result.dependencies); + + // Append _FAKE_QMLDIR to our made up qmldir name so that if it ever gets used somewhere + // else except for cache lookups, it will blow up due to a missing file instead of + // producing weird results. + qmldirName = file + QStringLiteral("_FAKE_QMLDIR"); + } - // Append _FAKE_QMLDIR to our made up qmldir name so that if it ever gets used somewhere else except for cache lookups, - // it will blow up due to a missing file instead of producing weird results. - const QString qmldirName = qmltypeFile + QStringLiteral("_FAKE_QMLDIR"); m_seenQmldirFiles.insert(qmldirName, result); for (const auto &object : qAsConst(result.objects)) { diff --git a/src/qmlcompiler/qqmljsimporter_p.h b/src/qmlcompiler/qqmljsimporter_p.h index b5a2846ecb..20a8e15791 100644 --- a/src/qmlcompiler/qqmljsimporter_p.h +++ b/src/qmlcompiler/qqmljsimporter_p.h @@ -60,7 +60,7 @@ public: void setResourceFileMapper(QQmlJSResourceFileMapper *mapper) { m_mapper = mapper; } ImportedTypes importBuiltins(); - void importQmltypes(const QStringList &qmltypesFiles); + void importQmldirs(const QStringList &qmltypesFiles); QQmlJSScope::Ptr importFile(const QString &file); ImportedTypes importDirectory(const QString &directory, const QString &prefix = QString()); diff --git a/src/qmlcompiler/qqmljsimportvisitor.cpp b/src/qmlcompiler/qqmljsimportvisitor.cpp index 7c695395cb..e7e0443339 100644 --- a/src/qmlcompiler/qqmljsimportvisitor.cpp +++ b/src/qmlcompiler/qqmljsimportvisitor.cpp @@ -75,9 +75,9 @@ inline QString getScopeName(const QQmlJSScope::ConstPtr &scope, QQmlJSScope::Sco QQmlJSImportVisitor::QQmlJSImportVisitor(QQmlJSImporter *importer, QQmlJSLogger *logger, const QString &implicitImportDirectory, - const QStringList &qmltypesFiles) + const QStringList &qmldirFiles) : m_implicitImportDirectory(implicitImportDirectory), - m_qmltypesFiles(qmltypesFiles), + m_qmldirFiles(qmldirFiles), m_currentScope(QQmlJSScope::create(QQmlJSScope::JSFunctionScope)), m_importer(importer), m_logger(logger) @@ -321,8 +321,8 @@ void QQmlJSImportVisitor::importBaseModules() addImportWithLocation(name, invalidLoc); } - if (!m_qmltypesFiles.isEmpty()) - m_importer->importQmltypes(m_qmltypesFiles); + if (!m_qmldirFiles.isEmpty()) + m_importer->importQmldirs(m_qmldirFiles); // Pulling in the modules and neighboring qml files of the qmltypes we're trying to lint is not // something we need to do. diff --git a/src/qmlcompiler/qqmljsimportvisitor_p.h b/src/qmlcompiler/qqmljsimportvisitor_p.h index 6001b73c0a..065746b53a 100644 --- a/src/qmlcompiler/qqmljsimportvisitor_p.h +++ b/src/qmlcompiler/qqmljsimportvisitor_p.h @@ -61,7 +61,7 @@ class QQmlJSImportVisitor : public QQmlJS::AST::Visitor public: QQmlJSImportVisitor(QQmlJSImporter *importer, QQmlJSLogger *logger, const QString &implicitImportDirectory, - const QStringList &qmltypesFiles = QStringList()); + const QStringList &qmldirFiles = QStringList()); ~QQmlJSImportVisitor(); QQmlJSScope::Ptr result() const; @@ -152,7 +152,7 @@ protected: QString m_implicitImportDirectory; QStringView m_inlineComponentName; bool m_nextIsInlineComponent = false; - QStringList m_qmltypesFiles; + QStringList m_qmldirFiles; QQmlJSScope::Ptr m_currentScope; QQmlJSScope::Ptr m_savedBindingOuterScope; QQmlJSScope::Ptr m_exportedRootScope; diff --git a/src/qmlcompiler/qqmljstypereader.cpp b/src/qmlcompiler/qqmljstypereader.cpp index 2474d5f20c..ae3c0becfe 100644 --- a/src/qmlcompiler/qqmljstypereader.cpp +++ b/src/qmlcompiler/qqmljstypereader.cpp @@ -89,8 +89,7 @@ QQmlJSScope::Ptr QQmlJSTypeReader::operator()() QQmlJSImportVisitor membersVisitor( m_importer, &logger, - QQmlJSImportVisitor::implicitImportDirectory(m_file, m_importer->resourceFileMapper()), - m_qmltypesFiles); + QQmlJSImportVisitor::implicitImportDirectory(m_file, m_importer->resourceFileMapper())); rootNode->accept(&membersVisitor); auto result = membersVisitor.result(); Q_ASSERT(result); diff --git a/src/qmlcompiler/qqmljstypereader_p.h b/src/qmlcompiler/qqmljstypereader_p.h index 08c4ff782b..4dcdc3dc7f 100644 --- a/src/qmlcompiler/qqmljstypereader_p.h +++ b/src/qmlcompiler/qqmljstypereader_p.h @@ -54,11 +54,9 @@ QT_BEGIN_NAMESPACE class QQmlJSTypeReader { public: - QQmlJSTypeReader(QQmlJSImporter *importer, const QString &file, - const QStringList &qmltypesFiles = QStringList()) + QQmlJSTypeReader(QQmlJSImporter *importer, const QString &file) : m_importer(importer) , m_file(file) - , m_qmltypesFiles(qmltypesFiles) {} QQmlJSScope::Ptr operator()(); @@ -67,7 +65,7 @@ public: private: QQmlJSImporter *m_importer; QString m_file; - QStringList m_qmltypesFiles; + QStringList m_qmldirFiles; QList<QQmlJS::DiagnosticMessage> m_errors; }; |