aboutsummaryrefslogtreecommitdiffstats
path: root/tools/qmllint
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-09-29 16:55:15 +0200
committerUlf Hermann <ulf.hermann@qt.io>2020-10-02 15:32:29 +0200
commitccd348d4b7423a23b2326c2f42c74719083248ba (patch)
treec42d114cac3824de9f3a0de9a1df0ee0e7c39a19 /tools/qmllint
parent4bb53fd1086e5e67391c7bd328ab5083ed83be68 (diff)
qmllint: Uncruftify the importing of base qmltypes
builtins.qmltypes are imported separately now. Any other bare qmltypes files without qmldir should be specified explicitly. If none are specified, qmllint looks in the current directory for qmltypes files, not in all possible import paths. This is still somewhat weird, but admittedly it's handy for qmltypes files generated for application binaries. For the same reason, we unconditionally include the current directory in the list of default import paths. Previously this was done if no explicit qmltypes files were specified, which makes little sense. Change-Id: Iaa56f8b40b3ec3045f55928251d7efea5616d23b Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'tools/qmllint')
-rw-r--r--tools/qmllint/findwarnings.cpp12
-rw-r--r--tools/qmllint/findwarnings.h2
-rw-r--r--tools/qmllint/main.cpp43
3 files changed, 37 insertions, 20 deletions
diff --git a/tools/qmllint/findwarnings.cpp b/tools/qmllint/findwarnings.cpp
index a11abbf002..742c1a8d35 100644
--- a/tools/qmllint/findwarnings.cpp
+++ b/tools/qmllint/findwarnings.cpp
@@ -113,7 +113,13 @@ void FindWarningVisitor::throwRecursionDepthError()
bool FindWarningVisitor::visit(QQmlJS::AST::UiProgram *)
{
enterEnvironment(ScopeType::QMLScope, "program");
- m_rootScopeImports = m_importer.importBaseQmlTypes(m_qmltypesFiles);
+ m_rootScopeImports = m_importer.importBuiltins();
+
+ if (!m_qmltypesFiles.isEmpty()) {
+ const auto baseTypes = m_importer.importQmltypes(m_qmltypesFiles);
+ m_rootScopeImports.importedQmlNames.insert(baseTypes.importedQmlNames);
+ m_rootScopeImports.cppNames.insert(baseTypes.cppNames);
+ }
// add "self" (as we only ever check the first part of a qualified identifier, we get away with
// using an empty ScopeTree
@@ -339,7 +345,7 @@ bool FindWarningVisitor::visit(QQmlJS::AST::IdentifierExpression *idexp)
}
FindWarningVisitor::FindWarningVisitor(
- QStringList qmltypeDirs, QStringList qmltypesFiles, QString code, QString fileName,
+ QStringList qmlImportPaths, QStringList qmltypesFiles, QString code, QString fileName,
bool silent, bool warnUnqualified, bool warnWithStatement, bool warnInheritanceCycle)
: m_rootScope(ScopeTree::create(ScopeType::JSFunctionScope)),
m_qmltypesFiles(std::move(qmltypesFiles)),
@@ -350,7 +356,7 @@ FindWarningVisitor::FindWarningVisitor(
m_warnUnqualified(warnUnqualified),
m_warnWithStatement(warnWithStatement),
m_warnInheritanceCycle(warnInheritanceCycle),
- m_importer(qmltypeDirs)
+ m_importer(qmlImportPaths)
{
m_rootScope->setInternalName("global");
m_currentScope = m_rootScope;
diff --git a/tools/qmllint/findwarnings.h b/tools/qmllint/findwarnings.h
index a8673d54e8..382c4cab11 100644
--- a/tools/qmllint/findwarnings.h
+++ b/tools/qmllint/findwarnings.h
@@ -55,7 +55,7 @@ class FindWarningVisitor : public QQmlJS::AST::Visitor
Q_DISABLE_COPY_MOVE(FindWarningVisitor)
public:
explicit FindWarningVisitor(
- QStringList qmltypeDirs, QStringList qmltypesFiles, QString code, QString fileName,
+ QStringList qmlImportPaths, QStringList qmltypesFiles, QString code, QString fileName,
bool silent, bool warnUnqualified, bool warnWithStatement, bool warnInheritanceCycle);
~FindWarningVisitor() override = default;
bool check();
diff --git a/tools/qmllint/main.cpp b/tools/qmllint/main.cpp
index f0ea68662e..1112f64d7c 100644
--- a/tools/qmllint/main.cpp
+++ b/tools/qmllint/main.cpp
@@ -38,6 +38,7 @@
#include <QtCore/qfile.h>
#include <QtCore/qfileinfo.h>
#include <QtCore/qcoreapplication.h>
+#include <QtCore/qdiriterator.h>
#if QT_CONFIG(commandlineparser)
#include <QtCore/qcommandlineparser.h>
@@ -49,7 +50,7 @@
static bool lint_file(const QString &filename, const bool silent, const bool warnUnqualified,
const bool warnWithStatement, const bool warnInheritanceCycle,
- const QStringList &qmltypeDirs, const QStringList &qmltypeFiles)
+ const QStringList &qmlImportPaths, const QStringList &qmltypesFiles)
{
QFile file(filename);
if (!file.open(QFile::ReadOnly)) {
@@ -85,7 +86,7 @@ static bool lint_file(const QString &filename, const bool silent, const bool war
if (success && !isJavaScript) {
auto root = parser.rootNode();
- FindWarningVisitor v { qmltypeDirs, qmltypeFiles, code, filename, silent,
+ FindWarningVisitor v { qmlImportPaths, qmltypesFiles, code, filename, silent,
warnUnqualified, warnWithStatement, warnInheritanceCycle };
root->accept(&v);
success = v.check();
@@ -122,17 +123,20 @@ int main(int argv, char *argc[])
parser.addOption(disableCheckInheritanceCycle);
- QCommandLineOption qmltypesDirsOption(
+ QCommandLineOption qmlImportPathsOption(
QStringList() << "I"
<< "qmldirs",
- QLatin1String("Look for qmltypes files in specified directory"),
+ QLatin1String("Look for QML modules in specified directory"),
QLatin1String("directory"));
- parser.addOption(qmltypesDirsOption);
+ parser.addOption(qmlImportPathsOption);
QCommandLineOption qmltypesFilesOption(
QStringList() << "i"
<< "qmltypes",
- QLatin1String("Include the specified qmltypes files"),
+ QLatin1String("Include 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);
@@ -152,25 +156,31 @@ int main(int argv, char *argc[])
bool warnInheritanceCycle = !parser.isSet(disableCheckInheritanceCycle);
// use host qml import path as a sane default if nothing else has been provided
- QStringList qmltypeDirs = parser.isSet(qmltypesDirsOption)
- ? parser.values(qmltypesDirsOption)
+ QStringList qmlImportPaths = parser.isSet(qmlImportPathsOption)
+ ? parser.values(qmlImportPathsOption)
# ifndef QT_BOOTSTRAPPED
- : QStringList { QLibraryInfo::path(QLibraryInfo::Qml2ImportsPath) };
+ : QStringList { QLibraryInfo::path(QLibraryInfo::Qml2ImportsPath), QDir::currentPath() };
# else
- : QStringList {};
+ : QStringList { QDir::currentPath() };
# endif
- if (!parser.isSet(qmltypesFilesOption))
- qmltypeDirs << ".";
+ QStringList qmltypesFiles;
+ if (parser.isSet(qmltypesFilesOption)) {
+ qmltypesFiles = parser.values(qmltypesFilesOption);
+ } else {
+ // If none are given explicitly, use the qmltypes files from the current directory.
+ QDirIterator it(".", {"*.qmltypes"}, QDir::Files);
+ while (it.hasNext())
+ qmltypesFiles.append(it.fileInfo().absoluteFilePath());
+ }
- QStringList qmltypeFiles = parser.isSet(qmltypesFilesOption) ? parser.values(qmltypesFilesOption) : QStringList {};
#else
bool silent = false;
bool warnUnqualified = true;
bool warnWithStatement = true;
bool warnInheritanceCycle = true;
- QStringList qmltypeDirs {};
- QStringList qmltypeFiles {};
+ QStringList qmlImportPahs {};
+ QStringList qmltypesFiles {};
#endif
bool success = true;
#if QT_CONFIG(commandlineparser)
@@ -179,7 +189,8 @@ int main(int argv, char *argc[])
const auto arguments = app.arguments();
for (const QString &filename : arguments)
#endif
- success &= lint_file(filename, silent, warnUnqualified, warnWithStatement, warnInheritanceCycle, qmltypeDirs, qmltypeFiles);
+ success &= lint_file(filename, silent, warnUnqualified, warnWithStatement,
+ warnInheritanceCycle, qmlImportPaths, qmltypesFiles);
return success ? 0 : -1;
}