From aefbb1380eeb2f3ca5f5dcf9b419be4371612d20 Mon Sep 17 00:00:00 2001 From: Anatoli Papirovski Date: Thu, 9 Nov 2017 14:51:56 -0500 Subject: [PATCH] No unneeded empty arrays in transform spread (#6763) * No unneeded empty arrays in transform spread Since Array.prototype.concat creates a new array from inputs, there's no need to call it from a new empty array ([].concat()). * [fixup] simplify detection of new array --- .../destructuring/array-unpack-optimisation/expected.js | 2 +- packages/babel-plugin-transform-spread/README.md | 2 +- packages/babel-plugin-transform-spread/src/index.js | 8 ++++---- .../test/fixtures/spread/arguments-array/expected.js | 2 +- .../test/fixtures/spread/array-literal-first/expected.js | 2 +- .../test/fixtures/spread/known-rest/expected.js | 2 +- .../test/fixtures/spread/single/expected.js | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/array-unpack-optimisation/expected.js b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/array-unpack-optimisation/expected.js index 32816cdc73..7743f54e7c 100644 --- a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/array-unpack-optimisation/expected.js +++ b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/array-unpack-optimisation/expected.js @@ -21,7 +21,7 @@ var _ref4 = [a[1], a[0]]; a[0] = _ref4[0]; a[1] = _ref4[1]; -var _ref5 = [].concat(babelHelpers.toConsumableArray(foo), [bar]), +var _ref5 = babelHelpers.toConsumableArray(foo).concat([bar]), a = _ref5[0], b = _ref5[1]; diff --git a/packages/babel-plugin-transform-spread/README.md b/packages/babel-plugin-transform-spread/README.md index 5f7ca6de78..42aaf881d7 100644 --- a/packages/babel-plugin-transform-spread/README.md +++ b/packages/babel-plugin-transform-spread/README.md @@ -15,7 +15,7 @@ var b = [...a, 'foo']; ```js var a = [ 'a', 'b', 'c' ]; -var b = [].concat(a, [ 'foo' ]); +var b = a.concat([ 'foo' ]); ``` ## Installation diff --git a/packages/babel-plugin-transform-spread/src/index.js b/packages/babel-plugin-transform-spread/src/index.js index 8a2a77ed61..6c23a02595 100644 --- a/packages/babel-plugin-transform-spread/src/index.js +++ b/packages/babel-plugin-transform-spread/src/index.js @@ -52,11 +52,11 @@ export default function(api, options) { if (!hasSpread(elements)) return; const nodes = build(elements, scope, state); - let first = nodes.shift(); + const first = nodes.shift(); - if (!t.isArrayExpression(first)) { - nodes.unshift(first); - first = t.arrayExpression([]); + if (nodes.length === 0 && first !== elements[0].argument) { + path.replaceWith(first); + return; } path.replaceWith( diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/arguments-array/expected.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/arguments-array/expected.js index 09da80138e..5cae73788a 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/spread/arguments-array/expected.js +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/arguments-array/expected.js @@ -1,5 +1,5 @@ function foo() { - return bar([].concat(Array.prototype.slice.call(arguments))); + return bar(Array.prototype.slice.call(arguments)); } function bar(one, two, three) { diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/array-literal-first/expected.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/array-literal-first/expected.js index 1da8c64e83..fbe8da8f82 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/spread/array-literal-first/expected.js +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/array-literal-first/expected.js @@ -1 +1 @@ -var lyrics = [].concat(babelHelpers.toConsumableArray(parts), ["head", "and", "toes"]); +var lyrics = babelHelpers.toConsumableArray(parts).concat(["head", "and", "toes"]); diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/known-rest/expected.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/known-rest/expected.js index 4cd381b324..64c67e4ca8 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/spread/known-rest/expected.js +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/known-rest/expected.js @@ -3,5 +3,5 @@ function foo() { bar[_key] = arguments[_key]; } - return [].concat(bar); + return bar.concat(); } diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/single/expected.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/single/expected.js index 9286e2ae99..c9808b4b97 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/spread/single/expected.js +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/single/expected.js @@ -1 +1 @@ -[].concat(babelHelpers.toConsumableArray(foo)); +babelHelpers.toConsumableArray(foo);