diff --git a/packages/babel-plugin-transform-es2015-parameters/src/destructuring.js b/packages/babel-plugin-transform-es2015-parameters/src/destructuring.js index eb14db26a1..65f8ed22d7 100644 --- a/packages/babel-plugin-transform-es2015-parameters/src/destructuring.js +++ b/packages/babel-plugin-transform-es2015-parameters/src/destructuring.js @@ -3,8 +3,12 @@ import * as t from "babel-types"; export let visitor = { Function(path) { let params: Array = path.get("params"); - - for (let i = 0; i < params.length; i++) { + + // If there's a rest param, no need to loop through it. Also, we need to + // hoist one more level to get `declar` at the right spot. + const hoistTweak = t.isRestElement(params[params.length - 1]) ? 1 : 0; + + for (let i = 0; i < params.length - hoistTweak; i++) { let param = params[i]; if (param.isArrayPattern() || param.isObjectPattern()) { let uid = path.scope.generateUidIdentifier("ref"); @@ -12,7 +16,7 @@ export let visitor = { let declar = t.variableDeclaration("let", [ t.variableDeclarator(param.node, uid) ]); - declar._blockHoist = params.length - i; + declar._blockHoist = params.length - i - hoistTweak; path.ensureBlock(); path.get("body").unshiftContainer("body", declar); diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/destructuring-rest/actual.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/destructuring-rest/actual.js new file mode 100644 index 0000000000..30d1bb3d08 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/destructuring-rest/actual.js @@ -0,0 +1,4 @@ +// T6809 +function t(x = "default", { a, b }, ...args) { + console.log(x, a, b, args); +} 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 new file mode 100644 index 0000000000..f68a4b6002 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/destructuring-rest/expected.js @@ -0,0 +1,13 @@ +// T6809 +function t() { + var x = arguments.length <= 0 || arguments[0] === undefined ? "default" : arguments[0]; + var _ref = arguments[1]; + var a = _ref.a; + var 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); +}