Code coverage report for 6to5/transformers/destructuring.js

Statements: 98.31% (58 / 59)      Branches: 91.67% (22 / 24)      Functions: 100% (13 / 13)      Lines: 100% (56 / 56)      Ignored: none     

All files » 6to5/transformers/ » destructuring.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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 1081 1 1   1 177       1 29         1 17 10 7 7       1 10 20 20   20 6   14         1 7 16   16   16 14   2         1 9 1   1         1     9     1   76 76   76 45   4   4   4     76     1 105   105 105 106 5 5     105   5 6 6 6 5   1       5    
var util = require("../util");
var b    = require("ast-types").builders;
var _    = require("lodash");
 
var isPattern = function (id) {
  return id.type === "ArrayPattern" || id.type === "ObjectPattern";
};
 
 
var buildVariableAssign = function (kind, id, init) {
  return b.variableDeclaration(kind, [
    b.variableDeclarator(id, init)
  ]);
};
 
var push = function (kind, nodes, pattern, parentId) {
  if (pattern.type === "ObjectPattern") {
    pushObjectPattern(kind, nodes, pattern, parentId);
  } else Eif (pattern.type === "ArrayPattern") {
    pushArrayPattern(kind, nodes, pattern, parentId);
  }
};
 
var pushObjectPattern = function (kind, nodes, pattern, parentId) {
  _.each(pattern.properties, function (prop) {
    var pattern2   = prop.value;
    var patternId2 = b.memberExpression(parentId, prop.key, false);
 
    if (isPattern(pattern2)) {
      push(kind, nodes, pattern2, patternId2);
    } else {
      nodes.push(buildVariableAssign(kind, pattern2, patternId2));
    }
  });
};
 
var pushArrayPattern = function (kind, nodes, pattern, parentId) {
  _.each(pattern.elements, function (elem, i) {
    Iif (!elem) return;
 
    var newPatternId = b.memberExpression(parentId, b.literal(i), true);
 
    if (elem.type === "Identifier") {
      nodes.push(buildVariableAssign(kind, elem, newPatternId));
    } else {
      push(kind, nodes, elem, newPatternId);
    }
  });
};
 
var pushPattern = function (kind, nodes, pattern, parentId, generateUid) {
  if (parentId.type !== "MemberExpression" && parentId.type !== "Identifier") {
    var key = generateUid("ref");
 
    nodes.push(util.template("variable-assign", {
      KEY: key,
      VALUE: parentId
    }, true));
 
    parentId = b.identifier(key);
  }
 
  push(kind, nodes, pattern, parentId);
};
 
exports.FunctionDeclaration =
exports.FunctionExpression = function (node, parent, opts, generateUid) {
  var block = node.body;
  var nodes = [];
 
  node.params = node.params.map(function (pattern) {
    if (!isPattern(pattern)) return pattern;
 
    var parentId = b.identifier(generateUid("ref"));
 
    pushPattern("var", nodes, pattern, parentId, generateUid);
 
    return parentId;
  });
 
  block.body = nodes.concat(block.body);
};
 
exports.VariableDeclaration = function (node, parent, opts, generateUid) {
  var nodes = [];
 
  var hasPattern = false;
  _.each(node.declarations, function (declar) {
    if (isPattern(declar.id)) {
      hasPattern = true;
      return false;
    }
  });
  if (!hasPattern) return;
 
  _.each(node.declarations, function (declar) {
    var patternId = declar.init;
    var pattern   = declar.id;
    if (isPattern(pattern)) {
      pushPattern(node.kind, nodes, pattern, patternId, generateUid);
    } else {
      nodes.push(buildVariableAssign(node.kind, declar.id, declar.init));
    }
  });
 
  return nodes;
};