diff --git a/lib/6to5/transformation/templates/array-expression-comprehension-filter.js b/lib/6to5/transformation/templates/array-expression-comprehension-filter.js deleted file mode 100644 index 689a765d0f..0000000000 --- a/lib/6to5/transformation/templates/array-expression-comprehension-filter.js +++ /dev/null @@ -1,5 +0,0 @@ -ARRAY.filter(function (KEY) { - return FILTER; -}).map(function (KEY) { - return STATEMENT; -}); diff --git a/lib/6to5/transformation/templates/array-expression-comprehension-map.js b/lib/6to5/transformation/templates/array-expression-comprehension-map.js deleted file mode 100644 index f59c70808d..0000000000 --- a/lib/6to5/transformation/templates/array-expression-comprehension-map.js +++ /dev/null @@ -1,3 +0,0 @@ -ARRAY.map(function (KEY) { - return STATEMENT; -}); diff --git a/lib/6to5/transformation/transformers/es7-array-comprehension.js b/lib/6to5/transformation/transformers/es7-array-comprehension.js index 40c42fca15..fd322a9d57 100644 --- a/lib/6to5/transformation/transformers/es7-array-comprehension.js +++ b/lib/6to5/transformation/transformers/es7-array-comprehension.js @@ -1,43 +1,25 @@ -var util = require("../../util"); -var t = require("../../types"); +var traverse = require("../../traverse"); +var util = require("../../util"); +var t = require("../../types"); exports.experimental = true; -var single = function (node, file) { - var block = node.blocks[0]; - - var templateName = "array-expression-comprehension-map"; - if (node.filter) templateName = "array-expression-comprehension-filter"; - - var result = util.template(templateName, { - STATEMENT: node.body, - FILTER: node.filter, - ARRAY: file.toArray(block.right), - KEY: block.left - }); - - var aliasPossibles = [result.callee.object, result]; - for (var i in aliasPossibles) { - var call = aliasPossibles[i]; - if (t.isCallExpression(call)) { - call.arguments[0]._aliasFunction = true; - } - } - - return result; -}; - -var multiple = function (node, file) { +var build = function (node, file) { var uid = file.generateUidIdentifier("arr"); var container = util.template("array-comprehension-container", { KEY: uid }); - container.callee.expression._aliasFunction = true; + container.callee._aliasFunction = true; var block = container.callee.body; var body = block.body; + if (traverse.hasType(node, "YieldExpression", t.FUNCTION_TYPES)) { + container.generator = true; + container = t.yieldExpression(container, true); + } + var returnStatement = body.pop(); body.push(exports._build(node, function () { @@ -76,9 +58,5 @@ exports._build = function (node, buildBody) { exports.ComprehensionExpression = function (node, parent, file) { if (node.generator) return; - if (node.blocks.length === 1) { - return single(node, file); - } else { - return multiple(node, file); - } + return build(node, file); }; diff --git a/test/fixtures/transformation/es7-array-comprehension/arguments/expected.js b/test/fixtures/transformation/es7-array-comprehension/arguments/expected.js index aa3d6cc703..fc982c26c9 100644 --- a/test/fixtures/transformation/es7-array-comprehension/arguments/expected.js +++ b/test/fixtures/transformation/es7-array-comprehension/arguments/expected.js @@ -2,9 +2,16 @@ function add() { var _arguments = arguments; - return [1, 2, 3].map(function (i) { - return i * _arguments[0]; - }); + return (function () { + var _arr = []; + + for (var _iterator = [1, 2, 3][Symbol.iterator](), _step; !(_step = _iterator.next()).done;) { + var i = _step.value; + _arr.push(i * _arguments[0]); + } + + return _arr; + })(); } add(5); diff --git a/test/fixtures/transformation/es7-array-comprehension/array-expression-single-if/expected.js b/test/fixtures/transformation/es7-array-comprehension/array-expression-single-if/expected.js index e5234cfe1f..0f3f625138 100644 --- a/test/fixtures/transformation/es7-array-comprehension/array-expression-single-if/expected.js +++ b/test/fixtures/transformation/es7-array-comprehension/array-expression-single-if/expected.js @@ -1,7 +1,14 @@ "use strict"; -var arr = [1, 2, 3].filter(function (i) { - return i > 1; -}).map(function (i) { - return i * i; -}); +var arr = (function () { + var _arr = []; + + for (var _iterator = [1, 2, 3][Symbol.iterator](), _step; !(_step = _iterator.next()).done;) { + var i = _step.value; + if (i > 1) { + _arr.push(i * i); + } + } + + return _arr; +})(); diff --git a/test/fixtures/transformation/es7-array-comprehension/array-expression-single/expected.js b/test/fixtures/transformation/es7-array-comprehension/array-expression-single/expected.js index 9b7612c933..c3ae8d9432 100644 --- a/test/fixtures/transformation/es7-array-comprehension/array-expression-single/expected.js +++ b/test/fixtures/transformation/es7-array-comprehension/array-expression-single/expected.js @@ -1,5 +1,12 @@ "use strict"; -var arr = [1, 2, 3].map(function (i) { - return i * i; -}); +var arr = (function () { + var _arr = []; + + for (var _iterator = [1, 2, 3][Symbol.iterator](), _step; !(_step = _iterator.next()).done;) { + var i = _step.value; + _arr.push(i * i); + } + + return _arr; +})(); diff --git a/test/fixtures/transformation/es7-array-comprehension/single-if/expected.js b/test/fixtures/transformation/es7-array-comprehension/single-if/expected.js index e6e07c1ca9..6e95f9cadc 100644 --- a/test/fixtures/transformation/es7-array-comprehension/single-if/expected.js +++ b/test/fixtures/transformation/es7-array-comprehension/single-if/expected.js @@ -1,11 +1,14 @@ "use strict"; -var _toArray = function (arr) { - return Array.isArray(arr) ? arr : Array.from(arr); -}; +var arr = (function () { + var _arr = []; -var arr = _toArray(nums).filter(function (i) { - return i > 1; -}).map(function (i) { - return i * i; -}); + for (var _iterator = nums[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) { + var i = _step.value; + if (i > 1) { + _arr.push(i * i); + } + } + + return _arr; +})(); diff --git a/test/fixtures/transformation/es7-array-comprehension/single/expected.js b/test/fixtures/transformation/es7-array-comprehension/single/expected.js index 57f58bf2cf..88e01e350a 100644 --- a/test/fixtures/transformation/es7-array-comprehension/single/expected.js +++ b/test/fixtures/transformation/es7-array-comprehension/single/expected.js @@ -1,9 +1,12 @@ "use strict"; -var _toArray = function (arr) { - return Array.isArray(arr) ? arr : Array.from(arr); -}; +var arr = (function () { + var _arr = []; -var arr = _toArray(nums).map(function (i) { - return i * i; -}); + for (var _iterator = nums[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) { + var i = _step.value; + _arr.push(i * i); + } + + return _arr; +})(); diff --git a/test/fixtures/transformation/es7-array-comprehension/this/expected.js b/test/fixtures/transformation/es7-array-comprehension/this/expected.js index 4c59ba50dc..c91ca8a560 100644 --- a/test/fixtures/transformation/es7-array-comprehension/this/expected.js +++ b/test/fixtures/transformation/es7-array-comprehension/this/expected.js @@ -2,9 +2,16 @@ function add() { var _this = this; - return [1, 2, 3].map(function (i) { - return i * _this.multiplier; - }); + return (function () { + var _arr = []; + + for (var _iterator = [1, 2, 3][Symbol.iterator](), _step; !(_step = _iterator.next()).done;) { + var i = _step.value; + _arr.push(i * _this.multiplier); + } + + return _arr; + })(); } add.call({ multiplier: 5 }); diff --git a/test/fixtures/transformation/optional-core-aliasing/es7-array-comprehensions/expected.js b/test/fixtures/transformation/optional-core-aliasing/es7-array-comprehensions/expected.js index ccfa596f71..01333ca8f9 100644 --- a/test/fixtures/transformation/optional-core-aliasing/es7-array-comprehensions/expected.js +++ b/test/fixtures/transformation/optional-core-aliasing/es7-array-comprehensions/expected.js @@ -1,15 +1,18 @@ "use strict"; -var _toArray = function (arr) { - return Array.isArray(arr) ? arr : _core.Array.from(arr); -}; - var _interopRequire = function (obj) { return obj && (obj["default"] || obj); }; var _core = _interopRequire(require("core-js/library")); -var arr = _toArray(nums).map(function (i) { - return i * i; -}); +var arr = (function () { + var _arr = []; + + for (var _iterator = _core.$for.getIterator(nums), _step; !(_step = _iterator.next()).done;) { + var i = _step.value; + _arr.push(i * i); + } + + return _arr; +})();