From 9fc51d62929e6d134abc8f63d840f0cf27c63665 Mon Sep 17 00:00:00 2001 From: Moti Zilberman Date: Fri, 14 Oct 2016 18:51:22 +0300 Subject: [PATCH] Consolidate contiguous var declarations in destructuring transform (#4690) * Consolidate contiguous var declarations in destructuring transform Fixes #3081. * Simplify var node coalescing in es2015-destructuring * Revert "Simplify var node coalescing in es2015-destructuring" This reverts commit 15cb373f0726f68225f7080a7ae206a63af174ee. * More careful condition for var coalescing in es2015-destructuring --- .../general/destructuring/expected.js | 20 +++--- .../src/index.js | 16 ++++- .../array-unpack-optimisation/expected.js | 62 +++++++++---------- .../fixtures/destructuring/array/expected.js | 8 +-- .../fixtures/destructuring/empty/expected.js | 18 +++--- .../destructuring/es7-object-rest/expected.js | 12 ++-- .../destructuring/export-variable/expected.js | 4 +- .../destructuring/issue-3081/actual.js | 4 ++ .../destructuring/issue-3081/expected.js | 4 ++ .../destructuring/known-array/expected.js | 4 +- .../fixtures/destructuring/mixed/expected.js | 15 ++--- .../destructuring/multiple/expected.js | 6 +- .../destructuring/object-advanced/expected.js | 18 +++--- .../destructuring/object-basic/expected.js | 4 +- .../destructuring/parameters/expected.js | 32 +++++----- .../fixtures/destructuring/spread/expected.js | 10 ++- .../fixtures/regression/T7199/expected.js | 5 +- .../parameters/destructuring-rest/expected.js | 6 +- 18 files changed, 129 insertions(+), 119 deletions(-) create mode 100644 packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/issue-3081/actual.js create mode 100644 packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/issue-3081/expected.js diff --git a/packages/babel-plugin-check-es2015-constants/test/fixtures/general/destructuring/expected.js b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/destructuring/expected.js index 3ad6e248ea..ebf2bc2245 100644 --- a/packages/babel-plugin-check-es2015-constants/test/fixtures/general/destructuring/expected.js +++ b/packages/babel-plugin-check-es2015-constants/test/fixtures/general/destructuring/expected.js @@ -1,10 +1,10 @@ -var a = 1; -var b = 2; -var c = 3; -var d = 4; -var _e$f = { e: 5, f: 6 }; -var e = _e$f.e; -var f = _e$f.f; -var _a$b = { a: 7, b: 8 }; -var g = _a$b.a; -var h = _a$b.b; +var a = 1, + b = 2; +var c = 3, + d = 4; +var _e$f = { e: 5, f: 6 }, + e = _e$f.e, + f = _e$f.f; +var _a$b = { a: 7, b: 8 }, + g = _a$b.a, + h = _a$b.b; diff --git a/packages/babel-plugin-transform-es2015-destructuring/src/index.js b/packages/babel-plugin-transform-es2015-destructuring/src/index.js index 0a80489ac9..cad6e15b93 100644 --- a/packages/babel-plugin-transform-es2015-destructuring/src/index.js +++ b/packages/babel-plugin-transform-es2015-destructuring/src/index.js @@ -492,7 +492,21 @@ export default function ({ types: t }) { } } - path.replaceWithMultiple(nodes); + const nodesOut = []; + for (const node of nodes) { + const tail = nodesOut[nodesOut.length - 1]; + if (tail && t.isVariableDeclaration(tail) && t.isVariableDeclaration(node) && tail.kind === node.kind) { + tail.declarations.push(...node.declarations); + } else { + nodesOut.push(node); + } + } + + if (nodesOut.length === 1) { + path.replaceWith(nodesOut[0]); + } else { + path.replaceWithMultiple(nodesOut); + } } } }; diff --git a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/array-unpack-optimisation/expected.js b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/array-unpack-optimisation/expected.js index e26edabdaf..32816cdc73 100644 --- a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/array-unpack-optimisation/expected.js +++ b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/array-unpack-optimisation/expected.js @@ -1,36 +1,36 @@ -var a = 1; -var b = 2; -var a = 1; -var b = 2; -var a = 1; -var b = 2; -var c = [3, 4]; -var a = 1; -var b = 2; -var c = [3, 4]; -var _ref = [1, 2, 3]; -var a = _ref[0]; -var b = _ref[1]; -var _ref2 = [1, 2, 3]; -var a = _ref2[0]; -var b = _ref2[1]; -var _ref3 = [a, b]; -var a = _ref3[0]; -var b = _ref3[1]; +var a = 1, + b = 2; +var a = 1, + b = 2; +var a = 1, + b = 2, + c = [3, 4]; +var a = 1, + b = 2, + c = [3, 4]; +var _ref = [1, 2, 3], + a = _ref[0], + b = _ref[1]; +var _ref2 = [1, 2, 3], + a = _ref2[0], + b = _ref2[1]; +var _ref3 = [a, b], + a = _ref3[0], + b = _ref3[1]; var _ref4 = [a[1], a[0]]; a[0] = _ref4[0]; a[1] = _ref4[1]; -var _ref5 = [].concat(babelHelpers.toConsumableArray(foo), [bar]); +var _ref5 = [].concat(babelHelpers.toConsumableArray(foo), [bar]), + a = _ref5[0], + b = _ref5[1]; -var a = _ref5[0]; -var b = _ref5[1]; -var _ref6 = [foo(), bar]; -var a = _ref6[0]; -var b = _ref6[1]; -var _ref7 = [clazz.foo(), bar]; -var a = _ref7[0]; -var b = _ref7[1]; -var _ref8 = [clazz.foo, bar]; -var a = _ref8[0]; -var b = _ref8[1]; +var _ref6 = [foo(), bar], + a = _ref6[0], + b = _ref6[1]; +var _ref7 = [clazz.foo(), bar], + a = _ref7[0], + b = _ref7[1]; +var _ref8 = [clazz.foo, bar], + a = _ref8[0], + b = _ref8[1]; diff --git a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/array/expected.js b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/array/expected.js index ca9b5413ef..74bd2ba3b4 100644 --- a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/array/expected.js +++ b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/array/expected.js @@ -1,7 +1,7 @@ -var a = "hello"; -var _ref = [", ", "junk"]; -var b = _ref[0]; -var c = "world"; +var a = "hello", + _ref = [", ", "junk"], + b = _ref[0], + c = "world"; a = "hello"; var _ref2 = [", ", "junk"]; b = _ref2[0]; diff --git a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/empty/expected.js b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/empty/expected.js index f075fa1000..006976fc0e 100644 --- a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/empty/expected.js +++ b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/empty/expected.js @@ -1,11 +1,7 @@ -var _ref = ["foo", "hello", [", ", "junk"], ["world"]]; -var a = _ref[1]; - -var _ref$ = babelHelpers.slicedToArray(_ref[2], 1); - -var b = _ref$[0]; - -var _ref$2 = babelHelpers.slicedToArray(_ref[3], 1); - -var c = _ref$2[0]; -var d = _ref[4]; +var _ref = ["foo", "hello", [", ", "junk"], ["world"]], + a = _ref[1], + _ref$ = babelHelpers.slicedToArray(_ref[2], 1), + b = _ref$[0], + _ref$2 = babelHelpers.slicedToArray(_ref[3], 1), + c = _ref$2[0], + d = _ref[4]; diff --git a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/es7-object-rest/expected.js b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/es7-object-rest/expected.js index 935f76c0e0..7fa15501b2 100644 --- a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/es7-object-rest/expected.js +++ b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/es7-object-rest/expected.js @@ -1,11 +1,11 @@ var z = {}; var x = babelHelpers.objectWithoutProperties(z, []); -var x = z.x; -var y = babelHelpers.objectWithoutProperties(z, ["x"]); -var x = z[x]; -var y = babelHelpers.objectWithoutProperties(z, [x]); +var x = z.x, + y = babelHelpers.objectWithoutProperties(z, ["x"]); +var x = z[x], + y = babelHelpers.objectWithoutProperties(z, [x]); (function (_ref) { - var x = _ref.x; - var y = babelHelpers.objectWithoutProperties(_ref, ["x"]); + var x = _ref.x, + y = babelHelpers.objectWithoutProperties(_ref, ["x"]); }); diff --git a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/export-variable/expected.js b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/export-variable/expected.js index 01bd34a215..54ea198599 100644 --- a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/export-variable/expected.js +++ b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/export-variable/expected.js @@ -1,6 +1,6 @@ var _ref = {}; -var a = _ref.a; -var b = _ref.b; +var a = _ref.a, + b = _ref.b; var _ref$c = _ref.c; var d = _ref$c.d; var _ref$c$e$f = _ref$c.e.f; diff --git a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/issue-3081/actual.js b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/issue-3081/actual.js new file mode 100644 index 0000000000..bb96a2b37b --- /dev/null +++ b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/issue-3081/actual.js @@ -0,0 +1,4 @@ +let list = [1, 2, 3, 4]; +for (let i = 0, { length } = list; i < length; i++) { + list[i]; +} diff --git a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/issue-3081/expected.js b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/issue-3081/expected.js new file mode 100644 index 0000000000..849668b3e1 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/issue-3081/expected.js @@ -0,0 +1,4 @@ +var list = [1, 2, 3, 4]; +for (var i = 0, length = list.length; i < length; i++) { + list[i]; +} diff --git a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/known-array/expected.js b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/known-array/expected.js index 34c0ca8df5..83f1e94521 100644 --- a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/known-array/expected.js +++ b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/known-array/expected.js @@ -1,3 +1,3 @@ var z = []; -var x = z[0]; -var y = z.slice(1); +var x = z[0], + y = z.slice(1); diff --git a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/mixed/expected.js b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/mixed/expected.js index dfb38be734..724eb30084 100644 --- a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/mixed/expected.js +++ b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/mixed/expected.js @@ -1,11 +1,8 @@ var rect = {}; -var _rect$topLeft = babelHelpers.slicedToArray(rect.topLeft, 2); - -var x1 = _rect$topLeft[0]; -var y1 = _rect$topLeft[1]; - -var _rect$bottomRight = babelHelpers.slicedToArray(rect.bottomRight, 2); - -var x2 = _rect$bottomRight[0]; -var y2 = _rect$bottomRight[1]; +var _rect$topLeft = babelHelpers.slicedToArray(rect.topLeft, 2), + x1 = _rect$topLeft[0], + y1 = _rect$topLeft[1], + _rect$bottomRight = babelHelpers.slicedToArray(rect.bottomRight, 2), + x2 = _rect$bottomRight[0], + y2 = _rect$bottomRight[1]; diff --git a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/multiple/expected.js b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/multiple/expected.js index b77339c9e8..2d16bfa7ae 100644 --- a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/multiple/expected.js +++ b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/multiple/expected.js @@ -1,4 +1,4 @@ var coords = [1, 2]; -var x = coords.x; -var y = coords.y; -var foo = "bar"; +var x = coords.x, + y = coords.y, + foo = "bar"; diff --git a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/object-advanced/expected.js b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/object-advanced/expected.js index 8086ab92ee..188ae7e610 100644 --- a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/object-advanced/expected.js +++ b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/object-advanced/expected.js @@ -1,10 +1,10 @@ var rect = {}; -var _rect$topLeft = rect.topLeft; -var x1 = _rect$topLeft.x; -var y1 = _rect$topLeft.y; -var _rect$bottomRight = rect.bottomRight; -var x2 = _rect$bottomRight.x; -var y2 = _rect$bottomRight.y; -var _ref = [0, 1, 2, 3, 4, 5, 6]; -var foo = _ref[3]; -var bar = _ref[5]; +var _rect$topLeft = rect.topLeft, + x1 = _rect$topLeft.x, + y1 = _rect$topLeft.y, + _rect$bottomRight = rect.bottomRight, + x2 = _rect$bottomRight.x, + y2 = _rect$bottomRight.y; +var _ref = [0, 1, 2, 3, 4, 5, 6], + foo = _ref[3], + bar = _ref[5]; diff --git a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/object-basic/expected.js b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/object-basic/expected.js index 24833dda4c..08012b6ccc 100644 --- a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/object-basic/expected.js +++ b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/object-basic/expected.js @@ -1,3 +1,3 @@ var coords = [1, 2]; -var x = coords.x; -var y = coords.y; +var x = coords.x, + y = coords.y; diff --git a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/parameters/expected.js b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/parameters/expected.js index bfd42de2b8..9ac248f802 100644 --- a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/parameters/expected.js +++ b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/parameters/expected.js @@ -1,17 +1,17 @@ function somethingAdvanced(_ref, p2, p3) { var _ref$topLeft = _ref.topLeft; _ref$topLeft = _ref$topLeft === undefined ? {} : _ref$topLeft; - var x1 = _ref$topLeft.x; - var y1 = _ref$topLeft.y; - var _ref$bottomRight = _ref.bottomRight; + var x1 = _ref$topLeft.x, + y1 = _ref$topLeft.y, + _ref$bottomRight = _ref.bottomRight; _ref$bottomRight = _ref$bottomRight === undefined ? {} : _ref$bottomRight; - var x2 = _ref$bottomRight.x; - var y2 = _ref$bottomRight.y; + var x2 = _ref$bottomRight.x, + y2 = _ref$bottomRight.y; } function unpackObject(_ref2) { - var title = _ref2.title; - var author = _ref2.author; + var title = _ref2.title, + author = _ref2.author; return title + " " + author; } @@ -19,17 +19,15 @@ function unpackObject(_ref2) { console.log(unpackObject({ title: "title", author: "author" })); var unpackArray = function (_ref3, _ref4) { - var _ref6 = babelHelpers.slicedToArray(_ref3, 3); + var _ref6 = babelHelpers.slicedToArray(_ref3, 3), + a = _ref6[0], + b = _ref6[1], + c = _ref6[2]; - var a = _ref6[0]; - var b = _ref6[1]; - var c = _ref6[2]; - - var _ref5 = babelHelpers.slicedToArray(_ref4, 3); - - var x = _ref5[0]; - var y = _ref5[1]; - var z = _ref5[2]; + var _ref5 = babelHelpers.slicedToArray(_ref4, 3), + x = _ref5[0], + y = _ref5[1], + z = _ref5[2]; return a + b + c; }; diff --git a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/spread/expected.js b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/spread/expected.js index 798f3a407a..0b25cb693e 100644 --- a/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/spread/expected.js +++ b/packages/babel-plugin-transform-es2015-destructuring/test/fixtures/destructuring/spread/expected.js @@ -1,10 +1,8 @@ function isSorted(_ref) { - var _ref2 = babelHelpers.toArray(_ref); - - var x = _ref2[0]; - var y = _ref2[1]; - - var wow = _ref2.slice(2); + var _ref2 = babelHelpers.toArray(_ref), + x = _ref2[0], + y = _ref2[1], + wow = _ref2.slice(2); if (!zs.length) return true; if (y > x) return isSorted(zs); diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/expected.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/expected.js index 04d5367ebd..3c43558543 100644 --- a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/expected.js +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7199/expected.js @@ -8,8 +8,7 @@ var _foo2 = _interopRequireDefault(_foo); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -var _bar = bar; - -var _bar2 = _slicedToArray(_bar, 1); +var _bar = bar, + _bar2 = _slicedToArray(_bar, 1); const x = _bar2[0]; diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/destructuring-rest/expected.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/destructuring-rest/expected.js index 5350b8fade..13f1b457d7 100644 --- a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/destructuring-rest/expected.js +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/destructuring-rest/expected.js @@ -2,12 +2,12 @@ function t() { var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "default"; var _ref = arguments[1]; - var a = _ref.a; - var b = _ref.b; + var a = _ref.a, + b = _ref.b; for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } console.log(x, a, b, args); -} \ No newline at end of file +}