Code coverage report for harmonizer/transform/let-declarations.js

Statements: 97.73% (43 / 44)      Branches: 92.31% (24 / 26)      Functions: 100% (7 / 7)      Lines: 97.73% (43 / 44)      Ignored: none     

All files » harmonizer/transform/ » let-declarations.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 58 59 60 61 62 63  1 1 1 1 652 652   1 43 43 43 43 649 116 116 3 3     3               1 10 10 9   1 1 43 43 40   3 3 3 3 3 3 3   3   1 6   1 6 2 2   4 4       1
'use strict';
var syntax = require('nodes/syntax.json');
var objectPattern = require('../util/id');
var getUniqueName = objectPattern.getUniqueName;
var isFor = function (node) {
  var type;
  return node && (type = node.type) && (type === syntax.ForStatement || type === syntax.ForInStatement || type === syntax.ForOfStatement);
};
var lookupReferenceLetDeclarators = function (node) {
  var name = node.name;
  var identifiers;
  var dec = '#VariableDeclaration[kind=let] #Identifier:declaration[name=' + name + ']';
  while (node = node.parentNode) {
    if (isFor(node) || node.type === syntax.BlockStatement || node.type === syntax.Program) {
      identifiers = node.search('~> ' + dec);
      if (identifiers.length) {
        var ancestor = node.parentNode;
        Iif (isFor(ancestor)) {
          node = ancestor;
        }
        return [
          node,
          identifiers
        ];
      }
    }
  }
};
function letify(program) {
  var lets = program.search('#VariableDeclaration[kind=let]');
  if (!lets.length) {
    return;
  }
  var uniqueNameMap = {};
  program.search(':reference').forEach(function (ref) {
    var result = lookupReferenceLetDeclarators(ref);
    if (!result) {
      return;
    }
    var block = result[0], identifiers = result[1];
    var map = uniqueNameMap[block.uid] || (uniqueNameMap[block.uid] = {});
    var scope = block === program ? block : block.scope();
    var name = ref.name;
    identifiers.forEach(function (dec) {
      var uniqueName = map[name] || (map[name] = getUniqueName(scope, name));
      dec.var_name = uniqueName;
    });
    ref.name = map[name];
  });
  lets.forEach(function (node) {
    node.kind = 'var';
  });
  lets.search('#Identifier:declaration').forEach(function (node) {
    if (node.var_name) {
      node.name = node.var_name;
      delete node.var_name;
    } else {
      var uniqueName = getUniqueName(node.scope(), node.name);
      node.name = uniqueName;
    }
  });
}
exports.transform = letify;