diff --git a/acorn.js b/acorn.js index 334b3ff1d8..491a3e2f23 100644 --- a/acorn.js +++ b/acorn.js @@ -1458,6 +1458,7 @@ case "ObjectPattern": case "ArrayPattern": case "AssignmentPattern": + case "RestElement": break; case "ObjectExpression": @@ -1478,6 +1479,7 @@ case "SpreadElement": if (allowSpread) { + node.type = "RestElement"; toAssignable(node.argument, false, checkType); checkSpreadAssign(node.argument); } else { @@ -1502,17 +1504,19 @@ // Parses spread element. - function parseSpread(isBinding) { - var spread = startNode(); + function parseSpread() { + var node = startNode(); next(); - if (isBinding) { - var arg = parseAssignableAtom(); - checkSpreadAssign(arg); - spread.argument = arg; - } else { - spread.argument = parseMaybeAssign(); - } - return finishNode(spread, "SpreadElement"); + node.argument = parseMaybeAssign(); + return finishNode(node, "SpreadElement"); + } + + function parseRest() { + var node = startNode(); + next(); + node.argument = parseAssignableAtom(); + checkSpreadAssign(node.argument); + return finishNode(node, "RestElement"); } // Parses lvalue (assignable) atom. @@ -1530,7 +1534,7 @@ while (!eat(_bracketR)) { first ? first = false : expect(_comma); if (tokType === _ellipsis) { - elts.push(parseSpread(true)); + elts.push(parseRest()); expect(_bracketR); break; } @@ -1648,7 +1652,7 @@ break; case "AssignmentPattern": - case "SpreadElement": + case "RestElement": break; default: @@ -2270,7 +2274,7 @@ first ? first = false : expect(_comma); if (tokType === _ellipsis) { spreadStart = tokStart; - exprList.push(parseSpread(true)); + exprList.push(parseRest()); break; } else { if (tokType === _parenL && !innerParenStart) { @@ -2479,7 +2483,7 @@ } else { toAssignable(param, i === lastI, true); defaults.push(null); - if (param.type === "SpreadElement") { + if (param.type === "RestElement") { params.length--; node.rest = param.argument; break; diff --git a/acorn_loose.js b/acorn_loose.js index db2883c4bf..dca43afc7b 100644 --- a/acorn_loose.js +++ b/acorn_loose.js @@ -297,7 +297,7 @@ case "MemberExpression": case "ObjectPattern": case "ArrayPattern": - case "SpreadElement": + case "RestElement": case "AssignmentPattern": return expr; @@ -982,6 +982,7 @@ break; case "SpreadElement": + node.type = "RestElement"; node.argument = toAssignable(node.argument); break; @@ -1007,7 +1008,7 @@ param = param.left; } param = toAssignable(param); - if (param.type === "SpreadElement") { + if (param.type === "RestElement") { param = param.argument; if (i === params.length - 1) { node.rest = param; diff --git a/test/tests-harmony.js b/test/tests-harmony.js index c0c74b8113..82eafb146d 100644 --- a/test/tests-harmony.js +++ b/test/tests-harmony.js @@ -12913,7 +12913,7 @@ test("[...a] = b", { left: { type: "ArrayPattern", elements: [{ - type: "SpreadElement", + type: "RestElement", argument: { type: "Identifier", name: "a", @@ -12979,7 +12979,7 @@ test("[a, ...b] = c", { } }, { - type: "SpreadElement", + type: "RestElement", argument: { type: "Identifier", name: "b", @@ -13101,7 +13101,7 @@ test("[{ a, b }, ...c] = d", { } }, { - type: "SpreadElement", + type: "RestElement", argument: { type: "Identifier", name: "c", @@ -13168,7 +13168,7 @@ test("[a, ...[b, c]] = d", { } }, { - type: "SpreadElement", + type: "RestElement", argument: { type: "ArrayPattern", elements: [ @@ -13242,7 +13242,7 @@ test("var [...a] = b", { id: { type: "ArrayPattern", elements: [{ - type: "SpreadElement", + type: "RestElement", argument: { type: "Identifier", name: "a", @@ -13308,7 +13308,7 @@ test("var [a, ...b] = c", { } }, { - type: "SpreadElement", + type: "RestElement", argument: { type: "Identifier", name: "b", @@ -13430,7 +13430,7 @@ test("var [{ a, b }, ...c] = d", { } }, { - type: "SpreadElement", + type: "RestElement", argument: { type: "Identifier", name: "c", @@ -13497,7 +13497,7 @@ test("var [a, ...[b, c]] = d", { } }, { - type: "SpreadElement", + type: "RestElement", argument: { type: "ArrayPattern", elements: [ @@ -14195,7 +14195,7 @@ test("[...a, ] = b", { end: {line: 1, column: 8} }, elements: [{ - type: "SpreadElement", + type: "RestElement", loc: { start: {line: 1, column: 1}, end: {line: 1, column: 5}