Code coverage report for 6to5/transformers/array-comprehension.js

Statements: 100% (38 / 38)      Branches: 100% (12 / 12)      Functions: 100% (5 / 5)      Lines: 100% (36 / 36)      Ignored: none     

All files » 6to5/transformers/ » array-comprehension.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 801 1   1 2   2 2   2               1 2   2       2 2   2   2 6 6   4 4     2           2 1     1 1       4       4 4     2 2   2     1 5 7 1       4 2   2      
var util = require("../util");
var _    = require("lodash");
 
var single = function (node) {
  var block = node.blocks[0];
 
  var templateName = "array-comprehension-map";
  if (node.filter) templateName = "array-comprehension-filter";
 
  return util.template(templateName, {
    STATEMENT: node.body,
    FILTER:    node.filter,
    ARRAY:     block.right,
    KEY:       block.left
  });
};
 
var multiple = function (node, generateUid) {
  var uid = generateUid("arr");
 
  var container = util.template("array-comprehension-container", {
    KEY: uid
  });
 
  var block = container.callee.body;
  var body  = block.body;
 
  var returnStatement = body.pop();
 
  var build = function () {
    var self = node.blocks.shift();
    if (!self) return;
 
    var child = build();
    if (!child) {
      // last item
 
      child = util.template("array-push", {
        STATEMENT: node.body,
        KEY:       uid
      }, true);
 
      // add a filter as this is our final stop
      if (node.filter) {
        var filter = util.template("if", {
          STATEMENT: node.filter
        });
        filter.consequent.body = [child];
        child = filter;
      }
    }
 
    var container2 = util.template("array-comprehension-for-each", {
      ARRAY: self.right,
      KEY:   self.left
    }, true);
    container2.expression.arguments[0].body.body = [child];
    return container2;
  };
 
  body.push(build());
  body.push(returnStatement);
 
  return container;
};
 
exports.ComprehensionExpression = function (node, parent, opts, generateUid) {
  _.each(node.blocks, function (block) {
    if (!block.of) {
      throw util.errorWithNode(block, "for-in array comprehension is not supported");
    }
  });
 
  if (node.blocks.length === 1) {
    return single(node);
  } else {
    return multiple(node, generateUid);
  }
};