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

56 lines
1.2 KiB
JavaScript

var util = require("../util");
exports.ComprehensionExpression = function (node, parent, opts, generateUid) {
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 = node.blocks.shift();
if (!self) return;
if (!self.of) {
throw util.errorWithNode(self, "for-in array comprehension is not supported");
}
var child = build();
if (!child) {
// last item
child = util.template("array-push", {
KEY: uid,
STATEMENT: node.body
}, true);
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", {
OBJECT: self.right,
KEY: self.left,
}, true);
container2.expression.arguments[0].body.body = [child];
return container2;
};
body.push(build());
body.push(returnStatement);
return container;
};