From dd9758b43d6b054e8edd1780b1d2834f5a429a1a Mon Sep 17 00:00:00 2001 From: hufeng Date: Wed, 23 Nov 2022 08:18:41 +0000 Subject: [PATCH] Fix destructuring assignment in loopStatement Signed-off-by: hufeng Change-Id: I20b5c4d3cc51c1cf65b835464838cb0399361daf --- es2panda/compiler/base/destructuring.cpp | 26 ++++++++++++------- es2panda/compiler/base/lreference.cpp | 4 ++- es2panda/parser/statementParser.cpp | 6 ++++- ...rray-expr-destructring-in-for-expected.txt | 2 ++ .../test-array-expr-destructring-in-for.js | 11 ++++++++ ...-obj-expr-destructring-in-for-expected.txt | 2 ++ .../test-obj-expr-destructring-in-for.js | 11 ++++++++ es2panda/test/test_tsc_ignore_list.txt | 4 --- 8 files changed, 51 insertions(+), 15 deletions(-) create mode 100644 es2panda/test/compiler/js/language/destructuring/test-array-expr-destructring-in-for-expected.txt create mode 100644 es2panda/test/compiler/js/language/destructuring/test-array-expr-destructring-in-for.js create mode 100644 es2panda/test/compiler/js/language/destructuring/test-obj-expr-destructring-in-for-expected.txt create mode 100644 es2panda/test/compiler/js/language/destructuring/test-obj-expr-destructring-in-for.js diff --git a/es2panda/compiler/base/destructuring.cpp b/es2panda/compiler/base/destructuring.cpp index 5761a02177..24af709a12 100644 --- a/es2panda/compiler/base/destructuring.cpp +++ b/es2panda/compiler/base/destructuring.cpp @@ -99,9 +99,11 @@ static void GenArray(PandaGen *pg, const ir::ArrayExpression *array) const ir::Expression *init = nullptr; const ir::Expression *target = element; - if (element->IsAssignmentPattern()) { - target = element->AsAssignmentPattern()->Left(); - init = element->AsAssignmentPattern()->Right(); + if (element->IsAssignmentPattern() || element->IsAssignmentExpression()) { + auto *assignment = element->IsAssignmentPattern() ? element->AsAssignmentPattern() : + element->AsAssignmentExpression(); + target = assignment->Left(); + init = assignment->Right(); } LReference lref = LReference::CreateLRef(pg, target, array->IsDeclaration()); @@ -157,9 +159,11 @@ static void GenObjectProperty(PandaGen *pg, const ir::ObjectExpression *object, const ir::Expression *key = propExpr->Key(); const ir::Expression *target = propExpr->Value(); - if (target->IsAssignmentPattern()) { - init = target->AsAssignmentPattern()->Right(); - target = target->AsAssignmentPattern()->Left(); + if (target->IsAssignmentPattern() || target->IsAssignmentExpression()) { + auto *assignment = target->IsAssignmentPattern() ? target->AsAssignmentPattern() : + target->AsAssignmentExpression(); + init = assignment->Right(); + target = assignment->Left(); } // compile key @@ -249,10 +253,14 @@ void Destructuring::Compile(PandaGen *pg, const ir::Expression *pattern) VReg rhs = pg->AllocReg(); pg->StoreAccumulator(pattern, rhs); - if (pattern->IsArrayPattern()) { - GenArray(pg, pattern->AsArrayPattern()); + if (pattern->IsArrayPattern() || pattern->IsArrayExpression()) { + auto *arrExpr = pattern->IsArrayPattern() ? pattern->AsArrayPattern() : + pattern->AsArrayExpression(); + GenArray(pg, arrExpr); } else { - GenObject(pg, pattern->AsObjectPattern(), rhs); + auto *objExpr = pattern->IsObjectPattern() ? pattern->AsObjectPattern() : + pattern->AsObjectExpression(); + GenObject(pg, objExpr, rhs); } pg->LoadAccumulator(pattern, rhs); diff --git a/es2panda/compiler/base/lreference.cpp b/es2panda/compiler/base/lreference.cpp index 53587e65b4..e354250c80 100644 --- a/es2panda/compiler/base/lreference.cpp +++ b/es2panda/compiler/base/lreference.cpp @@ -114,7 +114,9 @@ LReference LReference::CreateLRef(PandaGen *pg, const ir::AstNode *node, bool is return LReference::CreateLRef(pg, node->AsVariableDeclarator()->Id(), true); } case ir::AstNodeType::ARRAY_PATTERN: - case ir::AstNodeType::OBJECT_PATTERN: { + case ir::AstNodeType::OBJECT_PATTERN: + case ir::AstNodeType::ARRAY_EXPRESSION: + case ir::AstNodeType::OBJECT_EXPRESSION: { return {node, pg, isDeclaration, ReferenceKind::DESTRUCTURING, {}}; } case ir::AstNodeType::ASSIGNMENT_PATTERN: { diff --git a/es2panda/parser/statementParser.cpp b/es2panda/parser/statementParser.cpp index b9c73c0ad8..7c633848fd 100644 --- a/es2panda/parser/statementParser.cpp +++ b/es2panda/parser/statementParser.cpp @@ -1356,7 +1356,8 @@ std::tuple ThrowSyntaxError("Unexpected token"); } - ir::Expression *expr = ParseAssignmentExpression(leftNode); + exprFlags &= ExpressionParseFlags::POTENTIALLY_IN_PATTERN; + ir::Expression *expr = ParseAssignmentExpression(leftNode, exprFlags); if (lexer_->GetToken().Type() == lexer::TokenType::PUNCTUATOR_COMMA) { initNode = ParseSequenceExpression(expr); @@ -1502,6 +1503,9 @@ ir::Statement *ParserImpl::ParseForStatement() std::tie(rightNode, updateNode) = ParseForUpdate(isAwait); } else if (leftNode) { // initNode was parsed as LHS + if (leftNode->IsArrayExpression() || leftNode->IsObjectExpression()) { + exprFlags |= ExpressionParseFlags::POTENTIALLY_IN_PATTERN; + } std::tie(forKind, initNode, rightNode, updateNode) = ParseForInOf(leftNode, exprFlags, isAwait); } else if (initNode) { // initNode was parsed as VariableDeclaration and declaration size = 1 diff --git a/es2panda/test/compiler/js/language/destructuring/test-array-expr-destructring-in-for-expected.txt b/es2panda/test/compiler/js/language/destructuring/test-array-expr-destructring-in-for-expected.txt new file mode 100644 index 0000000000..fad30353bb --- /dev/null +++ b/es2panda/test/compiler/js/language/destructuring/test-array-expr-destructring-in-for-expected.txt @@ -0,0 +1,2 @@ +mower +mower diff --git a/es2panda/test/compiler/js/language/destructuring/test-array-expr-destructring-in-for.js b/es2panda/test/compiler/js/language/destructuring/test-array-expr-destructring-in-for.js new file mode 100644 index 0000000000..4cf992e1b1 --- /dev/null +++ b/es2panda/test/compiler/js/language/destructuring/test-array-expr-destructring-in-for.js @@ -0,0 +1,11 @@ +let robotA = [1, "mower", "mowing"]; +let i = undefined; +let nameA = undefined; + +for ([, nameA] = robotA, i = 0; i < 1; i++) { + print(nameA); +} + +for ([, nameA = "name"] = robotA, i = 0; i < 1; i++) { + print(nameA); +} diff --git a/es2panda/test/compiler/js/language/destructuring/test-obj-expr-destructring-in-for-expected.txt b/es2panda/test/compiler/js/language/destructuring/test-obj-expr-destructring-in-for-expected.txt new file mode 100644 index 0000000000..fad30353bb --- /dev/null +++ b/es2panda/test/compiler/js/language/destructuring/test-obj-expr-destructring-in-for-expected.txt @@ -0,0 +1,2 @@ +mower +mower diff --git a/es2panda/test/compiler/js/language/destructuring/test-obj-expr-destructring-in-for.js b/es2panda/test/compiler/js/language/destructuring/test-obj-expr-destructring-in-for.js new file mode 100644 index 0000000000..6c8d0204c0 --- /dev/null +++ b/es2panda/test/compiler/js/language/destructuring/test-obj-expr-destructring-in-for.js @@ -0,0 +1,11 @@ +let robotA = {name: "mower", skill: "mowing"}; +let i = undefined; +let nameA = undefined; + +for ({name: nameA} = robotA, i = 0; i < 1; i++) { + print(nameA); +} + +for ({name: nameA = "name"} = robotA, i = 0; i < 1; i++) { + print(nameA); +} diff --git a/es2panda/test/test_tsc_ignore_list.txt b/es2panda/test/test_tsc_ignore_list.txt index 8c112aa8bc..53244a0ebf 100644 --- a/es2panda/test/test_tsc_ignore_list.txt +++ b/es2panda/test/test_tsc_ignore_list.txt @@ -28,10 +28,6 @@ es2panda/test/TypeScript/tests/cases/compiler/parameterInitializerBeforeDestruct es2panda/test/TypeScript/tests/cases/compiler/shebang.ts es2panda/test/TypeScript/tests/cases/compiler/sigantureIsSubTypeIfTheyAreIdentical.ts es2panda/test/TypeScript/tests/cases/compiler/sourceMap-LineBreaks.ts -es2panda/test/TypeScript/tests/cases/compiler/sourceMapValidationDestructuringForArrayBindingPattern2.ts -es2panda/test/TypeScript/tests/cases/compiler/sourceMapValidationDestructuringForArrayBindingPatternDefaultValues2.ts -es2panda/test/TypeScript/tests/cases/compiler/sourceMapValidationDestructuringForObjectBindingPattern2.ts -es2panda/test/TypeScript/tests/cases/compiler/sourceMapValidationDestructuringForObjectBindingPatternDefaultValues2.ts es2panda/test/TypeScript/tests/cases/compiler/withStatementInternalComments.ts es2panda/test/TypeScript/tests/cases/conformance/async/es2017/asyncAwait_es2017.ts es2panda/test/TypeScript/tests/cases/conformance/es6/arrowFunction/emitArrowFunctionWhenUsingArguments03_ES6.ts -- Gitee