Code coverage report for harmonizer/transform/spread.js

Statements: 97.06% (66 / 68)      Branches: 87.5% (14 / 16)      Functions: 100% (5 / 5)      Lines: 97.06% (66 / 68)      Ignored: none     

All files » harmonizer/transform/ » spread.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 881 7 7   7 7 10 7   1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 16 16 16 16     16 16 5 5 5 5 5 5   11   16 16 16 5 2   3 2 2 2 2 2 2         2   3     11   16         1 10 5   10 2 2 2 2 2 2 2 2     1 1
var spreadA = function () {
  var array = [], last = arguments.length - 1;
  for (var i = 0; i < last; i++)
    array.push(arguments[i]);
  var iterator = arguments[last]['@@iterator'](), step;
  while (!(step = iterator.next()).done)
    array.push(step.value);
  return array;
};
'use strict';
var objectPatternE = require('nodes');
var nodes = objectPatternE.nodes;
var syntax = require('nodes/syntax.json');
var objectPatternD = require('../util/spread');
var getSpreadId = objectPatternD.getSpreadId;
var objectPatternC = require('../util/string');
var express = objectPatternC.express, lower = objectPatternC.lower;
var objectPatternB = require('../util/id');
var getUniqueId = objectPatternB.getUniqueId;
var objectPatternA = require('../util/iterators');
var values = objectPatternA.values;
var objectPattern = require('../util/insertion');
var insertBefore = objectPattern.insertBefore;
var applyContext = function (node, context) {
  var memberExpression;
  var args = node.arguments;
  var spread = args[args.length - 1];
  var isSpread = spread && spread.type === syntax.SpreadElement;
  Iif (!context && !isSpread) {
    return;
  }
  var propertyName;
  if (isSpread) {
    args.replaceChild(spread, spread.argument);
    var spreadId = getSpreadId(node.root).clone();
    var spreadCall = express(spreadId.name + '()').expression;
    (memberExpression = spreadCall.arguments).push.apply(memberExpression, spreadA(values(args)));
    args.push(spreadCall);
    propertyName = 'apply';
  } else {
    propertyName = 'call';
  }
  var callee = node.callee;
  var object = callee.object;
  if (!context) {
    if (callee.type !== syntax.MemberExpression) {
      args.unshift(new nodes.Literal({ value: null }));
    } else {
      if (object.type !== syntax.Identifier) {
        var scope = node.scope();
        var contextId = getUniqueId(scope, lower(object.type));
        var body = nodes.Function.test(scope) ? scope.body.body : scope.body;
        var declaration = express('var ' + contextId.name);
        body.unshift(declaration);
        callee.object = new nodes.AssignmentExpression({
          left: contextId.clone(),
          operator: '=',
          right: object
        });
        object = contextId;
      }
      args.unshift(object.clone());
    }
  } else {
    args.unshift(context);
  }
  node.callee = new nodes.MemberExpression({
    object: node.callee,
    property: new nodes.Identifier({ name: propertyName })
  });
};
function spreadify(program) {
  program.search('#SpreadElement < arguments < #CallExpression').forEach(function (node) {
    applyContext(node);
  });
  program.search('#SpreadElement < elements < #ArrayExpression').forEach(function (node) {
    var memberExpression;
    var elements = node.elements;
    var spread = elements[elements.length - 1];
    elements.replaceChild(spread, spread.argument);
    var spreadId = getSpreadId(program).clone();
    var spreadCall = express(spreadId.name + '()').expression;
    (memberExpression = spreadCall.arguments).push.apply(memberExpression, spreadA(values(elements)));
    node.parentNode.replaceChild(node, spreadCall);
  });
}
exports.transform = spreadify;
exports.applyContext = applyContext;