74 lines
1.6 KiB
JavaScript
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;
|
|
};
|