Code coverage report for harmonizer/transform/for-of.js

Statements: 100% (25 / 25)      Branches: 100% (2 / 2)      Functions: 100% (2 / 2)      Lines: 100% (25 / 25)      Ignored: none     

All files » harmonizer/transform/ » for-of.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  1 1 1 1 1 1 1 1 10 23 23 23 23 23 23             23                 23 23 23 22 22   1               23 23     1
'use strict';
var objectPatternB = require('nodes');
var nodes = objectPatternB.nodes;
var syntax = require('nodes/syntax.json');
var objectPatternA = require('../util/id');
var getUniqueId = objectPatternA.getUniqueId;
var objectPattern = require('../util/string');
var express = objectPattern.express;
function forofify(program) {
  program.search('#ForOfStatement').forEach(function (node) {
    var forStatement = new nodes.ForStatement();
    var left = node.left;
    var iteratorId = getUniqueId(node.scope(), 'iterator');
    var stepId = getUniqueId(node.scope(), 'step');
    forStatement.body = node.body;
    var init = new nodes.CallExpression({
        callee: new nodes.MemberExpression({
          computed: true,
          object: node.right,
          property: new nodes.Literal({ value: '@@iterator' })
        })
      });
    forStatement.init = new nodes.VariableDeclaration({
      declarations: [
        new nodes.VariableDeclarator({
          id: iteratorId,
          init: init
        }),
        new nodes.VariableDeclarator({ id: stepId })
      ]
    });
    forStatement.test = express('!(' + stepId.name + ' = ' + iteratorId.name + '.next()).done').expression;
    var expression, xp = express(stepId.name + '.value').expression;
    if (left.type === syntax.VariableDeclaration) {
      left.declarations[0].init = xp;
      expression = left;
    } else {
      expression = new nodes.ExpressionStatement({
        expression: new nodes.AssignmentExpression({
          operator: '=',
          left: left,
          right: xp
        })
      });
    }
    forStatement.body.body.unshift(expression);
    node.parentNode.replaceChild(node, forStatement);
  });
}
exports.transform = forofify;