Code coverage report for 6to5/transformers/let-scoping.js

Statements: 90% (36 / 40)      Branches: 94.44% (17 / 18)      Functions: 100% (7 / 7)      Lines: 88.57% (31 / 35)      Ignored: none     

All files » 6to5/transformers/ » let-scoping.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 64 65 661 1 1 1   1 228 52   52   52 57 61       52   1246     451 451   127     52 1130 26   26 142 142 142     26 5 5         5               5     21       1104     52    
var traverse = require("../traverse");
var util     = require("../util");
var b        = require("recast").types.builders;
var _        = require("lodash");
 
exports.VariableDeclaration = function (node, parent, file) {
  if (node.kind !== "let") return;
  node.kind = "var";
 
  var ids = {};
 
  _.each(node.declarations, function (declar) {
    _.each(util.getIds(declar.id), function (id) {
      ids[id] = b.identifier(file.generateUid(id));
    });
  });
 
  var replaceId = function (node, parent) {
    // not an identifier so we have no use for this node
    if (node.type !== "Identifier") return;
 
    // not a let reference
    var id = ids[node.name];
    if (!id) return;
 
    if (util.isReferenced(node, parent)) return id;
  };
 
  var replace = function (node, parent) {
    if (_.contains(traverse.FUNCTION_TYPES, node.type)) {
      var letReferences = [];
 
      traverse(node, function (node, parent) {
        var id = replaceId(node, parent);
        if (id && !_.contains(letReferences, id)) letReferences.push(id);
        return id;
      });
 
      if (letReferences.length) {
        var callNode = function () {
          return b.callExpression(b.functionExpression(null, letReferences, b.blockStatement([
            b.returnStatement(node)
          ])), letReferences);
        };
 
        Iif (node.type === "FunctionDeclaration") {
          util.ensureExpressionType(node);
          var declar = b.variableDeclaration("var", [
            b.variableDeclarator(node.id, callNode())
          ]);
          declar._blockHoist = true;
          return declar;
        } else {
          return callNode();
        }
      } else {
        return false;
      }
    }
 
    return replaceId(node, parent);
  };
 
  traverse(parent, replace);
};