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; |