add support for spreads anywhere in list - fixes #73
This commit is contained in:
parent
a75248d2d2
commit
42a7973a9d
@ -14,42 +14,68 @@ var getSpreadLiteral = function (spread, file) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
var hasSpread = function (nodes) {
|
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) {
|
exports.ArrayExpression = function (node, parent, file) {
|
||||||
var elements = node.elements;
|
var elements = node.elements;
|
||||||
if (!hasSpread(elements)) return;
|
if (!hasSpread(elements)) return;
|
||||||
|
|
||||||
var spread = elements.pop();
|
var nodes = build(elements, file);
|
||||||
|
var first = nodes.shift();
|
||||||
|
|
||||||
var concat = util.template("array-concat", {
|
if (!nodes.length) return first;
|
||||||
ARGUMENT: getSpreadLiteral(spread, file)
|
|
||||||
});
|
|
||||||
|
|
||||||
concat.callee.object.elements = elements;
|
return b.callExpression(b.memberExpression(first, b.identifier("concat"), false), nodes);
|
||||||
|
|
||||||
return concat;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.CallExpression = function (node, parent, file) {
|
exports.CallExpression = function (node, parent, file) {
|
||||||
var args = node.arguments;
|
var args = node.arguments;
|
||||||
if (!hasSpread(args)) return;
|
if (!hasSpread(args)) return;
|
||||||
|
|
||||||
var spread = args.pop();
|
|
||||||
|
|
||||||
var spreadLiteral = getSpreadLiteral(spread, file);
|
|
||||||
var contextLiteral = b.literal(null);
|
var contextLiteral = b.literal(null);
|
||||||
|
|
||||||
node.arguments = [];
|
node.arguments = [];
|
||||||
|
|
||||||
if (args.length) {
|
var nodes = build(args, file);
|
||||||
var concat = util.template("array-concat");
|
var first = nodes.shift();
|
||||||
concat.arguments = [spreadLiteral];
|
|
||||||
concat.callee.object.elements = args;
|
if (nodes.length) {
|
||||||
node.arguments.push(concat);
|
node.arguments.push(b.callExpression(b.memberExpression(first, b.identifier("concat"), false), nodes));
|
||||||
} else {
|
} else {
|
||||||
node.arguments.push(spreadLiteral);
|
node.arguments.push(first);
|
||||||
}
|
}
|
||||||
|
|
||||||
var callee = node.callee;
|
var callee = node.callee;
|
||||||
|
|||||||
1
test/fixtures/syntax/spread/array-literal-first/actual.js
vendored
Normal file
1
test/fixtures/syntax/spread/array-literal-first/actual.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
var lyrics = [...parts, "head", "and", "toes"];
|
||||||
3
test/fixtures/syntax/spread/array-literal-first/expected.js
vendored
Normal file
3
test/fixtures/syntax/spread/array-literal-first/expected.js
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
"use strict";
|
||||||
|
var _slice = Array.prototype.slice;
|
||||||
|
var lyrics = _slice.call(parts).concat(["head", "and", "toes"]);
|
||||||
1
test/fixtures/syntax/spread/array-literal-middle/actual.js
vendored
Normal file
1
test/fixtures/syntax/spread/array-literal-middle/actual.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
var a = [b, ...c, d];
|
||||||
3
test/fixtures/syntax/spread/array-literal-middle/expected.js
vendored
Normal file
3
test/fixtures/syntax/spread/array-literal-middle/expected.js
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
"use strict";
|
||||||
|
var _slice = Array.prototype.slice;
|
||||||
|
var a = [b].concat(_slice.call(c), [d]);
|
||||||
1
test/fixtures/syntax/spread/array-literal-multiple/actual.js
vendored
Normal file
1
test/fixtures/syntax/spread/array-literal-multiple/actual.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
var a = [b, ...c, d, e, ...f];
|
||||||
3
test/fixtures/syntax/spread/array-literal-multiple/expected.js
vendored
Normal file
3
test/fixtures/syntax/spread/array-literal-multiple/expected.js
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
"use strict";
|
||||||
|
var _slice = Array.prototype.slice;
|
||||||
|
var a = [b].concat(_slice.call(c), [d, e], _slice.call(f));
|
||||||
1
test/fixtures/syntax/spread/method-call-first/actual.js
vendored
Normal file
1
test/fixtures/syntax/spread/method-call-first/actual.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
add(...numbers, foo, bar);
|
||||||
3
test/fixtures/syntax/spread/method-call-first/expected.js
vendored
Normal file
3
test/fixtures/syntax/spread/method-call-first/expected.js
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
"use strict";
|
||||||
|
var _slice = Array.prototype.slice;
|
||||||
|
add.apply(null, _slice.call(numbers).concat([foo, bar]));
|
||||||
1
test/fixtures/syntax/spread/method-call-middle/actual.js
vendored
Normal file
1
test/fixtures/syntax/spread/method-call-middle/actual.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
add(foo, ...numbers, bar);
|
||||||
3
test/fixtures/syntax/spread/method-call-middle/expected.js
vendored
Normal file
3
test/fixtures/syntax/spread/method-call-middle/expected.js
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
"use strict";
|
||||||
|
var _slice = Array.prototype.slice;
|
||||||
|
add.apply(null, [foo].concat(_slice.call(numbers), [bar]));
|
||||||
1
test/fixtures/syntax/spread/method-call-multiple/actual.js
vendored
Normal file
1
test/fixtures/syntax/spread/method-call-multiple/actual.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
add(foo, ...numbers, bar, what, ...test);
|
||||||
3
test/fixtures/syntax/spread/method-call-multiple/expected.js
vendored
Normal file
3
test/fixtures/syntax/spread/method-call-multiple/expected.js
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
"use strict";
|
||||||
|
var _slice = Array.prototype.slice;
|
||||||
|
add.apply(null, [foo].concat(_slice.call(numbers), [bar, what], _slice.call(test)));
|
||||||
Loading…
x
Reference in New Issue
Block a user