From 59ea034df21db9d8f310a97bae650224034c273a Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Wed, 6 Jan 2016 17:07:05 -0800 Subject: [PATCH] Support expressions in rest arg access The current implementation assumes a numeric literal although it just checks the base type. --- .../src/rest.js | 10 +++++++++- .../test/fixtures/parameters/rest-length/expected.js | 4 ++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/babel-plugin-transform-es2015-parameters/src/rest.js b/packages/babel-plugin-transform-es2015-parameters/src/rest.js index adf3dfbe5e..572afeb7e1 100644 --- a/packages/babel-plugin-transform-es2015-parameters/src/rest.js +++ b/packages/babel-plugin-transform-es2015-parameters/src/rest.js @@ -107,9 +107,17 @@ function hasRest(node) { } function optimiseIndexGetter(path, argsId, offset) { + let index; + + if (t.isNumericLiteral(path.parent.property)) { + index = t.numericLiteral(path.parent.property.value + offset); + } else { + index = t.binaryExpression("+", path.parent.property, t.numericLiteral(offset)); + } + path.parentPath.replaceWith(loadRest({ ARGUMENTS: argsId, - INDEX: t.numericLiteral(path.parent.property.value + offset) + INDEX: index, })); } diff --git a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-length/expected.js b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-length/expected.js index 21923d140e..174b8f6d46 100644 --- a/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-length/expected.js +++ b/packages/babel-plugin-transform-es2015-parameters/test/fixtures/parameters/rest-length/expected.js @@ -1,6 +1,6 @@ var t = function (f) { - arguments[0]; - arguments[arguments.length - 1]; + arguments.length <= 1 ? undefined : arguments[1]; + arguments.length <= arguments.length - 1 - 1 + 1 ? undefined : arguments[arguments.length - 1 - 1 + 1]; }; function t(f) {