aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlcompiler
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2021-12-09 11:22:52 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-12-13 16:31:51 +0000
commit17feb7753607c51eee8a624fd9e4e19d48a0a793 (patch)
treec3307e0931216f0fcbdcd67204c9e82518515caa /src/qmlcompiler
parent9d2bd53fda855dd8795bca583cbcb3eca66a6bc6 (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.cpp6
-rw-r--r--src/qmlcompiler/qqmljscompiler_p.h4
-rw-r--r--src/qmlcompiler/qqmljsimporter.cpp27
-rw-r--r--src/qmlcompiler/qqmljsimporter_p.h2
-rw-r--r--src/qmlcompiler/qqmljsimportvisitor.cpp8
-rw-r--r--src/qmlcompiler/qqmljsimportvisitor_p.h4
-rw-r--r--src/qmlcompiler/qqmljstypereader.cpp3
-rw-r--r--src/qmlcompiler/qqmljstypereader_p.h6
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;
};