aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaximilian Goldstein <max.goldstein@qt.io>2020-04-24 15:10:53 +0200
committerMaximilian Goldstein <max.goldstein@qt.io>2020-04-30 18:56:19 +0200
commitac5c765f29106837da717ca7c2e1f266f39d5843 (patch)
treed27d13f5349ac7b217acd14a61ea1eab54f20d89
parent50cd8cf97aa89a48a9fbaaeb2515e529e66c7d43 (diff)
qmllint: Add flags for toggling warnings
Enables all warnings by default and makes it possible to toggle individual ones using command line flags. Change-Id: Ie55f32f646fd9422313977969f9f00b59ee9ad99 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r--tests/auto/qml/qmllint/tst_qmllint.cpp2
-rw-r--r--tools/qmllint/.prev_CMakeLists.txt10
-rw-r--r--tools/qmllint/CMakeLists.txt10
-rw-r--r--tools/qmllint/findwarnings.cpp (renamed from tools/qmllint/findunqualified.cpp)150
-rw-r--r--tools/qmllint/findwarnings.h (renamed from tools/qmllint/findunqualified.h)15
-rw-r--r--tools/qmllint/main.cpp36
-rw-r--r--tools/qmllint/qmllint.pro4
7 files changed, 131 insertions, 96 deletions
diff --git a/tests/auto/qml/qmllint/tst_qmllint.cpp b/tests/auto/qml/qmllint/tst_qmllint.cpp
index e7088d7cf5..235748f55e 100644
--- a/tests/auto/qml/qmllint/tst_qmllint.cpp
+++ b/tests/auto/qml/qmllint/tst_qmllint.cpp
@@ -218,7 +218,7 @@ QString TestQmllint::runQmllint(const QString &fileToLint, bool shouldSucceed)
{
auto qmlImportDir = QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath);
QStringList args;
- args << QStringLiteral("-U") << testFile(fileToLint)
+ args << testFile(fileToLint)
<< QStringLiteral("-I") << qmlImportDir
<< QStringLiteral("-I") << dataDirectory()
<< QStringLiteral("--silent");
diff --git a/tools/qmllint/.prev_CMakeLists.txt b/tools/qmllint/.prev_CMakeLists.txt
index df661ebc57..188b921ca3 100644
--- a/tools/qmllint/.prev_CMakeLists.txt
+++ b/tools/qmllint/.prev_CMakeLists.txt
@@ -6,15 +6,15 @@
qt_add_tool(qmllint
SOURCES
- checkidentifiers.cpp checkidentifiers.h
../shared/componentversion.cpp ../shared/componentversion.h
- findunqualified.cpp findunqualified.h
- importedmembersvisitor.cpp importedmembersvisitor.h
- main.cpp
../shared/metatypes.h
- qcoloroutput.cpp qcoloroutput.h
../shared/scopetree.cpp ../shared/scopetree.h
../shared/typedescriptionreader.cpp ../shared/typedescriptionreader.h
+ checkidentifiers.cpp checkidentifiers.h
+ findwarnings.cpp findwarnings.h
+ importedmembersvisitor.cpp importedmembersvisitor.h
+ main.cpp
+ qcoloroutput.cpp qcoloroutput.h
INCLUDE_DIRECTORIES
../shared
PUBLIC_LIBRARIES
diff --git a/tools/qmllint/CMakeLists.txt b/tools/qmllint/CMakeLists.txt
index d294c2c78e..c6fb5add64 100644
--- a/tools/qmllint/CMakeLists.txt
+++ b/tools/qmllint/CMakeLists.txt
@@ -7,15 +7,15 @@
qt_add_tool(qmllint
TOOLS_TARGET Qml # special case
SOURCES
- checkidentifiers.cpp checkidentifiers.h
../shared/componentversion.cpp ../shared/componentversion.h
- findunqualified.cpp findunqualified.h
- importedmembersvisitor.cpp importedmembersvisitor.h
- main.cpp
../shared/metatypes.h
- qcoloroutput.cpp qcoloroutput.h
../shared/scopetree.cpp ../shared/scopetree.h
../shared/typedescriptionreader.cpp ../shared/typedescriptionreader.h
+ checkidentifiers.cpp checkidentifiers.h
+ findwarnings.cpp findwarnings.h
+ importedmembersvisitor.cpp importedmembersvisitor.h
+ main.cpp
+ qcoloroutput.cpp qcoloroutput.h
INCLUDE_DIRECTORIES
../shared
PUBLIC_LIBRARIES
diff --git a/tools/qmllint/findunqualified.cpp b/tools/qmllint/findwarnings.cpp
index abd9c07c31..462d762577 100644
--- a/tools/qmllint/findunqualified.cpp
+++ b/tools/qmllint/findwarnings.cpp
@@ -26,7 +26,7 @@
**
****************************************************************************/
-#include "findunqualified.h"
+#include "findwarnings.h"
#include "importedmembersvisitor.h"
#include "scopetree.h"
#include "typedescriptionreader.h"
@@ -65,17 +65,17 @@ static TypeDescriptionReader createQmltypesReaderForFile(const QString &filename
return reader;
}
-void FindUnqualifiedIDVisitor::enterEnvironment(ScopeType type, const QString &name)
+void FindWarningVisitor::enterEnvironment(ScopeType type, const QString &name)
{
m_currentScope = ScopeTree::create(type, name, m_currentScope);
}
-void FindUnqualifiedIDVisitor::leaveEnvironment()
+void FindWarningVisitor::leaveEnvironment()
{
m_currentScope = m_currentScope->parentScope();
}
-void FindUnqualifiedIDVisitor::parseHeaders(QQmlJS::AST::UiHeaderItemList *header)
+void FindWarningVisitor::parseHeaders(QQmlJS::AST::UiHeaderItemList *header)
{
using namespace QQmlJS::AST;
@@ -99,7 +99,7 @@ void FindUnqualifiedIDVisitor::parseHeaders(QQmlJS::AST::UiHeaderItemList *heade
}
}
-ScopeTree::Ptr FindUnqualifiedIDVisitor::parseProgram(QQmlJS::AST::Program *program,
+ScopeTree::Ptr FindWarningVisitor::parseProgram(QQmlJS::AST::Program *program,
const QString &name)
{
using namespace QQmlJS::AST;
@@ -185,8 +185,8 @@ QStringList completeImportPaths(const QString &uri, const QString &basePath, QTy
static const QLatin1String SlashQmldir = QLatin1String("/qmldir");
static const QLatin1String SlashPluginsDotQmltypes = QLatin1String("/plugins.qmltypes");
-void FindUnqualifiedIDVisitor::readQmltypes(const QString &filename,
- FindUnqualifiedIDVisitor::Import &result)
+void FindWarningVisitor::readQmltypes(const QString &filename,
+ FindWarningVisitor::Import &result)
{
auto reader = createQmltypesReaderForFile(filename);
auto succ = reader(&result.objects, &result.dependencies);
@@ -194,7 +194,7 @@ void FindUnqualifiedIDVisitor::readQmltypes(const QString &filename,
m_colorOut.writeUncolored(reader.errorMessage());
}
-FindUnqualifiedIDVisitor::Import FindUnqualifiedIDVisitor::readQmldir(const QString &path)
+FindWarningVisitor::Import FindWarningVisitor::readQmldir(const QString &path)
{
Import result;
auto reader = createQmldirParserForFile(path + SlashQmldir);
@@ -231,7 +231,7 @@ FindUnqualifiedIDVisitor::Import FindUnqualifiedIDVisitor::readQmldir(const QStr
return result;
}
-void FindUnqualifiedIDVisitor::processImport(const QString &prefix, const FindUnqualifiedIDVisitor::Import &import)
+void FindWarningVisitor::processImport(const QString &prefix, const FindWarningVisitor::Import &import)
{
for (auto const &dependency : qAsConst(import.dependencies)) {
auto const split = dependency.split(" ");
@@ -264,7 +264,7 @@ void FindUnqualifiedIDVisitor::processImport(const QString &prefix, const FindUn
}
}
-void FindUnqualifiedIDVisitor::importHelper(const QString &module, const QString &prefix,
+void FindWarningVisitor::importHelper(const QString &module, const QString &prefix,
QTypeRevision version)
{
const QString id = QString(module).replace(QLatin1Char('/'), QLatin1Char('.'));
@@ -310,7 +310,7 @@ void FindUnqualifiedIDVisitor::importHelper(const QString &module, const QString
}
}
-ScopeTree::Ptr FindUnqualifiedIDVisitor::localFile2ScopeTree(const QString &filePath)
+ScopeTree::Ptr FindWarningVisitor::localFile2ScopeTree(const QString &filePath)
{
using namespace QQmlJS::AST;
const QFileInfo info { filePath };
@@ -356,7 +356,7 @@ ScopeTree::Ptr FindUnqualifiedIDVisitor::localFile2ScopeTree(const QString &file
return parseProgram(QQmlJS::AST::cast<QQmlJS::AST::Program *>(parser.rootNode()), scopeName);
}
-void FindUnqualifiedIDVisitor::importFileOrDirectory(const QString &fileOrDirectory,
+void FindWarningVisitor::importFileOrDirectory(const QString &fileOrDirectory,
const QString &prefix)
{
QString name = fileOrDirectory;
@@ -377,7 +377,7 @@ void FindUnqualifiedIDVisitor::importFileOrDirectory(const QString &fileOrDirect
}
}
-void FindUnqualifiedIDVisitor::importExportedNames(const QStringRef &prefix, QString name)
+void FindWarningVisitor::importExportedNames(const QStringRef &prefix, QString name)
{
QList<ScopeTree::ConstPtr> scopes;
for (;;) {
@@ -392,10 +392,14 @@ void FindUnqualifiedIDVisitor::importExportedNames(const QStringRef &prefix, QSt
inheritenceCycle.append(seen->superclassName());
}
- m_colorOut.write(QLatin1String("Warning: "), Warning);
- m_colorOut.write(QString::fromLatin1("%1 is part of an inheritance cycle: %2\n")
- .arg(name)
- .arg(inheritenceCycle));
+
+ if (m_warnInheritanceCycle) {
+ m_colorOut.write(QLatin1String("Warning: "), Warning);
+ m_colorOut.write(QString::fromLatin1("%1 is part of an inheritance cycle: %2\n")
+ .arg(name)
+ .arg(inheritenceCycle));
+ }
+
m_unknownImports.insert(name);
m_visitFailed = true;
break;
@@ -422,14 +426,14 @@ void FindUnqualifiedIDVisitor::importExportedNames(const QStringRef &prefix, QSt
}
}
-void FindUnqualifiedIDVisitor::throwRecursionDepthError()
+void FindWarningVisitor::throwRecursionDepthError()
{
m_colorOut.write(QStringLiteral("Error"), Error);
m_colorOut.write(QStringLiteral("Maximum statement or expression depth exceeded"), Error);
m_visitFailed = true;
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::UiProgram *)
+bool FindWarningVisitor::visit(QQmlJS::AST::UiProgram *)
{
enterEnvironment(ScopeType::QMLScope, "program");
QHash<QString, ScopeTree::ConstPtr> objects;
@@ -476,78 +480,78 @@ bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::UiProgram *)
return true;
}
-void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::UiProgram *)
+void FindWarningVisitor::endVisit(QQmlJS::AST::UiProgram *)
{
leaveEnvironment();
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::ClassExpression *ast)
+bool FindWarningVisitor::visit(QQmlJS::AST::ClassExpression *ast)
{
enterEnvironment(ScopeType::JSFunctionScope, ast->name.toString());
return true;
}
-void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::ClassExpression *)
+void FindWarningVisitor::endVisit(QQmlJS::AST::ClassExpression *)
{
leaveEnvironment();
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::ClassDeclaration *ast)
+bool FindWarningVisitor::visit(QQmlJS::AST::ClassDeclaration *ast)
{
enterEnvironment(ScopeType::JSFunctionScope, ast->name.toString());
return true;
}
-void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::ClassDeclaration *)
+void FindWarningVisitor::endVisit(QQmlJS::AST::ClassDeclaration *)
{
leaveEnvironment();
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::ForStatement *)
+bool FindWarningVisitor::visit(QQmlJS::AST::ForStatement *)
{
enterEnvironment(ScopeType::JSLexicalScope, "forloop");
return true;
}
-void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::ForStatement *)
+void FindWarningVisitor::endVisit(QQmlJS::AST::ForStatement *)
{
leaveEnvironment();
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::ForEachStatement *)
+bool FindWarningVisitor::visit(QQmlJS::AST::ForEachStatement *)
{
enterEnvironment(ScopeType::JSLexicalScope, "foreachloop");
return true;
}
-void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::ForEachStatement *)
+void FindWarningVisitor::endVisit(QQmlJS::AST::ForEachStatement *)
{
leaveEnvironment();
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::Block *)
+bool FindWarningVisitor::visit(QQmlJS::AST::Block *)
{
enterEnvironment(ScopeType::JSLexicalScope, "block");
return true;
}
-void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::Block *)
+void FindWarningVisitor::endVisit(QQmlJS::AST::Block *)
{
leaveEnvironment();
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::CaseBlock *)
+bool FindWarningVisitor::visit(QQmlJS::AST::CaseBlock *)
{
enterEnvironment(ScopeType::JSLexicalScope, "case");
return true;
}
-void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::CaseBlock *)
+void FindWarningVisitor::endVisit(QQmlJS::AST::CaseBlock *)
{
leaveEnvironment();
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::Catch *catchStatement)
+bool FindWarningVisitor::visit(QQmlJS::AST::Catch *catchStatement)
{
enterEnvironment(ScopeType::JSLexicalScope, "catch");
m_currentScope->insertJSIdentifier(catchStatement->patternElement->bindingIdentifier.toString(),
@@ -555,25 +559,28 @@ bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::Catch *catchStatement)
return true;
}
-void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::Catch *)
+void FindWarningVisitor::endVisit(QQmlJS::AST::Catch *)
{
leaveEnvironment();
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::WithStatement *withStatement)
+bool FindWarningVisitor::visit(QQmlJS::AST::WithStatement *withStatement)
{
- m_colorOut.write(QString::fromLatin1("Warning: "), Warning);
- m_colorOut.write(QString::fromLatin1(
- "%1:%2: with statements are strongly discouraged in QML "
- "and might cause false positives when analysing unqalified identifiers\n")
- .arg(withStatement->firstSourceLocation().startLine)
- .arg(withStatement->firstSourceLocation().startColumn),
- Normal);
+ if (m_warnWithStatement) {
+ m_colorOut.write(QString::fromLatin1("Warning: "), Warning);
+ m_colorOut.write(QString::fromLatin1(
+ "%1:%2: with statements are strongly discouraged in QML "
+ "and might cause false positives when analysing unqalified identifiers\n")
+ .arg(withStatement->firstSourceLocation().startLine)
+ .arg(withStatement->firstSourceLocation().startColumn),
+ Normal);
+ }
+
enterEnvironment(ScopeType::JSLexicalScope, "with");
return true;
}
-void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::WithStatement *)
+void FindWarningVisitor::endVisit(QQmlJS::AST::WithStatement *)
{
leaveEnvironment();
}
@@ -595,7 +602,7 @@ static QString signalName(QStringView handlerName)
return QString();
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::UiScriptBinding *uisb)
+bool FindWarningVisitor::visit(QQmlJS::AST::UiScriptBinding *uisb)
{
using namespace QQmlJS::AST;
auto name = uisb->qualifiedId->name;
@@ -645,7 +652,7 @@ bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::UiScriptBinding *uisb)
return true;
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::UiPublicMember *uipm)
+bool FindWarningVisitor::visit(QQmlJS::AST::UiPublicMember *uipm)
{
// property bool inactive: !active
// extract name inactive
@@ -663,7 +670,7 @@ bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::UiPublicMember *uipm)
return true;
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::IdentifierExpression *idexp)
+bool FindWarningVisitor::visit(QQmlJS::AST::IdentifierExpression *idexp)
{
auto name = idexp->name;
m_currentScope->addIdToAccessed(name.toString(), idexp->firstSourceLocation());
@@ -671,15 +678,19 @@ bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::IdentifierExpression *idexp)
return true;
}
-FindUnqualifiedIDVisitor::FindUnqualifiedIDVisitor(QStringList qmltypeDirs, QStringList qmltypeFiles, QString code,
- QString fileName, bool silent)
+FindWarningVisitor::FindWarningVisitor(QStringList qmltypeDirs, QStringList qmltypeFiles, QString code,
+ QString fileName, bool silent, bool warnUnqualified,
+ bool warnWithStatement, bool warnInheritanceCycle)
: m_rootScope(ScopeTree::create(ScopeType::JSFunctionScope, "global")),
m_qmltypeDirs(std::move(qmltypeDirs)),
m_qmltypeFiles(std::move(qmltypeFiles)),
m_code(std::move(code)),
m_rootId(QLatin1String("<id>")),
m_filePath(std::move(fileName)),
- m_colorOut(silent)
+ m_colorOut(silent),
+ m_warnUnqualified(warnUnqualified),
+ m_warnWithStatement(warnWithStatement),
+ m_warnInheritanceCycle(warnInheritanceCycle)
{
m_currentScope = m_rootScope;
@@ -711,7 +722,7 @@ FindUnqualifiedIDVisitor::FindUnqualifiedIDVisitor(QStringList qmltypeDirs, QStr
m_currentScope->insertJSIdentifier(jsGlobVar, ScopeType::JSLexicalScope);
}
-bool FindUnqualifiedIDVisitor::check()
+bool FindWarningVisitor::check()
{
if (m_visitFailed)
return false;
@@ -725,11 +736,14 @@ bool FindUnqualifiedIDVisitor::check()
outstandingConnection.uiod->initializer->accept(this);
}
+ if (!m_warnUnqualified)
+ return true;
+
CheckIdentifiers check(&m_colorOut, m_code, m_exportedName2Scope, m_filePath);
return check(m_qmlid2scope, m_rootScope, m_rootId);
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::VariableDeclarationList *vdl)
+bool FindWarningVisitor::visit(QQmlJS::AST::VariableDeclarationList *vdl)
{
while (vdl) {
m_currentScope->insertJSIdentifier(
@@ -742,7 +756,7 @@ bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::VariableDeclarationList *vdl)
return true;
}
-void FindUnqualifiedIDVisitor::visitFunctionExpressionHelper(QQmlJS::AST::FunctionExpression *fexpr)
+void FindWarningVisitor::visitFunctionExpressionHelper(QQmlJS::AST::FunctionExpression *fexpr)
{
using namespace QQmlJS::AST;
auto name = fexpr->name.toString();
@@ -757,36 +771,36 @@ void FindUnqualifiedIDVisitor::visitFunctionExpressionHelper(QQmlJS::AST::Functi
}
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::FunctionExpression *fexpr)
+bool FindWarningVisitor::visit(QQmlJS::AST::FunctionExpression *fexpr)
{
visitFunctionExpressionHelper(fexpr);
return true;
}
-void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::FunctionExpression *)
+void FindWarningVisitor::endVisit(QQmlJS::AST::FunctionExpression *)
{
leaveEnvironment();
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::FunctionDeclaration *fdecl)
+bool FindWarningVisitor::visit(QQmlJS::AST::FunctionDeclaration *fdecl)
{
visitFunctionExpressionHelper(fdecl);
return true;
}
-void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::FunctionDeclaration *)
+void FindWarningVisitor::endVisit(QQmlJS::AST::FunctionDeclaration *)
{
leaveEnvironment();
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::FormalParameterList *fpl)
+bool FindWarningVisitor::visit(QQmlJS::AST::FormalParameterList *fpl)
{
for (auto const &boundName : fpl->boundNames())
m_currentScope->insertJSIdentifier(boundName.id, ScopeType::JSLexicalScope);
return true;
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::UiImport *import)
+bool FindWarningVisitor::visit(QQmlJS::AST::UiImport *import)
{
// construct path
QString prefix = QLatin1String("");
@@ -817,7 +831,7 @@ bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::UiImport *import)
return true;
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::UiEnumDeclaration *uied)
+bool FindWarningVisitor::visit(QQmlJS::AST::UiEnumDeclaration *uied)
{
MetaEnum qmlEnum(uied->name.toString());
for (const auto *member = uied->members; member; member = member->next)
@@ -826,7 +840,7 @@ bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::UiEnumDeclaration *uied)
return true;
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::UiObjectBinding *uiob)
+bool FindWarningVisitor::visit(QQmlJS::AST::UiObjectBinding *uiob)
{
// property QtObject __styleData: QtObject {...}
@@ -849,7 +863,7 @@ bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::UiObjectBinding *uiob)
return true;
}
-void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::UiObjectBinding *uiob)
+void FindWarningVisitor::endVisit(QQmlJS::AST::UiObjectBinding *uiob)
{
const auto childScope = m_currentScope;
leaveEnvironment();
@@ -862,7 +876,7 @@ void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::UiObjectBinding *uiob)
m_currentScope->addProperty(property);
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::UiObjectDefinition *uiod)
+bool FindWarningVisitor::visit(QQmlJS::AST::UiObjectDefinition *uiod)
{
using namespace QQmlJS::AST;
@@ -923,7 +937,7 @@ bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::UiObjectDefinition *uiod)
return true;
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::PatternElement *element)
+bool FindWarningVisitor::visit(QQmlJS::AST::PatternElement *element)
{
if (element->isVariableDeclaration()) {
QQmlJS::AST::BoundNames names;
@@ -939,19 +953,19 @@ bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::PatternElement *element)
return true;
}
-void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::UiObjectDefinition *)
+void FindWarningVisitor::endVisit(QQmlJS::AST::UiObjectDefinition *)
{
auto childScope = m_currentScope;
leaveEnvironment();
childScope->updateParentProperty(m_currentScope);
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::FieldMemberExpression *)
+bool FindWarningVisitor::visit(QQmlJS::AST::FieldMemberExpression *)
{
return true;
}
-void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::FieldMemberExpression *fieldMember)
+void FindWarningVisitor::endVisit(QQmlJS::AST::FieldMemberExpression *fieldMember)
{
using namespace QQmlJS::AST;
ExpressionNode *base = fieldMember->base;
@@ -975,12 +989,12 @@ void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::FieldMemberExpression *fiel
}
}
-bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::BinaryExpression *)
+bool FindWarningVisitor::visit(QQmlJS::AST::BinaryExpression *)
{
return true;
}
-void FindUnqualifiedIDVisitor::endVisit(QQmlJS::AST::BinaryExpression *binExp)
+void FindWarningVisitor::endVisit(QQmlJS::AST::BinaryExpression *binExp)
{
if (binExp->op == QSOperator::As && m_fieldMemberBase == binExp->left)
m_fieldMemberBase = binExp;
diff --git a/tools/qmllint/findunqualified.h b/tools/qmllint/findwarnings.h
index 1782012424..2b99beeac9 100644
--- a/tools/qmllint/findunqualified.h
+++ b/tools/qmllint/findwarnings.h
@@ -48,13 +48,14 @@
#include <QtCore/qscopedpointer.h>
-class FindUnqualifiedIDVisitor : public QQmlJS::AST::Visitor
+class FindWarningVisitor : public QQmlJS::AST::Visitor
{
- Q_DISABLE_COPY_MOVE(FindUnqualifiedIDVisitor)
+ Q_DISABLE_COPY_MOVE(FindWarningVisitor)
public:
- explicit FindUnqualifiedIDVisitor(QStringList qmltypeDirs, QStringList qmltypeFiles, QString code,
- QString fileName, bool silent);
- ~FindUnqualifiedIDVisitor() override = default;
+ explicit FindWarningVisitor(QStringList qmltypeDirs, QStringList qmltypeFiles, QString code,
+ QString fileName, bool silent, bool warnUnqualified,
+ bool warnWithStatement, bool warnInheritanceCycle);
+ ~FindWarningVisitor() override = default;
bool check();
private:
@@ -79,6 +80,10 @@ private:
ColorOutput m_colorOut;
bool m_visitFailed = false;
+ bool m_warnUnqualified;
+ bool m_warnWithStatement;
+ bool m_warnInheritanceCycle;
+
struct OutstandingConnection
{
QString targetName;
diff --git a/tools/qmllint/main.cpp b/tools/qmllint/main.cpp
index 05519fc8d8..100af4cd81 100644
--- a/tools/qmllint/main.cpp
+++ b/tools/qmllint/main.cpp
@@ -26,7 +26,7 @@
**
****************************************************************************/
-#include "findunqualified.h"
+#include "findwarnings.h"
#include <QtQml/private/qqmljslexer_p.h>
#include <QtQml/private/qqmljsparser_p.h>
@@ -47,7 +47,8 @@
#include <QtCore/qlibraryinfo.h>
#endif
-static bool lint_file(const QString &filename, const bool silent, const bool warnUnqualied,
+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)
{
QFile file(filename);
@@ -82,9 +83,10 @@ static bool lint_file(const QString &filename, const bool silent, const bool war
}
}
- if (success && !isJavaScript && warnUnqualied) {
+ if (success && !isJavaScript) {
auto root = parser.rootNode();
- FindUnqualifiedIDVisitor v { qmltypeDirs, qmltypeFiles, code, filename, silent };
+ FindWarningVisitor v { qmltypeDirs, qmltypeFiles, code, filename, silent,
+ warnUnqualified, warnWithStatement, warnInheritanceCycle };
root->accept(&v);
success = v.check();
}
@@ -107,9 +109,18 @@ int main(int argv, char *argc[])
QLatin1String("Don't output syntax errors"));
parser.addOption(silentOption);
- QCommandLineOption checkUnqualified(QStringList() << "U" << "check-unqualified",
- QLatin1String("Warn about unqualified identifiers"));
- parser.addOption(checkUnqualified);
+ QCommandLineOption disableCheckUnqualified(QStringList() << "no-unqualified-id",
+ QLatin1String("Don't warn about unqualified identifiers"));
+ parser.addOption(disableCheckUnqualified);
+
+ QCommandLineOption disableCheckWithStatement(QStringList() << "no-with-statement",
+ QLatin1String("Don't warn about with statement"));
+ parser.addOption(disableCheckWithStatement);
+
+ QCommandLineOption disableCheckInheritanceCycle(QStringList() << "no-inheritance-cycle",
+ QLatin1String("Don't warn about inheritance cycles"));
+
+ parser.addOption(disableCheckInheritanceCycle);
QCommandLineOption qmltypesDirsOption(
QStringList() << "I"
@@ -136,7 +147,10 @@ int main(int argv, char *argc[])
}
bool silent = parser.isSet(silentOption);
- bool warnUnqualified = parser.isSet(checkUnqualified);
+ bool warnUnqualified = !parser.isSet(disableCheckUnqualified);
+ bool warnWithStatement = !parser.isSet(disableCheckWithStatement);
+ 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)
@@ -152,7 +166,9 @@ int main(int argv, char *argc[])
QStringList qmltypeFiles = parser.isSet(qmltypesFilesOption) ? parser.values(qmltypesFilesOption) : QStringList {};
#else
bool silent = false;
- bool warnUnqualified = false;
+ bool warnUnqualified = true;
+ bool warnWithStatement = true;
+ bool warnInheritanceCycle = true;
QStringList qmltypeDirs {};
QStringList qmltypeFiles {};
#endif
@@ -163,7 +179,7 @@ int main(int argv, char *argc[])
const auto arguments = app.arguments();
for (const QString &filename : arguments)
#endif
- success &= lint_file(filename, silent, warnUnqualified, qmltypeDirs, qmltypeFiles);
+ success &= lint_file(filename, silent, warnUnqualified, warnWithStatement, warnInheritanceCycle, qmltypeDirs, qmltypeFiles);
return success ? 0 : -1;
}
diff --git a/tools/qmllint/qmllint.pro b/tools/qmllint/qmllint.pro
index ebe531e323..620e5c3277 100644
--- a/tools/qmllint/qmllint.pro
+++ b/tools/qmllint/qmllint.pro
@@ -8,7 +8,7 @@ SOURCES += \
$$METATYPEREADER_SOURCES \
checkidentifiers.cpp \
main.cpp \
- findunqualified.cpp \
+ findwarnings.cpp \
importedmembersvisitor.cpp \
qcoloroutput.cpp
@@ -19,6 +19,6 @@ load(qt_tool)
HEADERS += \
$$METATYPEREADER_HEADERS \
checkidentifiers.h \
- findunqualified.h \
+ findwarnings.h \
importedmembersvisitor.h \
qcoloroutput.h