From 6cc0538d2ff058e7a1a238433254d1d637713f87 Mon Sep 17 00:00:00 2001 From: Victor Felder Date: Wed, 16 Dec 2015 15:41:43 +0100 Subject: [PATCH] Safely transform all usages of rest arguments --- .../src/rest.js | 14 +------------- .../fixtures/parameters/rest-multiple/actual.js | 5 +++-- .../fixtures/parameters/rest-multiple/expected.js | 5 +++-- 3 files changed, 7 insertions(+), 17 deletions(-) diff --git a/packages/babel-plugin-transform-es2015-parameters/src/rest.js b/packages/babel-plugin-transform-es2015-parameters/src/rest.js index f544232b42..2df03de411 100644 --- a/packages/babel-plugin-transform-es2015-parameters/src/rest.js +++ b/packages/babel-plugin-transform-es2015-parameters/src/rest.js @@ -121,23 +121,11 @@ export let visitor = { argsId._shadowedFunctionLiteral = path; function optimiseCandidate(parent, parentPath, offset) { - if (t.isReturnStatement(parentPath.parent) || t.isIdentifier(parentPath.parent.id) || t.isIdentifier(parentPath.parent.left)) { + if (parent.property) { parentPath.replaceWith(loadRest({ ARGUMENTS: argsId, INDEX: t.numericLiteral(parent.property.value + offset) })); - } else { - if (offset === 0) return; - let newExpr; - let prop = parent.property; - - if (t.isLiteral(prop)) { - prop.value += offset; - prop.raw = String(prop.value); - } else { // UnaryExpression, BinaryExpression - newExpr = t.binaryExpression("+", prop, t.numericLiteral(offset)); - parent.property = newExpr; - } } } diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-multiple/actual.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-multiple/actual.js index c0f61ede0d..4ece5d67d3 100644 --- a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-multiple/actual.js +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-multiple/actual.js @@ -13,6 +13,7 @@ function t(f, ...items) { function u(f, g, ...items) { var x = f; var y = g; - x = items[0]; - y = items[1]; + x[12] = items[0]; + y.prop = items[1]; + var z = items[2] | 0 || 12; } diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-multiple/expected.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-multiple/expected.js index a8d86df09f..2e36f99a60 100644 --- a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-multiple/expected.js +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-multiple/expected.js @@ -13,6 +13,7 @@ function t(f) { function u(f, g) { var x = f; var y = g; - x = arguments.length <= 2 ? undefined : arguments[2]; - y = arguments.length <= 3 ? undefined : arguments[3]; + x[12] = arguments.length <= 2 ? undefined : arguments[2]; + y.prop = arguments.length <= 3 ? undefined : arguments[3]; + var z = (arguments.length <= 4 ? undefined : arguments[4]) | 0 || 12; }