diff options
-rw-r--r-- | src/qmlcompiler/qqmljsimportvisitor.cpp | 17 | ||||
-rw-r--r-- | src/qmlcompiler/qqmljsimportvisitor_p.h | 1 | ||||
-rw-r--r-- | tools/qmllint/findwarnings.cpp | 8 |
3 files changed, 22 insertions, 4 deletions
diff --git a/src/qmlcompiler/qqmljsimportvisitor.cpp b/src/qmlcompiler/qqmljsimportvisitor.cpp index bb789a1c66..4be205054d 100644 --- a/src/qmlcompiler/qqmljsimportvisitor.cpp +++ b/src/qmlcompiler/qqmljsimportvisitor.cpp @@ -240,8 +240,8 @@ void QQmlJSImportVisitor::endVisit(QQmlJS::AST::ClassExpression *) bool QQmlJSImportVisitor::visit(UiScriptBinding *scriptBinding) { const auto id = scriptBinding->qualifiedId; + const auto *statement = cast<ExpressionStatement *>(scriptBinding->statement); if (!id->next && id->name == QLatin1String("id")) { - const auto *statement = cast<ExpressionStatement *>(scriptBinding->statement); const auto *idExprension = cast<IdentifierExpression *>(statement->expression); m_scopesById.insert(idExprension->name.toString(), m_currentScope); } else { @@ -258,11 +258,26 @@ bool QQmlJSImportVisitor::visit(UiScriptBinding *scriptBinding) while (m_currentScope->scopeType() == QQmlJSScope::GroupedPropertyScope) leaveEnvironment(); + + if (!statement || !statement->expression->asFunctionDefinition()) { + enterEnvironment(QQmlJSScope::JSFunctionScope, QStringLiteral("binding"), + scriptBinding->statement->firstSourceLocation()); + } } return true; } +void QQmlJSImportVisitor::endVisit(UiScriptBinding *scriptBinding) +{ + const auto id = scriptBinding->qualifiedId; + if (id->next || id->name != QLatin1String("id")) { + const auto *statement = cast<ExpressionStatement *>(scriptBinding->statement); + if (!statement || !statement->expression->asFunctionDefinition()) + leaveEnvironment(); + } +} + bool QQmlJSImportVisitor::visit(QQmlJS::AST::UiEnumDeclaration *uied) { QQmlJSMetaEnum qmlEnum(uied->name.toString()); diff --git a/src/qmlcompiler/qqmljsimportvisitor_p.h b/src/qmlcompiler/qqmljsimportvisitor_p.h index b81b8e8575..dfb4b13c41 100644 --- a/src/qmlcompiler/qqmljsimportvisitor_p.h +++ b/src/qmlcompiler/qqmljsimportvisitor_p.h @@ -65,6 +65,7 @@ protected: void endVisit(QQmlJS::AST::UiObjectDefinition *) override; bool visit(QQmlJS::AST::UiPublicMember *) override; bool visit(QQmlJS::AST::UiScriptBinding *) override; + void endVisit(QQmlJS::AST::UiScriptBinding *) override; bool visit(QQmlJS::AST::UiEnumDeclaration *uied) override; bool visit(QQmlJS::AST::FunctionExpression *fexpr) override; void endVisit(QQmlJS::AST::FunctionExpression *) override; diff --git a/tools/qmllint/findwarnings.cpp b/tools/qmllint/findwarnings.cpp index d7880b0506..fc90884d60 100644 --- a/tools/qmllint/findwarnings.cpp +++ b/tools/qmllint/findwarnings.cpp @@ -194,13 +194,14 @@ bool FindWarningVisitor::visit(QQmlJS::AST::UiScriptBinding *uisb) { using namespace QQmlJS::AST; + const auto qmlScope = m_currentScope; if (!QQmlJSImportVisitor::visit(uisb)) return false; auto name = uisb->qualifiedId->name; if (name == QLatin1String("id")) { // Figure out whether the current scope is the root scope. - if (auto parentScope = m_currentScope->parentScope()) { + if (auto parentScope = qmlScope->parentScope()) { if (!parentScope->parentScope()) { const auto expstat = cast<ExpressionStatement *>(uisb->statement); const auto identexp = cast<IdentifierExpression *>(expstat->expression); @@ -214,7 +215,8 @@ bool FindWarningVisitor::visit(QQmlJS::AST::UiScriptBinding *uisb) if (signal.isEmpty()) return true; - if (!m_currentScope->hasMethod(signal) && m_warnUnqualified) { + + if (!qmlScope->hasMethod(signal) && m_warnUnqualified) { m_errors.append({ QStringLiteral("no matching signal found for handler \"%1\"\n") .arg(name.toString()), @@ -234,7 +236,7 @@ bool FindWarningVisitor::visit(QQmlJS::AST::UiScriptBinding *uisb) } } - for (QQmlJSScope::ConstPtr scope = m_currentScope; scope; scope = scope->baseType()) { + for (QQmlJSScope::ConstPtr scope = qmlScope; scope; scope = scope->baseType()) { const auto methods = scope->ownMethods(); const auto methodsRange = methods.equal_range(signal); for (auto method = methodsRange.first; method != methodsRange.second; ++method) { |