babel/lib/6to5/transformers/array-comprehension.js
2014-09-29 16:27:35 +10:00

74 lines
1.6 KiB
JavaScript

var util = require("../util");
var _ = require("lodash");
exports.ComprehensionExpression = function (node, parent, opts, generateUid) {
var blocks = node.blocks;
_.each(blocks, function (block) {
if (!block.of) {
throw util.errorWithNode(block, "for-in array comprehension is not supported");
}
});
if (blocks.length === 1) {
var block = blocks[0];
var templateName = "array-comprehension-map";
if (node.filter) templateName += "-filter";
return util.template(templateName, {
ARRAY: block.right,
KEY: block.left,
FILTER: node.filter,
STATEMENT: node.body
});
}
var uid = generateUid("arr");
var container = util.template("array-comprehension-container", {
KEY: uid
});
var block = container.callee.body;
var body = block.body;
var returnStatement = body.pop();
var build = function () {
var self = blocks.shift();
if (!self) return;
var child = build();
if (!child) {
// last item
child = util.template("array-push", {
KEY: uid,
STATEMENT: node.body
}, true);
// add a filter as this is our final stop
if (node.filter) {
var filter = util.template("if", {
STATEMENT: node.filter
});
filter.consequent.body = [child];
child = filter;
}
}
var container2 = util.template("array-comprehension-for-each", {
ARRAY: self.right,
KEY: self.left
}, true);
container2.expression.arguments[0].body.body = [child];
return container2;
};
body.push(build());
body.push(returnStatement);
return container;
};