diff --git a/src/babel/transformation/transformers/es6/parameters.rest.js b/src/babel/transformation/transformers/es6/parameters.rest.js index 09e8fdd960..7559619db5 100644 --- a/src/babel/transformation/transformers/es6/parameters.rest.js +++ b/src/babel/transformation/transformers/es6/parameters.rest.js @@ -64,6 +64,17 @@ exports.Function = function (node, parent, scope) { // otherwise `arguments` will be remapped in arrow functions argsId._ignoreAliasFunctions = true; + // support patterns + if (t.isPattern(rest)) { + var pattern = rest; + rest = scope.generateUidIdentifier("ref"); + var declar = t.variableDeclaration("var", pattern.elements.map(function (elem, index) { + var accessExpr = t.memberExpression(rest, t.literal(index)); + return t.variableDeclarator(elem, accessExpr); + })); + node.body.body.unshift(declar); + } + // check if rest is used only in member expressions var restOuterDeclar = scope.getBindingIdentifier(rest.name); var state = { @@ -107,22 +118,6 @@ exports.Function = function (node, parent, scope) { ); } - // support patterns - if (t.isPattern(rest)) { - var pattern = rest; - rest = scope.generateUidIdentifier("ref"); - - // let the destructuring transformer handle this - var restDeclar = t.variableDeclaration("var", [ - t.variableDeclarator(pattern, rest) - ]); - - // retain evaluation position - restDeclar._blockHoist = node.params.length + 1; - - node.body.body.unshift(restDeclar); - } - scope.assignTypeGeneric(rest.name, "Array"); var loop = util.template("rest", {