Only last parameter between parentheses can have spread
This commit is contained in:
committed by
Richard van Velzen
parent
f9cab7ad61
commit
6b03b800b3
@@ -1163,12 +1163,16 @@ function parse($TEXT, options) {
|
|||||||
while (!is("punc", ")")) {
|
while (!is("punc", ")")) {
|
||||||
if (first) first = false; else expect(",");
|
if (first) first = false; else expect(",");
|
||||||
if (is("expand", "...")) {
|
if (is("expand", "...")) {
|
||||||
|
var spread_token = S.token;
|
||||||
next();
|
next();
|
||||||
a.push(new AST_Expansion({
|
a.push(new AST_Expansion({
|
||||||
start: prev(),
|
start: prev(),
|
||||||
expression: as_symbol(AST_SymbolFunarg),
|
expression: as_symbol(AST_SymbolFunarg),
|
||||||
end: S.token,
|
end: S.token,
|
||||||
}));
|
}));
|
||||||
|
if (!is("punc", ")")) {
|
||||||
|
unexpected(spread_token);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
a.push(expression(false));
|
a.push(expression(false));
|
||||||
}
|
}
|
||||||
|
|||||||
85
test/compress/arrow.js
Normal file
85
test/compress/arrow.js
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
arrow_functions_without_body: {
|
||||||
|
input: {
|
||||||
|
var a1 = () => 42;
|
||||||
|
var a2 = (p) => p;
|
||||||
|
var a3 = p => p;
|
||||||
|
var a4 = (...p) => p;
|
||||||
|
var a5 = (b, c) => b + c;
|
||||||
|
var a6 = (b, ...c) => b + c[0];
|
||||||
|
var a7 = (...b) => b.join();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a1 = () => 42;
|
||||||
|
var a2 = (p) => p;
|
||||||
|
var a3 = p => p;
|
||||||
|
var a4 = (...p) => p;
|
||||||
|
var a5 = (b, c) => b + c;
|
||||||
|
var a6 = (b, ...c) => b + c[0];
|
||||||
|
var a7 = (...b) => b.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
arrow_functions_with_body: {
|
||||||
|
input: {
|
||||||
|
var a1 = () => {
|
||||||
|
var a = 42 * Math.random();
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a2 = (p) => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a3 = p => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a4 = (...p) => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a5 = (b, c) => {
|
||||||
|
var result = b * c + b / c;
|
||||||
|
return result
|
||||||
|
};
|
||||||
|
var a6 = (b, ...c) => {
|
||||||
|
var result = b;
|
||||||
|
for (var i = 0; i < c.length; i++)
|
||||||
|
result += c[i];
|
||||||
|
return result
|
||||||
|
};
|
||||||
|
var a7 = (...b) => {
|
||||||
|
b.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a1 = () => {
|
||||||
|
var a = 42 * Math.random();
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a2 = (p) => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a3 = p => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a4 = (...p) => {
|
||||||
|
var a = Math.random() * p;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
var a5 = (b, c) => {
|
||||||
|
var result = b * c + b / c;
|
||||||
|
return result
|
||||||
|
};
|
||||||
|
var a6 = (b, ...c) => {
|
||||||
|
var result = b;
|
||||||
|
for (var i = 0; i < c.length; i++)
|
||||||
|
result += c[i];
|
||||||
|
return result
|
||||||
|
};
|
||||||
|
var a7 = (...b) => {
|
||||||
|
b.join();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
25
test/mocha/arrow.js
Normal file
25
test/mocha/arrow.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
var assert = require("assert");
|
||||||
|
var uglify = require("../../");
|
||||||
|
|
||||||
|
describe("Arrow functions", function() {
|
||||||
|
it("Should not accept spread tokens on non-last parameters or without arguments parentheses", function() {
|
||||||
|
var tests = [
|
||||||
|
"var a = ...a => {return a.join()}",
|
||||||
|
"var b = (a, ...b, c) => { return a + b.join() + c}",
|
||||||
|
"var c = (...a, b) => a.join()"
|
||||||
|
];
|
||||||
|
var test = function(code) {
|
||||||
|
return function() {
|
||||||
|
uglify.parse(code, {fromString: true});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var error = function(e) {
|
||||||
|
return e instanceof uglify.JS_Parse_Error &&
|
||||||
|
e.message === "Unexpected token: expand (...)";
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < tests.length; i++) {
|
||||||
|
assert.throws(test(tests[i]), error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
26
test/mocha/class.js
Normal file
26
test/mocha/class.js
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
var assert = require("assert");
|
||||||
|
var uglify = require("../../");
|
||||||
|
|
||||||
|
describe("Class", function() {
|
||||||
|
it("Should not accept spread on non-last parameters in methods", function() {
|
||||||
|
var tests = [
|
||||||
|
"class foo { bar(...a, b) { return a.join(b) } }",
|
||||||
|
"class foo { bar(a, b, ...c, d) { return c.join(a + b) + d } }",
|
||||||
|
"class foo { *bar(...a, b) { return a.join(b) } }",
|
||||||
|
"class foo { *bar(a, b, ...c, d) { return c.join(a + b) + d } }"
|
||||||
|
];
|
||||||
|
var test = function(code) {
|
||||||
|
return function() {
|
||||||
|
uglify.parse(code, {fromString: true});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var error = function(e) {
|
||||||
|
return e instanceof uglify.JS_Parse_Error &&
|
||||||
|
e.message === "Unexpected token: expand (...)";
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < tests.length; i++) {
|
||||||
|
assert.throws(test(tests[i]), error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
30
test/mocha/function.js
Normal file
30
test/mocha/function.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
var assert = require("assert");
|
||||||
|
var uglify = require("../../");
|
||||||
|
|
||||||
|
describe("Function", function() {
|
||||||
|
it("Should not accept spread on non-last parameters", function() {
|
||||||
|
var tests = [
|
||||||
|
"var a = function(...a, b) { return a.join(b) }",
|
||||||
|
"var b = function(a, b, ...c, d) { return c.join(a + b) + d }",
|
||||||
|
"function foo(...a, b) { return a.join(b) }",
|
||||||
|
"function bar(a, b, ...c, d) { return c.join(a + b) + d }",
|
||||||
|
"var a = function*(...a, b) { return a.join(b) }",
|
||||||
|
"var b = function*(a, b, ...c, d) { return c.join(a + b) + d }",
|
||||||
|
"function* foo(...a, b) { return a.join(b) }",
|
||||||
|
"function* bar(a, b, ...c, d) { return c.join(a + b) + d }"
|
||||||
|
];
|
||||||
|
var test = function(code) {
|
||||||
|
return function() {
|
||||||
|
uglify.parse(code, {fromString: true});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var error = function(e) {
|
||||||
|
return e instanceof uglify.JS_Parse_Error &&
|
||||||
|
e.message === "Unexpected token: expand (...)";
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < tests.length; i++) {
|
||||||
|
assert.throws(test(tests[i]), error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user