From e97086f5f79c2d55b76d0bfb8e1d7fdbdf1b5059 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Tue, 14 Oct 2014 09:29:21 +1100 Subject: [PATCH] always slice spread literals --- lib/6to5/templates/call.js | 1 + lib/6to5/transformers/spread.js | 23 +++++++++++-------- .../syntax/spread/array-literals/expected.js | 4 +++- .../expected.js | 5 ++-- .../expected.js | 5 ++-- .../method-call-multiple-args/expected.js | 3 ++- .../spread/method-call-single-arg/expected.js | 3 ++- 7 files changed, 28 insertions(+), 16 deletions(-) create mode 100644 lib/6to5/templates/call.js diff --git a/lib/6to5/templates/call.js b/lib/6to5/templates/call.js new file mode 100644 index 0000000000..23d94f532f --- /dev/null +++ b/lib/6to5/templates/call.js @@ -0,0 +1 @@ +OBJECT.call(CONTEXT); diff --git a/lib/6to5/transformers/spread.js b/lib/6to5/transformers/spread.js index c30f94cd57..6dc2187112 100644 --- a/lib/6to5/transformers/spread.js +++ b/lib/6to5/transformers/spread.js @@ -2,7 +2,18 @@ var util = require("../util"); var b = require("recast").types.builders; var _ = require("lodash"); -exports.ArrayExpression = function (node) { +var getSpreadLiteral = function (spread, file) { + var literal = spread.argument; + if (literal.type !== "ArrayExpression") { + literal = util.template("call", { + OBJECT: file.addDeclaration("slice"), + CONTEXT: literal + }); + } + return literal; +}; + +exports.ArrayExpression = function (node, parent, file) { var elements = node.elements; if (!elements.length) return; @@ -13,7 +24,7 @@ exports.ArrayExpression = function (node) { } var concat = util.template("array-concat", { - ARGUMENT: spread.argument + ARGUMENT: getSpreadLiteral(spread, file) }); concat.callee.object.elements = elements; @@ -27,18 +38,12 @@ exports.CallExpression = function (node, parent, file) { if (args.length && _.last(args).type === "SpreadElement") { var spread = args.pop(); - var spreadLiteral = spread.argument; + var spreadLiteral = getSpreadLiteral(spread, file); var contextLiteral = b.literal(null); node.arguments = []; if (args.length) { - if (spreadLiteral.name === "arguments") { - spreadLiteral = util.template("arguments-slice", { - SLICE_KEY: file.addDeclaration("slice") - }); - } - var concat = util.template("array-concat"); concat.arguments = [spreadLiteral]; concat.callee.object.elements = args; diff --git a/test/fixtures/syntax/spread/array-literals/expected.js b/test/fixtures/syntax/spread/array-literals/expected.js index 19a3680890..4e5e3f7361 100644 --- a/test/fixtures/syntax/spread/array-literals/expected.js +++ b/test/fixtures/syntax/spread/array-literals/expected.js @@ -1,5 +1,7 @@ +var _slice = Array.prototype.slice; + var lyrics = [ "head", "and", "toes" -].concat(parts); +].concat(_slice.call(parts)); diff --git a/test/fixtures/syntax/spread/contexted-method-call-multiple-args/expected.js b/test/fixtures/syntax/spread/contexted-method-call-multiple-args/expected.js index 2a9d39f39b..e66285a582 100644 --- a/test/fixtures/syntax/spread/contexted-method-call-multiple-args/expected.js +++ b/test/fixtures/syntax/spread/contexted-method-call-multiple-args/expected.js @@ -1,8 +1,9 @@ +var _slice = Array.prototype.slice; foob.add.apply(foob, [ foo, bar -].concat(numbers)); +].concat(_slice.call(numbers))); foob.test.add.apply(foob.test, [ foo, bar -].concat(numbers)); +].concat(_slice.call(numbers))); diff --git a/test/fixtures/syntax/spread/contexted-method-call-single-arg/expected.js b/test/fixtures/syntax/spread/contexted-method-call-single-arg/expected.js index ce805e7f8d..e69aea13b9 100644 --- a/test/fixtures/syntax/spread/contexted-method-call-single-arg/expected.js +++ b/test/fixtures/syntax/spread/contexted-method-call-single-arg/expected.js @@ -1,2 +1,3 @@ -foob.add.apply(foob, numbers); -foob.test.add.apply(foob.test, numbers); +var _slice = Array.prototype.slice; +foob.add.apply(foob, _slice.call(numbers)); +foob.test.add.apply(foob.test, _slice.call(numbers)); diff --git a/test/fixtures/syntax/spread/method-call-multiple-args/expected.js b/test/fixtures/syntax/spread/method-call-multiple-args/expected.js index 732fa5edb1..602d35ed4f 100644 --- a/test/fixtures/syntax/spread/method-call-multiple-args/expected.js +++ b/test/fixtures/syntax/spread/method-call-multiple-args/expected.js @@ -1,4 +1,5 @@ +var _slice = Array.prototype.slice; add.apply(null, [ foo, bar -].concat(numbers)); +].concat(_slice.call(numbers))); diff --git a/test/fixtures/syntax/spread/method-call-single-arg/expected.js b/test/fixtures/syntax/spread/method-call-single-arg/expected.js index d95f659560..6df8cfc0c0 100644 --- a/test/fixtures/syntax/spread/method-call-single-arg/expected.js +++ b/test/fixtures/syntax/spread/method-call-single-arg/expected.js @@ -1 +1,2 @@ -add.apply(null, numbers); +var _slice = Array.prototype.slice; +add.apply(null, _slice.call(numbers));