From 58cda35831012997903b303345b9c076442edd32 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Mon, 22 Jun 2015 00:06:03 +0100 Subject: [PATCH] log spread element rest parameter as a candidate instead of replacing it in place - fixes #1796 --- .../transformation/transformers/es6/parameters.rest.js | 7 +++++-- .../es6.parameters.rest/spread-optimisation/actual.js | 5 +++++ .../es6.parameters.rest/spread-optimisation/expected.js | 9 +++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/babel/transformation/transformers/es6/parameters.rest.js b/src/babel/transformation/transformers/es6/parameters.rest.js index 7d309ba5d2..4defa80a57 100644 --- a/src/babel/transformation/transformers/es6/parameters.rest.js +++ b/src/babel/transformation/transformers/es6/parameters.rest.js @@ -42,7 +42,8 @@ var memberExpressionOptimisationVisitor = { if (this.parentPath.isSpreadElement() && state.offset === 0) { var call = this.parentPath.parentPath; if (call.isCallExpression() && call.node.arguments.length === 1) { - return state.argumentsNode; + state.candidates.push(this); + return; } } } @@ -124,7 +125,9 @@ export var visitor = { if (state.candidates.length) { for (var candidate of (state.candidates: Array)) { candidate.replaceWith(argsId); - optimiseMemberExpression(candidate.parent, state.offset); + if (candidate.parentPath.isMemberExpression()) { + optimiseMemberExpression(candidate.parent, state.offset); + } } } return; diff --git a/test/core/fixtures/transformation/es6.parameters.rest/spread-optimisation/actual.js b/test/core/fixtures/transformation/es6.parameters.rest/spread-optimisation/actual.js index a57ae130ab..477aaad237 100644 --- a/test/core/fixtures/transformation/es6.parameters.rest/spread-optimisation/actual.js +++ b/test/core/fixtures/transformation/es6.parameters.rest/spread-optimisation/actual.js @@ -13,3 +13,8 @@ function foo(a, ...b) { function foo(...b) { foo(1, ...b); } + +function foo(...args){ + args.pop() + foo(...args); +} diff --git a/test/core/fixtures/transformation/es6.parameters.rest/spread-optimisation/expected.js b/test/core/fixtures/transformation/es6.parameters.rest/spread-optimisation/expected.js index 398292bd9a..e8460c6642 100644 --- a/test/core/fixtures/transformation/es6.parameters.rest/spread-optimisation/expected.js +++ b/test/core/fixtures/transformation/es6.parameters.rest/spread-optimisation/expected.js @@ -23,3 +23,12 @@ function foo() { foo.apply(undefined, [1].concat(b)); } + +function foo() { + for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + + args.pop(); + foo.apply(undefined, args); +}