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 /tools | |
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 'tools')
-rw-r--r-- | tools/qmlcachegen/qmlcachegen.cpp | 4 | ||||
-rw-r--r-- | tools/qmllint/main.cpp | 59 | ||||
-rw-r--r-- | tools/qmltc/main.cpp | 12 | ||||
-rw-r--r-- | tools/qmltc/qmltcvisitor.cpp | 4 | ||||
-rw-r--r-- | tools/qmltc/qmltcvisitor.h | 2 |
5 files changed, 45 insertions, 36 deletions
diff --git a/tools/qmlcachegen/qmlcachegen.cpp b/tools/qmlcachegen/qmlcachegen.cpp index 3648a10f95..cca7abcfe0 100644 --- a/tools/qmlcachegen/qmlcachegen.cpp +++ b/tools/qmlcachegen/qmlcachegen.cpp @@ -112,8 +112,8 @@ int main(int argc, char **argv) parser.addOption(directCallsOption); QCommandLineOption importsOption( QStringLiteral("i"), - QCoreApplication::translate("main", "Import extra qmltypes"), - QCoreApplication::translate("main", "qmltypes file")); + QCoreApplication::translate("main", "Import extra qmldir"), + QCoreApplication::translate("main", "qmldir file")); parser.addOption(importsOption); QCommandLineOption importPathOption( QStringLiteral("I"), diff --git a/tools/qmllint/main.cpp b/tools/qmllint/main.cpp index 29d52736b4..6d4de2df09 100644 --- a/tools/qmllint/main.cpp +++ b/tools/qmllint/main.cpp @@ -130,17 +130,19 @@ All warnings can be set to three levels: const QString qmlImportNoDefaultSetting = QLatin1String("DisableDefaultImports"); settings.addOption(qmlImportNoDefaultSetting, false); - QCommandLineOption qmltypesFilesOption( + QCommandLineOption qmldirFilesOption( QStringList() << "i" << "qmltypes", - QLatin1String("Import the specified qmltypes files. By default, all qmltypes files " - "found in the current directory are used. When this option is set, you " - "have to explicitly add files from the current directory if you want " - "them to be used."), - QLatin1String("qmltypes")); - parser.addOption(qmltypesFilesOption); - const QString qmltypesFilesSetting = QLatin1String("OverwriteImportTypes"); - settings.addOption(qmltypesFilesSetting); + QLatin1String("Import the specified qmldir files. By default, the qmldir file found " + "in the current directory is used if present. If no qmldir file is found," + "but qmltypes files are, those are imported instead. When this option is " + "set, you have to explicitly add the qmldir or any qmltypes files in the " + "current directory if you want it to be used. Importing qmltypes files " + "without their corresponding qmldir file is inadvisable."), + QLatin1String("qmldirs")); + parser.addOption(qmldirFilesOption); + const QString qmldirFilesSetting = QLatin1String("OverwriteImportTypes"); + settings.addOption(qmldirFilesSetting); QCommandLineOption absolutePath( QStringList() << "absolute-path", @@ -192,18 +194,25 @@ All warnings can be set to three levels: QStringList qmlImportPaths = parser.isSet(qmlImportNoDefault) ? QStringList {} : defaultImportPaths; - QStringList defaultQmltypesFiles; - if (parser.isSet(qmltypesFilesOption)) { - defaultQmltypesFiles = parser.values(qmltypesFilesOption); + QStringList defaultQmldirFiles; + if (parser.isSet(qmldirFilesOption)) { + defaultQmldirFiles = parser.values(qmldirFilesOption); } else { - // If none are given explicitly, use the qmltypes files from the current directory. - QDirIterator it(".", {"*.qmltypes"}, QDir::Files); - while (it.hasNext()) { - it.next(); - defaultQmltypesFiles.append(it.fileInfo().absoluteFilePath()); + // If nothing given explicitly, use the qmldir file from the current directory. + QFileInfo qmldirFile(QStringLiteral("qmldir")); + if (qmldirFile.isFile()) { + defaultQmldirFiles.append(qmldirFile.absoluteFilePath()); + } else { + // If no qmldir file is found, use the qmltypes files + // from the current directory for backwards compatibility. + QDirIterator it(".", {"*.qmltypes"}, QDir::Files); + while (it.hasNext()) { + it.next(); + defaultQmldirFiles.append(it.fileInfo().absoluteFilePath()); + } } } - QStringList qmltypesFiles = defaultQmltypesFiles; + QStringList qmldirFiles = defaultQmldirFiles; const QStringList defaultResourceFiles = parser.isSet(resourceOption) ? parser.values(resourceOption) : QStringList {}; @@ -241,12 +250,12 @@ All warnings can be set to three levels: addAbsolutePaths(resourceFiles, settings.value(resourceSetting).toStringList()); - qmltypesFiles = defaultQmltypesFiles; - if (settings.isSet(qmltypesFilesSetting) - && !settings.value(qmltypesFilesSetting).toStringList().isEmpty()) { - qmltypesFiles = {}; - addAbsolutePaths(qmltypesFiles, - settings.value(qmltypesFilesSetting).toStringList()); + qmldirFiles = defaultQmldirFiles; + if (settings.isSet(qmldirFilesSetting) + && !settings.value(qmldirFilesSetting).toStringList().isEmpty()) { + qmldirFiles = {}; + addAbsolutePaths(qmldirFiles, + settings.value(qmldirFilesSetting).toStringList()); } if (parser.isSet(qmlImportNoDefault) @@ -267,7 +276,7 @@ All warnings can be set to three levels: for (const QString &filename : arguments) { #endif success &= linter.lintFile(filename, nullptr, silent, useJson ? &jsonFiles : nullptr, - qmlImportPaths, qmltypesFiles, resourceFiles, options); + qmlImportPaths, qmldirFiles, resourceFiles, options); } if (useJson) { diff --git a/tools/qmltc/main.cpp b/tools/qmltc/main.cpp index 49c68a3860..dd2dfb97ba 100644 --- a/tools/qmltc/main.cpp +++ b/tools/qmltc/main.cpp @@ -70,11 +70,11 @@ int main(int argc, char **argv) QCoreApplication::translate("main", "import directory") }; parser.addOption(importPathOption); - QCommandLineOption qmltypesOption { - u"i"_qs, QCoreApplication::translate("main", "Include extra qmltypes"), - QCoreApplication::translate("main", "qmltypes file") + QCommandLineOption qmldirOption { + u"i"_qs, QCoreApplication::translate("main", "Include extra qmldir files"), + QCoreApplication::translate("main", "qmldir file") }; - parser.addOption(qmltypesOption); + parser.addOption(qmldirOption); QCommandLineOption outputCppOption { u"impl"_qs, QCoreApplication::translate("main", "Generated C++ source file path"), QCoreApplication::translate("main", "cpp path") @@ -132,7 +132,7 @@ int main(int argc, char **argv) QStringList importPaths = parser.values(importPathOption); importPaths.append(QLibraryInfo::path(QLibraryInfo::QmlImportsPath)); importPaths.append(QFileInfo(url).absolutePath()); - QStringList qmltypesFiles = parser.values(qmltypesOption); + QStringList qmldirFiles = parser.values(qmldirOption); QString outputCppFile; if (!parser.isSet(outputCppOption)) { @@ -174,7 +174,7 @@ int main(int argc, char **argv) logger.setFileName(url); logger.setCode(sourceCode); setupLogger(logger); - QmltcVisitor visitor(&importer, &logger, implicitImportDirectory, qmltypesFiles); + QmltcVisitor visitor(&importer, &logger, implicitImportDirectory, qmldirFiles); QmltcTypeResolver typeResolver { &importer }; typeResolver.init(&visitor, document.program); diff --git a/tools/qmltc/qmltcvisitor.cpp b/tools/qmltc/qmltcvisitor.cpp index 7d9062a4db..691496d7c7 100644 --- a/tools/qmltc/qmltcvisitor.cpp +++ b/tools/qmltc/qmltcvisitor.cpp @@ -44,8 +44,8 @@ static QString uniqueNameFromPieces(const QStringList &pieces, QHash<QString, in } QmltcVisitor::QmltcVisitor(QQmlJSImporter *importer, QQmlJSLogger *logger, - const QString &implicitImportDirectory, const QStringList &qmltypesFiles) - : QQmlJSImportVisitor(importer, logger, implicitImportDirectory, qmltypesFiles) + const QString &implicitImportDirectory, const QStringList &qmldirFiles) + : QQmlJSImportVisitor(importer, logger, implicitImportDirectory, qmldirFiles) { m_qmlTypeNames.append(QFileInfo(logger->fileName()).baseName()); // put document root } diff --git a/tools/qmltc/qmltcvisitor.h b/tools/qmltc/qmltcvisitor.h index 17d5f02ebf..d69c84d3ca 100644 --- a/tools/qmltc/qmltcvisitor.h +++ b/tools/qmltc/qmltcvisitor.h @@ -46,7 +46,7 @@ class QmltcVisitor : public QQmlJSImportVisitor public: QmltcVisitor(QQmlJSImporter *importer, QQmlJSLogger *logger, const QString &implicitImportDirectory, - const QStringList &qmltypesFiles = QStringList()); + const QStringList &qmldirFiles = QStringList()); bool visit(QQmlJS::AST::UiObjectDefinition *) override; void endVisit(QQmlJS::AST::UiObjectDefinition *) override; |