56 lines
1.2 KiB
JavaScript
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;
|
|
};
|