add support for spreads anywhere in list - fixes #73
This commit is contained in:
@@ -14,42 +14,68 @@ var getSpreadLiteral = function (spread, file) {
|
||||
};
|
||||
|
||||
var hasSpread = function (nodes) {
|
||||
return nodes.length && _.last(nodes).type === "SpreadElement";
|
||||
var has = false;
|
||||
_.each(nodes, function (node) {
|
||||
if (node.type === "SpreadElement") {
|
||||
has = true;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return has;
|
||||
};
|
||||
|
||||
var build = function (props, file) {
|
||||
var nodes = [];
|
||||
|
||||
var _props = [];
|
||||
|
||||
var push = function () {
|
||||
if (!_props.length) return;
|
||||
nodes.push(b.arrayExpression(_props));
|
||||
_props = [];
|
||||
};
|
||||
|
||||
_.each(props, function (prop) {
|
||||
if (prop.type === "SpreadElement") {
|
||||
push();
|
||||
nodes.push(getSpreadLiteral(prop, file));
|
||||
} else {
|
||||
_props.push(prop);
|
||||
}
|
||||
});
|
||||
|
||||
push();
|
||||
|
||||
return nodes;
|
||||
};
|
||||
|
||||
exports.ArrayExpression = function (node, parent, file) {
|
||||
var elements = node.elements;
|
||||
if (!hasSpread(elements)) return;
|
||||
|
||||
var spread = elements.pop();
|
||||
var nodes = build(elements, file);
|
||||
var first = nodes.shift();
|
||||
|
||||
var concat = util.template("array-concat", {
|
||||
ARGUMENT: getSpreadLiteral(spread, file)
|
||||
});
|
||||
if (!nodes.length) return first;
|
||||
|
||||
concat.callee.object.elements = elements;
|
||||
|
||||
return concat;
|
||||
return b.callExpression(b.memberExpression(first, b.identifier("concat"), false), nodes);
|
||||
};
|
||||
|
||||
exports.CallExpression = function (node, parent, file) {
|
||||
var args = node.arguments;
|
||||
if (!hasSpread(args)) return;
|
||||
|
||||
var spread = args.pop();
|
||||
|
||||
var spreadLiteral = getSpreadLiteral(spread, file);
|
||||
var contextLiteral = b.literal(null);
|
||||
|
||||
node.arguments = [];
|
||||
|
||||
if (args.length) {
|
||||
var concat = util.template("array-concat");
|
||||
concat.arguments = [spreadLiteral];
|
||||
concat.callee.object.elements = args;
|
||||
node.arguments.push(concat);
|
||||
var nodes = build(args, file);
|
||||
var first = nodes.shift();
|
||||
|
||||
if (nodes.length) {
|
||||
node.arguments.push(b.callExpression(b.memberExpression(first, b.identifier("concat"), false), nodes));
|
||||
} else {
|
||||
node.arguments.push(spreadLiteral);
|
||||
node.arguments.push(first);
|
||||
}
|
||||
|
||||
var callee = node.callee;
|
||||
|
||||
Reference in New Issue
Block a user