diff options
Diffstat (limited to 'tools/qmllint')
-rw-r--r-- | tools/qmllint/findwarnings.cpp | 12 | ||||
-rw-r--r-- | tools/qmllint/findwarnings.h | 2 | ||||
-rw-r--r-- | tools/qmllint/main.cpp | 43 |
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; } |