aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlcompiler
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-10-22 13:45:32 +0200
committerUlf Hermann <ulf.hermann@qt.io>2020-10-27 09:23:36 +0100
commit3eb705b092bed98b354025ef975e3e4a77c33e76 (patch)
tree98bbc334771f9ec452671d6236380c0a8f6d99ba /src/qmlcompiler
parented8127cf41951a9ff1d6032c2158e49fdebe51c3 (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.cpp17
-rw-r--r--src/qmlcompiler/qqmljsimportvisitor_p.h1
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;