diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-06-05 13:07:50 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-06-21 13:30:44 +0000 |
commit | ce18e987d4ea623c0db6d10f2a97a16b639a234e (patch) | |
tree | 793ce0624f971de8015d5580e6c06d2b1a1b9aab /src/qml/parser/qqmljsast_p.h | |
parent | a12da297946b5a6e767b972bc635a3308683b2e5 (diff) |
Fix more issues with destructuring
Fix destructuring targets that are complex lhs expressions.
There are still some failures remaining, but this fixes
another larger chunk of test cases.
Change-Id: Icf08f42d7c70d4e81be5d5d2e27ebe6249d25467
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/parser/qqmljsast_p.h')
-rw-r--r-- | src/qml/parser/qqmljsast_p.h | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/qml/parser/qqmljsast_p.h b/src/qml/parser/qqmljsast_p.h index 2d4d5662bd..66a4e357e9 100644 --- a/src/qml/parser/qqmljsast_p.h +++ b/src/qml/parser/qqmljsast_p.h @@ -678,7 +678,7 @@ public: } PatternElement(Pattern *pattern, ExpressionNode *i = nullptr, Type t = Binding) - : bindingPattern(pattern), initializer(i), type(t) + : bindingTarget(pattern), initializer(i), type(t) { Q_ASSERT(t >= RestElement); kind = K; @@ -688,13 +688,15 @@ public: virtual bool convertLiteralToAssignmentPattern(MemoryPool *pool, SourceLocation *errorLocation, QString *errorMessage); SourceLocation firstSourceLocation() const override - { return identifierToken.isValid() ? identifierToken : (bindingPattern ? bindingPattern->firstSourceLocation() : initializer->firstSourceLocation()); } + { return identifierToken.isValid() ? identifierToken : (bindingTarget ? bindingTarget->firstSourceLocation() : initializer->firstSourceLocation()); } SourceLocation lastSourceLocation() const override - { return initializer ? initializer->lastSourceLocation() : (bindingPattern ? bindingPattern->lastSourceLocation() : identifierToken); } + { return initializer ? initializer->lastSourceLocation() : (bindingTarget ? bindingTarget->lastSourceLocation() : identifierToken); } - PatternElementList *elementList() const { ArrayPattern *a = cast<ArrayPattern *>(bindingPattern); return a ? a->elements : nullptr; } - PatternPropertyList *propertyList() const { ObjectPattern *o = cast<ObjectPattern *>(bindingPattern); return o ? o->properties : nullptr; } + ExpressionNode *destructuringTarget() const { return bindingTarget; } + Pattern *destructuringPattern() const { return bindingTarget ? bindingTarget->patternCast() : nullptr; } + PatternElementList *elementList() const { ArrayPattern *a = cast<ArrayPattern *>(bindingTarget); return a ? a->elements : nullptr; } + PatternPropertyList *propertyList() const { ObjectPattern *o = cast<ObjectPattern *>(bindingTarget); return o ? o->properties : nullptr; } bool isVariableDeclaration() const { return scope != VariableScope::NoScope; } bool isLexicallyScoped() const { return scope == VariableScope::Let || scope == VariableScope::Const; } @@ -704,7 +706,7 @@ public: // attributes SourceLocation identifierToken; QString bindingIdentifier; - Pattern *bindingPattern = nullptr; + ExpressionNode *bindingTarget = nullptr; ExpressionNode *initializer = nullptr; Type type = Literal; // when used in a VariableDeclarationList @@ -2164,7 +2166,7 @@ public: PatternElement *e = formals->element; if (e && e->type == PatternElement::RestElement) return false; - if (e && (e->initializer || e->bindingPattern)) + if (e && (e->initializer || e->bindingTarget)) return false; formals = formals->next; } |