diff --git a/packages/babel-plugin-transform-parameters/src/rest.js b/packages/babel-plugin-transform-parameters/src/rest.js index 4f0817b857de..da85c7e5ad95 100644 --- a/packages/babel-plugin-transform-parameters/src/rest.js +++ b/packages/babel-plugin-transform-parameters/src/rest.js @@ -228,10 +228,20 @@ export default function convertFunctionRest(path) { const { node, scope } = path; if (!hasRest(node)) return false; - const rest = node.params.pop().argument; + let rest = node.params.pop().argument; const argsId = t.identifier("arguments"); + if (t.isPattern(rest)) { + const pattern = rest; + rest = scope.generateUidIdentifier("ref"); + + const declar = t.variableDeclaration("let", [ + t.variableDeclarator(pattern, rest), + ]); + node.body.body.unshift(declar); + } + // check and optimise for extremely common cases const state = { references: [], diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/rest-patterns/exec.js b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/rest-patterns/exec.js new file mode 100644 index 000000000000..dcb3e1a319e0 --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/rest-patterns/exec.js @@ -0,0 +1,5 @@ +function foo(...{ length }) { + return length; +} + +expect(foo(1, 2, 3)).toEqual(3); diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/rest-patterns/input.js b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/rest-patterns/input.js new file mode 100644 index 000000000000..a19bb5e1f2e1 --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/rest-patterns/input.js @@ -0,0 +1 @@ +function foo(...[a]) {} diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/rest-patterns/output.js b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/rest-patterns/output.js new file mode 100644 index 000000000000..ba8bf6bb3f5d --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/rest-patterns/output.js @@ -0,0 +1,7 @@ +function foo() { + for (var _len = arguments.length, _ref = new Array(_len), _key = 0; _key < _len; _key++) { + _ref[_key] = arguments[_key]; + } + + var a = _ref[0]; +}