diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2020-10-22 13:45:32 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-10-27 09:23:36 +0100 |
commit | 3eb705b092bed98b354025ef975e3e4a77c33e76 (patch) | |
tree | 98bbc334771f9ec452671d6236380c0a8f6d99ba /src/qmlcompiler | |
parent | ed8127cf41951a9ff1d6032c2158e49fdebe51c3 (diff) |
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 <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qmlcompiler')
-rw-r--r-- | src/qmlcompiler/qqmljsimportvisitor.cpp | 17 | ||||
-rw-r--r-- | src/qmlcompiler/qqmljsimportvisitor_p.h | 1 |
2 files changed, 17 insertions, 1 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; |