diff --git a/acorn.js b/acorn.js index 20d4b35ccd..ff3881bb88 100644 --- a/acorn.js +++ b/acorn.js @@ -2003,14 +2003,18 @@ function parseMaybeAssign(noIn) { var start = storeCurrentPos(); + var oldParenL = metParenL; var left = parseMaybeConditional(noIn); if (tokType.isAssign) { + if (metParenL !== oldParenL) raise(tokStart, "Assigning to rvalue"); var node = startNodeAt(start); node.operator = tokVal; node.left = tokType === _eq ? toAssignable(left) : left; checkLVal(left); next(); node.right = parseMaybeAssign(noIn); + // restore count of '(' so they are allowed in lvalue's defaults + metParenL = oldParenL; return finishNode(node, "AssignmentExpression"); } return left; @@ -2338,7 +2342,10 @@ if (options.ecmaVersion >= 6) { if (eat(_bracketL)) { prop.computed = true; + // save & restore count of '(' so they are allowed in lvalue's computed props + var oldParenL = metParenL; prop.key = parseExpression(); + metParenL = oldParenL; expect(_bracketR); return; } else { diff --git a/test/tests-harmony.js b/test/tests-harmony.js index 4c571b3ac5..bb8406582b 100644 --- a/test/tests-harmony.js +++ b/test/tests-harmony.js @@ -3940,7 +3940,7 @@ test("[a, b] = [b, a]", { locations: true }); -test("({ responseText: text }) = res", { +test("({ responseText: text } = res)", { type: "Program", body: [{ type: "ExpressionStatement", @@ -3985,13 +3985,13 @@ test("({ responseText: text }) = res", { type: "Identifier", name: "res", loc: { - start: {line: 1, column: 27}, - end: {line: 1, column: 30} + start: {line: 1, column: 26}, + end: {line: 1, column: 29} } }, loc: { - start: {line: 1, column: 0}, - end: {line: 1, column: 30} + start: {line: 1, column: 1}, + end: {line: 1, column: 29} } }, loc: { @@ -13826,9 +13826,11 @@ testFail("[v] += ary", "Assigning to rvalue (1:0)", {ecmaVersion: 6}); testFail("[2] = 42", "Assigning to rvalue (1:1)", {ecmaVersion: 6}); -testFail("({ obj:20 }) = 42", "Assigning to rvalue (1:7)", {ecmaVersion: 6}); +testFail("({ obj:20 }) = 42", "Assigning to rvalue (1:13)", {ecmaVersion: 6}); -testFail("( { get x() {} } ) = 0", "Unexpected token (1:8)", {ecmaVersion: 6}); +testFail("({ obj:20 } = 42)", "Assigning to rvalue (1:7)", {ecmaVersion: 6}); + +testFail("( { get x() {} } = 0 )", "Unexpected token (1:8)", {ecmaVersion: 6}); testFail("x \n is y", "Unexpected token (2:4)", {ecmaVersion: 6}); @@ -13848,9 +13850,9 @@ testFail("let default", "Unexpected token (1:4)", {ecmaVersion: 6}); testFail("const default", "Unexpected token (1:6)", {ecmaVersion: 6}); -testFail("\"use strict\"; ({ v: eval }) = obj", "Assigning to eval in strict mode (1:20)", {ecmaVersion: 6}); +testFail("\"use strict\"; ({ v: eval } = obj)", "Assigning to eval in strict mode (1:20)", {ecmaVersion: 6}); -testFail("\"use strict\"; ({ v: arguments }) = obj", "Assigning to arguments in strict mode (1:20)", {ecmaVersion: 6}); +testFail("\"use strict\"; ({ v: arguments } = obj)", "Assigning to arguments in strict mode (1:20)", {ecmaVersion: 6}); testFail("for (let x = 42 in list) process(x);", "Unexpected token (1:16)", {ecmaVersion: 6}); diff --git a/test/tests.js b/test/tests.js index 172eb1fb87..1037330068 100644 --- a/test/tests.js +++ b/test/tests.js @@ -403,7 +403,7 @@ test("(1 + 2 ) * 3", { preserveParens: true }); -testFail("(x) = 23", "Assigning to rvalue (1:0)", { preserveParens: true }); +testFail("(x) = 23", "Assigning to rvalue (1:4)"); test("x = []", { type: "Program", @@ -26883,7 +26883,7 @@ testFail("func() = 4", "Assigning to rvalue (1:0)"); testFail("(1 + 1) = 10", - "Assigning to rvalue (1:1)"); + "Assigning to rvalue (1:8)"); testFail("1++", "Assigning to rvalue (1:0)");