From faa10df84c932e091b9cf43d38bd9d2bc003fa20 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Thu, 12 Feb 2015 07:37:40 +1100 Subject: [PATCH] add toConsumableArray helper for spread - fixes #757 --- lib/6to5/transformation/file.js | 13 ++++++++----- lib/6to5/transformation/templates/to-array.js | 8 +------- .../transformation/templates/to-consumable-array.js | 9 +++++++++ lib/6to5/transformation/transformers/es6/spread.js | 2 +- .../es6-destructuring/spread/expected.js | 4 ++-- .../es6-spread/array-literal-first/expected.js | 4 ++-- .../es6-spread/array-literal-middle/expected.js | 4 ++-- .../es6-spread/array-literal-multiple/expected.js | 4 ++-- .../es6-spread/array-literals/expected.js | 4 ++-- .../expected.js | 4 ++-- .../expected.js | 4 ++-- .../contexted-method-call-multiple-args/expected.js | 6 +++--- .../contexted-method-call-single-arg/expected.js | 6 +++--- .../es6-spread/method-call-first/expected.js | 4 ++-- .../es6-spread/method-call-middle/expected.js | 4 ++-- .../method-call-multiple-args/expected.js | 4 ++-- .../es6-spread/method-call-multiple/expected.js | 4 ++-- .../es6-spread/method-call-single-arg/expected.js | 4 ++-- .../es6-spread/new-expression/expected.js | 6 +++--- .../transformation/es6-spread/single/expected.js | 4 ++-- .../self-contained/modules-system/expected.js | 2 +- 21 files changed, 55 insertions(+), 49 deletions(-) create mode 100644 lib/6to5/transformation/templates/to-consumable-array.js diff --git a/lib/6to5/transformation/file.js b/lib/6to5/transformation/file.js index d7b496160d..337de4e922 100644 --- a/lib/6to5/transformation/file.js +++ b/lib/6to5/transformation/file.js @@ -41,6 +41,7 @@ File.helpers = [ "tagged-template-literal-loose", "interop-require", "to-array", + "to-consumable-array", "sliced-to-array", "object-without-properties", "has-own", @@ -216,19 +217,21 @@ File.prototype.debug = function (msg) { util.debug(parts); }; -File.prototype.toArray = function (node, i) { +File.prototype.toArray = function (node, i, forceHelperName) { if (t.isArrayExpression(node)) { return node; } else if (t.isIdentifier(node) && node.name === "arguments") { return t.callExpression(t.memberExpression(this.addHelper("slice"), t.identifier("call")), [node]); } else { - var declarationName = "to-array"; + var helperName = "to-array"; var args = [node]; - if (i) { + if (i === true) { + helperName = "to-consumable-array"; + } else if (i) { args.push(t.literal(i)); - declarationName = "sliced-to-array"; + helperName = "sliced-to-array"; } - return t.callExpression(this.addHelper(declarationName), args); + return t.callExpression(this.addHelper(helperName), args); } }; diff --git a/lib/6to5/transformation/templates/to-array.js b/lib/6to5/transformation/templates/to-array.js index 820a6f06da..c479b65446 100644 --- a/lib/6to5/transformation/templates/to-array.js +++ b/lib/6to5/transformation/templates/to-array.js @@ -1,9 +1,3 @@ (function (arr) { - if (Array.isArray(arr)) { - var arr2 = []; - for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); - return arr2; - } else { - return Array.from(arr); - } + return Array.isArray(arr) ? arr : Array.from(arr); }); diff --git a/lib/6to5/transformation/templates/to-consumable-array.js b/lib/6to5/transformation/templates/to-consumable-array.js new file mode 100644 index 0000000000..820a6f06da --- /dev/null +++ b/lib/6to5/transformation/templates/to-consumable-array.js @@ -0,0 +1,9 @@ +(function (arr) { + if (Array.isArray(arr)) { + var arr2 = []; + for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); + return arr2; + } else { + return Array.from(arr); + } +}); diff --git a/lib/6to5/transformation/transformers/es6/spread.js b/lib/6to5/transformation/transformers/es6/spread.js index 5e48723104..a6181dd4f1 100644 --- a/lib/6to5/transformation/transformers/es6/spread.js +++ b/lib/6to5/transformation/transformers/es6/spread.js @@ -6,7 +6,7 @@ var t = require("../../../types"); exports.check = t.isSpreadElement; var getSpreadLiteral = function (spread, file) { - return file.toArray(spread.argument); + return file.toArray(spread.argument, true); }; var hasSpread = function (nodes) { diff --git a/test/fixtures/transformation/es6-destructuring/spread/expected.js b/test/fixtures/transformation/es6-destructuring/spread/expected.js index b170df5f45..d7543faac6 100644 --- a/test/fixtures/transformation/es6-destructuring/spread/expected.js +++ b/test/fixtures/transformation/es6-destructuring/spread/expected.js @@ -1,6 +1,6 @@ "use strict"; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toArray = function (arr) { return Array.isArray(arr) ? arr : Array.from(arr); }; var isSorted = function (_ref) { var _ref2 = _toArray(_ref); @@ -12,4 +12,4 @@ var isSorted = function (_ref) { if (!zs.length) return true; if (y > x) return isSorted(zs); return false; -}; +}; \ No newline at end of file diff --git a/test/fixtures/transformation/es6-spread/array-literal-first/expected.js b/test/fixtures/transformation/es6-spread/array-literal-first/expected.js index 9e6356e2ca..6fd08d5737 100644 --- a/test/fixtures/transformation/es6-spread/array-literal-first/expected.js +++ b/test/fixtures/transformation/es6-spread/array-literal-first/expected.js @@ -1,5 +1,5 @@ "use strict"; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toConsumableArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; -var lyrics = [].concat(_toArray(parts), ["head", "and", "toes"]); +var lyrics = [].concat(_toConsumableArray(parts), ["head", "and", "toes"]); \ No newline at end of file diff --git a/test/fixtures/transformation/es6-spread/array-literal-middle/expected.js b/test/fixtures/transformation/es6-spread/array-literal-middle/expected.js index 7c3bbd996a..d9b55d6fec 100644 --- a/test/fixtures/transformation/es6-spread/array-literal-middle/expected.js +++ b/test/fixtures/transformation/es6-spread/array-literal-middle/expected.js @@ -1,5 +1,5 @@ "use strict"; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toConsumableArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; -var a = [b].concat(_toArray(c), [d]); +var a = [b].concat(_toConsumableArray(c), [d]); \ No newline at end of file diff --git a/test/fixtures/transformation/es6-spread/array-literal-multiple/expected.js b/test/fixtures/transformation/es6-spread/array-literal-multiple/expected.js index f3876c1bba..44b6e7fea8 100644 --- a/test/fixtures/transformation/es6-spread/array-literal-multiple/expected.js +++ b/test/fixtures/transformation/es6-spread/array-literal-multiple/expected.js @@ -1,5 +1,5 @@ "use strict"; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toConsumableArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; -var a = [b].concat(_toArray(c), [d, e], _toArray(f)); +var a = [b].concat(_toConsumableArray(c), [d, e], _toConsumableArray(f)); \ No newline at end of file diff --git a/test/fixtures/transformation/es6-spread/array-literals/expected.js b/test/fixtures/transformation/es6-spread/array-literals/expected.js index 96cbadfada..c079209df6 100644 --- a/test/fixtures/transformation/es6-spread/array-literals/expected.js +++ b/test/fixtures/transformation/es6-spread/array-literals/expected.js @@ -1,5 +1,5 @@ "use strict"; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toConsumableArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; -var lyrics = ["head", "and", "toes"].concat(_toArray(parts)); +var lyrics = ["head", "and", "toes"].concat(_toConsumableArray(parts)); \ No newline at end of file diff --git a/test/fixtures/transformation/es6-spread/contexted-computed-method-call-multiple-args/expected.js b/test/fixtures/transformation/es6-spread/contexted-computed-method-call-multiple-args/expected.js index f107616b53..f362a0d580 100644 --- a/test/fixtures/transformation/es6-spread/contexted-computed-method-call-multiple-args/expected.js +++ b/test/fixtures/transformation/es6-spread/contexted-computed-method-call-multiple-args/expected.js @@ -1,6 +1,6 @@ "use strict"; var _obj; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toConsumableArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; -(_obj = obj)[method].apply(_obj, [foo, bar].concat(_toArray(args))); +(_obj = obj)[method].apply(_obj, [foo, bar].concat(_toConsumableArray(args))); \ No newline at end of file diff --git a/test/fixtures/transformation/es6-spread/contexted-computed-method-call-single-arg/expected.js b/test/fixtures/transformation/es6-spread/contexted-computed-method-call-single-arg/expected.js index 359469abac..06e0773f43 100644 --- a/test/fixtures/transformation/es6-spread/contexted-computed-method-call-single-arg/expected.js +++ b/test/fixtures/transformation/es6-spread/contexted-computed-method-call-single-arg/expected.js @@ -1,6 +1,6 @@ "use strict"; var _obj; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toConsumableArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; -(_obj = obj)[method].apply(_obj, _toArray(args)); +(_obj = obj)[method].apply(_obj, _toConsumableArray(args)); \ No newline at end of file diff --git a/test/fixtures/transformation/es6-spread/contexted-method-call-multiple-args/expected.js b/test/fixtures/transformation/es6-spread/contexted-method-call-multiple-args/expected.js index e4f00193a6..40320fcd97 100644 --- a/test/fixtures/transformation/es6-spread/contexted-method-call-multiple-args/expected.js +++ b/test/fixtures/transformation/es6-spread/contexted-method-call-multiple-args/expected.js @@ -1,7 +1,7 @@ "use strict"; var _foob, _foob$test; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toConsumableArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; -(_foob = foob).add.apply(_foob, [foo, bar].concat(_toArray(numbers))); -(_foob$test = foob.test).add.apply(_foob$test, [foo, bar].concat(_toArray(numbers))); +(_foob = foob).add.apply(_foob, [foo, bar].concat(_toConsumableArray(numbers))); +(_foob$test = foob.test).add.apply(_foob$test, [foo, bar].concat(_toConsumableArray(numbers))); \ No newline at end of file diff --git a/test/fixtures/transformation/es6-spread/contexted-method-call-single-arg/expected.js b/test/fixtures/transformation/es6-spread/contexted-method-call-single-arg/expected.js index 0237ae9cea..e190436947 100644 --- a/test/fixtures/transformation/es6-spread/contexted-method-call-single-arg/expected.js +++ b/test/fixtures/transformation/es6-spread/contexted-method-call-single-arg/expected.js @@ -1,7 +1,7 @@ "use strict"; var _foob, _foob$test; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toConsumableArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; -(_foob = foob).add.apply(_foob, _toArray(numbers)); -(_foob$test = foob.test).add.apply(_foob$test, _toArray(numbers)); +(_foob = foob).add.apply(_foob, _toConsumableArray(numbers)); +(_foob$test = foob.test).add.apply(_foob$test, _toConsumableArray(numbers)); \ No newline at end of file diff --git a/test/fixtures/transformation/es6-spread/method-call-first/expected.js b/test/fixtures/transformation/es6-spread/method-call-first/expected.js index 50acda90ed..691305b8e4 100644 --- a/test/fixtures/transformation/es6-spread/method-call-first/expected.js +++ b/test/fixtures/transformation/es6-spread/method-call-first/expected.js @@ -1,5 +1,5 @@ "use strict"; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toConsumableArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; -add.apply(undefined, _toArray(numbers).concat([foo, bar])); +add.apply(undefined, _toConsumableArray(numbers).concat([foo, bar])); \ No newline at end of file diff --git a/test/fixtures/transformation/es6-spread/method-call-middle/expected.js b/test/fixtures/transformation/es6-spread/method-call-middle/expected.js index a2975e50c6..c09aeb0979 100644 --- a/test/fixtures/transformation/es6-spread/method-call-middle/expected.js +++ b/test/fixtures/transformation/es6-spread/method-call-middle/expected.js @@ -1,5 +1,5 @@ "use strict"; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toConsumableArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; -add.apply(undefined, [foo].concat(_toArray(numbers), [bar])); +add.apply(undefined, [foo].concat(_toConsumableArray(numbers), [bar])); \ No newline at end of file diff --git a/test/fixtures/transformation/es6-spread/method-call-multiple-args/expected.js b/test/fixtures/transformation/es6-spread/method-call-multiple-args/expected.js index 3e0d49d9a3..ed17b5c6d1 100644 --- a/test/fixtures/transformation/es6-spread/method-call-multiple-args/expected.js +++ b/test/fixtures/transformation/es6-spread/method-call-multiple-args/expected.js @@ -1,5 +1,5 @@ "use strict"; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toConsumableArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; -add.apply(undefined, [foo, bar].concat(_toArray(numbers))); +add.apply(undefined, [foo, bar].concat(_toConsumableArray(numbers))); \ No newline at end of file diff --git a/test/fixtures/transformation/es6-spread/method-call-multiple/expected.js b/test/fixtures/transformation/es6-spread/method-call-multiple/expected.js index e57d5f4cc7..becf0ffba6 100644 --- a/test/fixtures/transformation/es6-spread/method-call-multiple/expected.js +++ b/test/fixtures/transformation/es6-spread/method-call-multiple/expected.js @@ -1,5 +1,5 @@ "use strict"; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toConsumableArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; -add.apply(undefined, [foo].concat(_toArray(numbers), [bar, what], _toArray(test))); +add.apply(undefined, [foo].concat(_toConsumableArray(numbers), [bar, what], _toConsumableArray(test))); \ No newline at end of file diff --git a/test/fixtures/transformation/es6-spread/method-call-single-arg/expected.js b/test/fixtures/transformation/es6-spread/method-call-single-arg/expected.js index dad1dd21b6..8fba00697a 100644 --- a/test/fixtures/transformation/es6-spread/method-call-single-arg/expected.js +++ b/test/fixtures/transformation/es6-spread/method-call-single-arg/expected.js @@ -1,5 +1,5 @@ "use strict"; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toConsumableArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; -add.apply(undefined, _toArray(numbers)); +add.apply(undefined, _toConsumableArray(numbers)); \ No newline at end of file diff --git a/test/fixtures/transformation/es6-spread/new-expression/expected.js b/test/fixtures/transformation/es6-spread/new-expression/expected.js index 10889ab673..466603226c 100644 --- a/test/fixtures/transformation/es6-spread/new-expression/expected.js +++ b/test/fixtures/transformation/es6-spread/new-expression/expected.js @@ -2,7 +2,7 @@ var _applyConstructor = function (Constructor, args) { var instance = Object.create(Constructor.prototype); var result = Constructor.apply(instance, args); return result != null && (typeof result == "object" || typeof result == "function") ? result : instance; }; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toConsumableArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; -_applyConstructor(Numbers, _toArray(nums)); -_applyConstructor(Numbers, [1].concat(_toArray(nums))); +_applyConstructor(Numbers, _toConsumableArray(nums)); +_applyConstructor(Numbers, [1].concat(_toConsumableArray(nums))); \ No newline at end of file diff --git a/test/fixtures/transformation/es6-spread/single/expected.js b/test/fixtures/transformation/es6-spread/single/expected.js index 7005e8737a..82aed6aad8 100644 --- a/test/fixtures/transformation/es6-spread/single/expected.js +++ b/test/fixtures/transformation/es6-spread/single/expected.js @@ -1,5 +1,5 @@ "use strict"; -var _toArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; +var _toConsumableArray = function (arr) { if (Array.isArray(arr)) { var arr2 = []; for (var i = 0; i < arr.length; i++) arr2.push(arr[i]); return arr2; } else { return Array.from(arr); } }; -[].concat(_toArray(foo)); +[].concat(_toConsumableArray(foo)); \ No newline at end of file diff --git a/test/fixtures/transformation/self-contained/modules-system/expected.js b/test/fixtures/transformation/self-contained/modules-system/expected.js index 75d03dab75..25cbba4dc5 100644 --- a/test/fixtures/transformation/self-contained/modules-system/expected.js +++ b/test/fixtures/transformation/self-contained/modules-system/expected.js @@ -7,7 +7,7 @@ System.register(["6to5-runtime/helpers"], function (_export) { _to5Helpers = _to5RuntimeHelpers; }], execute: function () { - foo.apply(undefined, _to5Helpers.toArray(bar)); + foo.apply(undefined, _to5Helpers.toConsumableArray(bar)); } }; }); \ No newline at end of file