extend trailing comma support (#4334)

This commit is contained in:
Alex Lam S.L
2020-12-07 02:07:34 +00:00
committed by GitHub
parent 2cbbf5c375
commit 9eb65f3af3
3 changed files with 38 additions and 24 deletions

View File

@@ -1053,12 +1053,9 @@ function parse($TEXT, options) {
if (name && ctor !== AST_Accessor && !(name instanceof AST_SymbolDeclaration)) if (name && ctor !== AST_Accessor && !(name instanceof AST_SymbolDeclaration))
unexpected(prev()); unexpected(prev());
expect("("); expect("(");
var argnames = []; var argnames = expr_list(")", !options.strict, false, function() {
for (var first = true; !is("punc", ")");) { return maybe_destructured(AST_SymbolFunarg);
if (first) first = false; else expect(","); });
argnames.push(maybe_destructured(AST_SymbolFunarg));
}
next();
var loop = S.in_loop; var loop = S.in_loop;
var labels = S.labels; var labels = S.labels;
++S.in_function; ++S.in_function;
@@ -1233,7 +1230,7 @@ function parse($TEXT, options) {
var newexp = expr_atom(false), args; var newexp = expr_atom(false), args;
if (is("punc", "(")) { if (is("punc", "(")) {
next(); next();
args = expr_list(")"); args = expr_list(")", !options.strict);
} else { } else {
args = []; args = [];
} }
@@ -1351,9 +1348,9 @@ function parse($TEXT, options) {
while (!is("punc", closing)) { while (!is("punc", closing)) {
if (first) first = false; else expect(","); if (first) first = false; else expect(",");
if (allow_trailing_comma && is("punc", closing)) break; if (allow_trailing_comma && is("punc", closing)) break;
if (is("punc", ",") && allow_empty) { if (allow_empty && is("punc", ",")) {
a.push(new AST_Hole({ start: S.token, end: S.token })); a.push(new AST_Hole({ start: S.token, end: S.token }));
} else if (is("operator", "...") && parser === expression) { } else if (parser === expression && is("operator", "...")) {
a.push(new AST_Spread({ a.push(new AST_Spread({
start: S.token, start: S.token,
expression: (next(), parser()), expression: (next(), parser()),
@@ -1593,7 +1590,7 @@ function parse($TEXT, options) {
var call = new AST_Call({ var call = new AST_Call({
start : start, start : start,
expression : expr, expression : expr,
args : expr_list(")"), args : expr_list(")", !options.strict),
end : prev() end : prev()
}); });
mark_pure(call); mark_pure(call);

View File

@@ -5213,3 +5213,13 @@ issue_4265: {
} }
expect_stdout: "undefined" expect_stdout: "undefined"
} }
trailing_comma: {
input: {
new function(a, b,) {
console.log(b, a,);
}(42, "PASS",);
}
expect_exact: 'new function(a,b){console.log(b,a)}(42,"PASS");'
expect_stdout: "PASS 42"
}

View File

@@ -362,6 +362,10 @@ function createFunctions(n, recurmax, allowDefun, canThrow, stmtDepth) {
return s; return s;
} }
function addTrailingComma(list) {
return list && rng(20) == 0 ? list + "," : list;
}
function createParams(noDuplicate) { function createParams(noDuplicate) {
var len = unique_vars.length; var len = unique_vars.length;
var params = []; var params = [];
@@ -371,7 +375,7 @@ function createParams(noDuplicate) {
params.push(name); params.push(name);
} }
unique_vars.length = len; unique_vars.length = len;
return params.join(", "); return addTrailingComma(params.join(", "));
} }
function createArgs(recurmax, stmtDepth, canThrow) { function createArgs(recurmax, stmtDepth, canThrow) {
@@ -394,7 +398,7 @@ function createArgs(recurmax, stmtDepth, canThrow) {
args.push(rng(2) ? createValue() : createExpression(recurmax, COMMA_OK, stmtDepth, canThrow)); args.push(rng(2) ? createValue() : createExpression(recurmax, COMMA_OK, stmtDepth, canThrow));
break; break;
} }
return args.join(", "); return addTrailingComma(args.join(", "));
} }
function createAssignmentPairs(recurmax, noComma, stmtDepth, canThrow, varNames, was_async) { function createAssignmentPairs(recurmax, noComma, stmtDepth, canThrow, varNames, was_async) {
@@ -463,7 +467,10 @@ function createAssignmentPairs(recurmax, noComma, stmtDepth, canThrow, varNames,
while (!rng(10)) { while (!rng(10)) {
var index = rng(pairs.names.length + 1); var index = rng(pairs.names.length + 1);
pairs.names.splice(index, 0, ""); pairs.names.splice(index, 0, "");
pairs.values.splice(index, 0, rng(2) ? createAssignmentValue(recurmax) : ""); if (rng(2)) {
if (index > pairs.values.length) pairs.values.length = index;
pairs.values.splice(index, 0, createAssignmentValue(recurmax));
}
} }
names.unshift("[ " + pairs.names.join(", ") + " ]"); names.unshift("[ " + pairs.names.join(", ") + " ]");
values.unshift("[ " + pairs.values.join(", ") + " ]"); values.unshift("[ " + pairs.values.join(", ") + " ]");
@@ -485,14 +492,14 @@ function createAssignmentPairs(recurmax, noComma, stmtDepth, canThrow, varNames,
keys[index] = key; keys[index] = key;
} }
}); });
names.unshift("{ " + pairs.names.map(function(name, index) { names.unshift("{ " + addTrailingComma(pairs.names.map(function(name, index) {
var key = index in keys ? keys[index] : rng(10) && createKey(recurmax, keys); var key = index in keys ? keys[index] : rng(10) && createKey(recurmax, keys);
return key ? key + ": " + name : name; return key ? key + ": " + name : name;
}).join(", ") + " }"); }).join(", ")) + " }");
values.unshift("{ " + pairs.values.map(function(value, index) { values.unshift("{ " + addTrailingComma(pairs.values.map(function(value, index) {
var key = index in keys ? keys[index] : createKey(recurmax, keys); var key = index in keys ? keys[index] : createKey(recurmax, keys);
return key + ": " + value; return key + ": " + value;
}).join(", ") + " }"); }).join(", ")) + " }");
} }
break; break;
default: default:
@@ -603,8 +610,8 @@ function createFunction(recurmax, allowDefun, canThrow, stmtDepth) {
if ((!allowDefun || !(name in called)) && rng(2)) { if ((!allowDefun || !(name in called)) && rng(2)) {
called[name] = false; called[name] = false;
var pairs = createAssignmentPairs(recurmax, COMMA_OK, stmtDepth, canThrow, varNames, save_async); var pairs = createAssignmentPairs(recurmax, COMMA_OK, stmtDepth, canThrow, varNames, save_async);
params = pairs.names.join(", "); params = addTrailingComma(pairs.names.join(", "));
args = pairs.values.join(", "); args = addTrailingComma(pairs.values.join(", "));
} else { } else {
params = createParams(); params = createParams();
} }
@@ -968,7 +975,7 @@ function _createExpression(recurmax, noComma, stmtDepth, canThrow) {
createBlockVariables(recurmax, stmtDepth, canThrow, function(defns) { createBlockVariables(recurmax, stmtDepth, canThrow, function(defns) {
var instantiate = rng(4) ? "new " : ""; var instantiate = rng(4) ? "new " : "";
s.push( s.push(
instantiate + "function " + name + "(){", instantiate + "function " + name + "(" + createParams() + "){",
strictMode(), strictMode(),
defns() defns()
); );
@@ -976,11 +983,11 @@ function _createExpression(recurmax, noComma, stmtDepth, canThrow) {
if (rng(2)) s.push("this." + getDotKey(true) + createAssignment() + _createBinaryExpr(recurmax, noComma, stmtDepth, canThrow) + ";"); if (rng(2)) s.push("this." + getDotKey(true) + createAssignment() + _createBinaryExpr(recurmax, noComma, stmtDepth, canThrow) + ";");
else s.push("this[" + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + "]" + createAssignment() + _createBinaryExpr(recurmax, noComma, stmtDepth, canThrow) + ";"); else s.push("this[" + createExpression(recurmax, COMMA_OK, stmtDepth, canThrow) + "]" + createAssignment() + _createBinaryExpr(recurmax, noComma, stmtDepth, canThrow) + ";");
} }
s.push( s.push(_createStatements(rng(5) + 1, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth));
_createStatements(rng(5) + 1, recurmax, canThrow, CANNOT_BREAK, CANNOT_CONTINUE, CAN_RETURN, stmtDepth),
rng(2) == 0 ? "}" : "}()"
);
}); });
async = save_async;
VAR_NAMES.length = nameLenBefore;
s.push(rng(2) == 0 ? "}" : "}(" + createArgs(recurmax, stmtDepth, canThrow) + ")");
break; break;
} }
async = save_async; async = save_async;