From 3eb705b092bed98b354025ef975e3e4a77c33e76 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 22 Oct 2020 13:45:32 +0200 Subject: QmlCompiler: Add JS scopes for script bindings This is necessary to identify the available QML and JS scopes for the binding, and to add any identifiers found there. Change-Id: Ic966e7817ccd1fdc064dd433d16fa6c42c9110cc Reviewed-by: Fabian Kosmale --- src/qmlcompiler/qqmljsimportvisitor.cpp | 17 ++++++++++++++++- src/qmlcompiler/qqmljsimportvisitor_p.h | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) (limited to 'src/qmlcompiler') 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(scriptBinding->statement); if (!id->next && id->name == QLatin1String("id")) { - const auto *statement = cast(scriptBinding->statement); const auto *idExprension = cast(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(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; -- cgit v1.2.3