82 lines
1.9 KiB
JavaScript
82 lines
1.9 KiB
JavaScript
var util = require("../../util");
|
|
var t = require("../../types");
|
|
var _ = require("lodash");
|
|
|
|
var single = function (node, file) {
|
|
var block = node.blocks[0];
|
|
|
|
var templateName = "array-expression-comprehension-map";
|
|
if (node.filter) templateName = "array-expression-comprehension-filter";
|
|
|
|
var result = util.template(templateName, {
|
|
STATEMENT: node.body,
|
|
FILTER: node.filter,
|
|
ARRAY: file.toArray(block.right),
|
|
KEY: block.left
|
|
});
|
|
|
|
_.each([result.callee.object, result], function (call) {
|
|
if (t.isCallExpression(call)) {
|
|
call.arguments[0]._aliasFunction = true;
|
|
}
|
|
});
|
|
|
|
return result;
|
|
};
|
|
|
|
var multiple = function (node, file) {
|
|
var uid = file.generateUidIdentifier("arr");
|
|
|
|
var container = util.template("array-comprehension-container", {
|
|
KEY: uid
|
|
});
|
|
container.callee.expression._aliasFunction = true;
|
|
|
|
var block = container.callee.expression.body;
|
|
var body = block.body;
|
|
|
|
var returnStatement = body.pop();
|
|
|
|
body.push(exports._build(node, function () {
|
|
return util.template("array-push", {
|
|
STATEMENT: node.body,
|
|
KEY: uid
|
|
}, true);
|
|
}));
|
|
body.push(returnStatement);
|
|
|
|
return container;
|
|
};
|
|
|
|
exports._build = function (node, buildBody) {
|
|
var self = node.blocks.shift();
|
|
if (!self) return;
|
|
|
|
var child = exports._build(node, buildBody);
|
|
if (!child) {
|
|
// last item
|
|
child = buildBody();
|
|
|
|
// add a filter as this is our final stop
|
|
if (node.filter) {
|
|
child = t.ifStatement(node.filter, t.blockStatement([child]));
|
|
}
|
|
}
|
|
|
|
return t.forOfStatement(
|
|
t.variableDeclaration("var", [t.variableDeclarator(self.left)]),
|
|
self.right,
|
|
t.blockStatement([child])
|
|
);
|
|
};
|
|
|
|
exports.ComprehensionExpression = function (node, parent, file) {
|
|
if (node.generator) return;
|
|
|
|
if (node.blocks.length === 1) {
|
|
return single(node, file);
|
|
} else {
|
|
return multiple(node, file);
|
|
}
|
|
};
|