UNPKG

2.39 kBJavaScriptView Raw
1var 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
10ForInStatement.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 //Define additional temporary variables
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 //Move actual iteration into a while loop
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 //Export iteration result into a temporary array
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
62ForInStatement.prototype.transform = function (place) {
63 //Todo transform for in statement
64 place.push(this);
65 return place;
66};