aboutsummaryrefslogtreecommitdiffstats
path: root/tools
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 /tools
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 'tools')
-rw-r--r--tools/qmlcachegen/qmlcachegen.cpp4
-rw-r--r--tools/qmllint/main.cpp59
-rw-r--r--tools/qmltc/main.cpp12
-rw-r--r--tools/qmltc/qmltcvisitor.cpp4
-rw-r--r--tools/qmltc/qmltcvisitor.h2
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;