From 1452e977a009fe927ed46c7ea189033dfc2d8126 Mon Sep 17 00:00:00 2001 From: Moti Zilberman Date: Mon, 28 Jan 2019 08:50:24 +0000 Subject: [PATCH] Destructuring: Create assignments from ForX non-declaration patterns (#9414) --- .../src/index.js | 12 +++++++++--- .../for-x-completion-record/input.js | 1 + .../for-x-completion-record/output.js | 9 +++++++++ .../test/fixtures/object-rest/for-x/output.js | 18 +++++++++++------- .../src/index.js | 8 +++++++- .../fixtures/destructuring/for-in/input.js | 4 ++++ .../fixtures/destructuring/for-in/output.js | 8 ++++++++ .../fixtures/destructuring/for-of/input.js | 4 ++++ .../fixtures/destructuring/for-of/output.js | 9 +++++++++ 9 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/for-x-completion-record/input.js create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/for-x-completion-record/output.js diff --git a/packages/babel-plugin-proposal-object-rest-spread/src/index.js b/packages/babel-plugin-proposal-object-rest-spread/src/index.js index 067be9fdb8..915bb59e9e 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/src/index.js +++ b/packages/babel-plugin-proposal-object-rest-spread/src/index.js @@ -377,10 +377,16 @@ export default declare((api, opts) => { path.ensureBlock(); + if (node.body.body.length === 0 && path.isCompletionRecord()) { + node.body.body.unshift( + t.expressionStatement(scope.buildUndefinedNode()), + ); + } + node.body.body.unshift( - t.variableDeclaration("var", [ - t.variableDeclarator(left, t.cloneNode(temp)), - ]), + t.expressionStatement( + t.assignmentExpression("=", left, t.cloneNode(temp)), + ), ); return; diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/for-x-completion-record/input.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/for-x-completion-record/input.js new file mode 100644 index 0000000000..30967ff438 --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/for-x-completion-record/input.js @@ -0,0 +1 @@ +for ({a, ...b} of []) {} diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/for-x-completion-record/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/for-x-completion-record/output.js new file mode 100644 index 0000000000..01e54fb98a --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/for-x-completion-record/output.js @@ -0,0 +1,9 @@ +for (var _ref of []) { + var _ref2 = _ref; + ({ + a + } = _ref2); + b = babelHelpers.objectWithoutProperties(_ref2, ["a"]); + _ref2; + void 0; +} diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/for-x/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/for-x/output.js index 0e0f037551..ba843ac52a 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/for-x/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/for-x/output.js @@ -7,18 +7,22 @@ for (var _ref of []) { } for (var _ref2 of []) { - var { + var _ref3 = _ref2; + ({ a - } = _ref2, - b = babelHelpers.objectWithoutProperties(_ref2, ["a"]); + } = _ref3); + b = babelHelpers.objectWithoutProperties(_ref3, ["a"]); + _ref3; } async function a() { - for await (var _ref3 of []) { - var { + for await (var _ref4 of []) { + var _ref5 = _ref4; + ({ a - } = _ref3, - b = babelHelpers.objectWithoutProperties(_ref3, ["a"]); + } = _ref5); + b = babelHelpers.objectWithoutProperties(_ref5, ["a"]); + _ref5; } } // skip diff --git a/packages/babel-plugin-transform-destructuring/src/index.js b/packages/babel-plugin-transform-destructuring/src/index.js index 3e8bd46429..52a76928e1 100644 --- a/packages/babel-plugin-transform-destructuring/src/index.js +++ b/packages/babel-plugin-transform-destructuring/src/index.js @@ -449,8 +449,14 @@ export default declare((api, options) => { path.ensureBlock(); + if (node.body.body.length === 0 && path.isCompletionRecord()) { + node.body.body.unshift( + t.expressionStatement(scope.buildUndefinedNode()), + ); + } + node.body.body.unshift( - t.variableDeclaration("var", [t.variableDeclarator(left, temp)]), + t.expressionStatement(t.assignmentExpression("=", left, temp)), ); return; diff --git a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-in/input.js b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-in/input.js index 87fe7e7dde..f7a87fe3f8 100644 --- a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-in/input.js +++ b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-in/input.js @@ -1,3 +1,7 @@ for (var [name, value] in obj) { print("Name: " + name + ", Value: " + value); } + +for ([name, value] in obj) { + print("Name: " + name + ", Value: " + value); +} diff --git a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-in/output.js b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-in/output.js index ce9032c5c1..6f2e55a2b0 100644 --- a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-in/output.js +++ b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-in/output.js @@ -5,3 +5,11 @@ for (var _ref in obj) { var value = _ref2[1]; print("Name: " + name + ", Value: " + value); } + +for (var _ref3 in obj) { + var _ref4 = babelHelpers.slicedToArray(_ref3, 2); + + name = _ref4[0]; + value = _ref4[1]; + print("Name: " + name + ", Value: " + value); +} diff --git a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-of/input.js b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-of/input.js index d8aae78557..47a53442b9 100644 --- a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-of/input.js +++ b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-of/input.js @@ -1,3 +1,7 @@ for (var [ name, before, after ] of test.expectation.registers) { } + +for ([ name, before, after ] of test.expectation.registers) { + +} diff --git a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-of/output.js b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-of/output.js index 45ddc2fc6a..570f8b2ef6 100644 --- a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-of/output.js +++ b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/for-of/output.js @@ -5,3 +5,12 @@ for (var _ref of test.expectation.registers) { var before = _ref2[1]; var after = _ref2[2]; } + +for (var _ref3 of test.expectation.registers) { + var _ref4 = babelHelpers.slicedToArray(_ref3, 3); + + name = _ref4[0]; + before = _ref4[1]; + after = _ref4[2]; + void 0; +}