1 | var ForInStatement = module.exports = function(left, right, body, each) {
|
2 | this.type = 'ForInStatement';
|
3 | this.left = left;
|
4 | this.right = right;
|
5 | this.body = body;
|
6 | this.each = each;
|
7 | this.async = false;
|
8 | };
|
9 |
|
10 | ForInStatement.prototype.normalize = function (place) {
|
11 | var AssignmentExpression = require('./AssignmentExpression');
|
12 | var ArrayExpression = require('./ArrayExpression');
|
13 | var BinaryExpression = require('./BinaryExpression');
|
14 | var BlockStatement = require('./BlockStatement');
|
15 | var CallExpression = require('./CallExpression');
|
16 | var ExpressionStatement = require('./ExpressionStatement');
|
17 | var Identifier = require('./Identifier');
|
18 | var Literal = require('./Literal');
|
19 | var MemberExpression = require('./MemberExpression');
|
20 | var UnaryExpression = require('./UnaryExpression');
|
21 | var VariableDeclaration = require('./VariableDeclaration');
|
22 | var VariableDeclarator = require('./VariableDeclarator');
|
23 | var WhileStatement = require('./WhileStatement');
|
24 |
|
25 | this.left.normalize(place);
|
26 | if (this.left.type === 'VariableDeclaration') {
|
27 | this.left.forIn = true;
|
28 | }
|
29 | this.right.normalize(place);
|
30 | this.body.normalize(place);
|
31 |
|
32 |
|
33 | var iter = new Identifier('_$itmp');
|
34 | var iterArray = new Identifier('_$itmp_list');
|
35 | var iterDef = new VariableDeclaration(new VariableDeclarator(iter, new Literal(0)));
|
36 | var iterArrayDef = new VariableDeclaration(new VariableDeclarator(iterArray, new ArrayExpression));
|
37 |
|
38 |
|
39 | var cond = new BinaryExpression('<', iter, new MemberExpression(iterArray, new Identifier('length'), false));
|
40 | var iteration = new WhileStatement(cond, this.body);
|
41 | this.body.body.unshift(new ExpressionStatement(
|
42 | new AssignmentExpression('=', this.left, new MemberExpression(iterArray, iter))
|
43 | ));
|
44 | this.body.body.push(new ExpressionStatement(
|
45 | new UnaryExpression('++', iter)
|
46 | ));
|
47 |
|
48 |
|
49 | this.body = new BlockStatement([
|
50 | new ExpressionStatement(new CallExpression(
|
51 | new MemberExpression(iterArray, new Identifier('push'), false),
|
52 | this.left
|
53 | ))
|
54 | ]);
|
55 |
|
56 | place.push(iterArrayDef);
|
57 | place.push(this);
|
58 | place.push(iterDef);
|
59 | place.push(iteration);
|
60 | };
|
61 |
|
62 | ForInStatement.prototype.transform = function (place) {
|
63 |
|
64 | place.push(this);
|
65 | return place;
|
66 | };
|