/
comprehensions.js
57 lines (45 loc) 路 1.41 KB
/
comprehensions.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import buildComprehension from "../../helpers/build-comprehension";
import traverse from "babel-traverse";
import * as util from "../../../util";
import * as t from "babel-types";
export var metadata = {
stage: 0
};
export var visitor = {
ComprehensionExpression(node, parent, scope) {
var callback = array;
if (node.generator) callback = generator;
return callback(node, parent, scope);
}
};
function generator(node) {
var body = [];
var container = t.functionExpression(null, [], t.blockStatement(body), true);
container.shadow = true;
body.push(buildComprehension(node, function () {
return t.expressionStatement(t.yieldExpression(node.body));
}));
return t.callExpression(container, []);
}
function array(node, parent, scope) {
var uid = scope.generateUidIdentifierBasedOnNode(parent);
var container = util.template("array-comprehension-container", {
KEY: uid
});
container.callee.shadow = true;
var block = container.callee.body;
var body = block.body;
if (traverse.hasType(node, scope, "YieldExpression", t.FUNCTION_TYPES)) {
container.callee.generator = true;
container = t.yieldExpression(container, true);
}
var returnStatement = body.pop();
body.push(buildComprehension(node, function () {
return util.template("array-push", {
STATEMENT: node.body,
KEY: uid
}, true);
}));
body.push(returnStatement);
return container;
}