From 717e6df407b6abdb653bf57a9fdcdf2edd75eaf9 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sat, 22 Nov 2014 23:44:12 +1100 Subject: [PATCH] use Array.from on single block array comprehensions - closes #199 --- .../transformers/array-comprehension.js | 13 +++++++++---- .../array-comprehension/single-if/actual.js | 1 + .../array-comprehension/single-if/expected.js | 7 +++++++ .../array-comprehension/single/actual.js | 1 + .../array-comprehension/single/expected.js | 5 +++++ 5 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/transformation/array-comprehension/single-if/actual.js create mode 100644 test/fixtures/transformation/array-comprehension/single-if/expected.js create mode 100644 test/fixtures/transformation/array-comprehension/single/actual.js create mode 100644 test/fixtures/transformation/array-comprehension/single/expected.js diff --git a/lib/6to5/transformation/transformers/array-comprehension.js b/lib/6to5/transformation/transformers/array-comprehension.js index 3d89ce86cb..c220746b00 100644 --- a/lib/6to5/transformation/transformers/array-comprehension.js +++ b/lib/6to5/transformation/transformers/array-comprehension.js @@ -2,16 +2,21 @@ var util = require("../../util"); var t = require("../../types"); var _ = require("lodash"); -var singleArrayExpression = function (node) { +var single = function (node) { var block = node.blocks[0]; var templateName = "array-expression-comprehension-map"; if (node.filter) templateName = "array-expression-comprehension-filter"; + var right = block.right; + if (!t.isArrayExpression(right)) { + right = util.template("array-from", { VALUE: right }); + } + var result = util.template(templateName, { STATEMENT: node.body, FILTER: node.filter, - ARRAY: block.right, + ARRAY: right, KEY: block.left }); @@ -73,8 +78,8 @@ exports._build = function (node, buildBody) { exports.ComprehensionExpression = function (node, parent, file) { if (node.generator) return; - if (node.blocks.length === 1 && t.isArrayExpression(node.blocks[0].right)) { - return singleArrayExpression(node); + if (node.blocks.length === 1) { + return single(node); } else { return multiple(node, file); } diff --git a/test/fixtures/transformation/array-comprehension/single-if/actual.js b/test/fixtures/transformation/array-comprehension/single-if/actual.js new file mode 100644 index 0000000000..e2cf129386 --- /dev/null +++ b/test/fixtures/transformation/array-comprehension/single-if/actual.js @@ -0,0 +1 @@ +var arr = [for (i of nums) if (i > 1) i * i]; diff --git a/test/fixtures/transformation/array-comprehension/single-if/expected.js b/test/fixtures/transformation/array-comprehension/single-if/expected.js new file mode 100644 index 0000000000..430d054054 --- /dev/null +++ b/test/fixtures/transformation/array-comprehension/single-if/expected.js @@ -0,0 +1,7 @@ +"use strict"; + +var arr = Array.from(nums).filter(function (i) { + return i > 1; +}).map(function (i) { + return i * i; +}); diff --git a/test/fixtures/transformation/array-comprehension/single/actual.js b/test/fixtures/transformation/array-comprehension/single/actual.js new file mode 100644 index 0000000000..9dda19048b --- /dev/null +++ b/test/fixtures/transformation/array-comprehension/single/actual.js @@ -0,0 +1 @@ +var arr = [for (i of nums) i * i]; diff --git a/test/fixtures/transformation/array-comprehension/single/expected.js b/test/fixtures/transformation/array-comprehension/single/expected.js new file mode 100644 index 0000000000..3243ae07b7 --- /dev/null +++ b/test/fixtures/transformation/array-comprehension/single/expected.js @@ -0,0 +1,5 @@ +"use strict"; + +var arr = Array.from(nums).map(function (i) { + return i * i; +});