aboutsummaryrefslogtreecommitdiffstats
path: root/tools/qmllint
diff options
context:
space:
mode:
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;
}