Skip to content

Commit

Permalink
[[FIX]] Expand forms accepted in dstr. assignment
Browse files Browse the repository at this point in the history
Align the parser's expectations for assignment targets in destructuring
patterns with its expectations in other assignment expressions.
  • Loading branch information
jugglinmike committed Feb 8, 2016
1 parent fe559ed commit 8bbd537
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 11 deletions.
6 changes: 1 addition & 5 deletions src/jshint.js
Original file line number Diff line number Diff line change
Expand Up @@ -3366,11 +3366,7 @@ var JSHINT = (function() {
var is_rest = checkPunctuator(state.tokens.next, "...");

if (isAssignment) {
var identifierToken = is_rest ? peek(0) : state.tokens.next;
if (!identifierToken.identifier) {
warning("E030", identifierToken, identifierToken.value);
}
var assignTarget = expression(155);
var assignTarget = expression(20);
if (assignTarget) {
checkLeftSideAssign(assignTarget);

Expand Down
52 changes: 46 additions & 6 deletions tests/unit/parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -1853,7 +1853,6 @@ exports["destructuring globals with syntax error"] = function (test) {
];

TestRun(test)
.addError(3, "Expected an identifier and instead saw '1'.")
.addError(3, "Bad assignment.")
.addError(4, "Expected ',' and instead saw ';'.")
.addError(5, "Expected ']' to match '[' from line 5 and instead saw ';'.")
Expand All @@ -1864,11 +1863,8 @@ exports["destructuring globals with syntax error"] = function (test) {
.addError(5, "Expected an assignment or function call and instead saw an expression.")
.addError(6, "Bad assignment.")
.addError(7, "Expected ',' and instead saw '.'.")
.addError(8, "Expected ',' and instead saw '('.")
.addError(8, "Expected an identifier and instead saw ')'.")
.addError(8, "Expected an identifier and instead saw ')'.")
.addError(9, "Expected ',' and instead saw '('.")
.addError(9, "Expected an identifier and instead saw ')'.")
.addError(8, "Bad assignment.")
.addError(9, "Bad assignment.")
.addError(2, "'z' is not defined.")
.test(code, {esnext: true, unused: true, undef: true});

Expand Down Expand Up @@ -2026,6 +2022,50 @@ exports["destructuring assignment default values"] = function (test) {
test.done();
};

exports["destructuring assignment of valid simple assignment targets"] = function (test) {
TestRun(test)
.test([
"[ foo().attr ] = [];",
"[ function() {}.attr ] = [];",
"[ function() { return {}; }().attr ] = [];",
"[ new Ctor().attr ] = [];"
], { esversion: 6 });

TestRun(test)
.addError(1, "Bad assignment.")
.test("[ foo() ] = [];", { esversion: 6 });

TestRun(test)
.addError(1, "Bad assignment.")
.test("({ x: foo() } = {});", { esversion: 6 });

TestRun(test)
.addError(1, "Bad assignment.")
.test("[ true ? x : y ] = [];", { esversion: 6 });

TestRun(test)
.addError(1, "Bad assignment.")
.test("({ x: true ? x : y } = {});", { esversion: 6 });

TestRun(test)
.addError(1, "Bad assignment.")
.test("[ x || y ] = [];", { esversion: 6 });

TestRun(test)
.addError(1, "Bad assignment.")
.test("({ x: x || y } = {});", { esversion: 6 });

TestRun(test)
.addError(1, "Bad assignment.")
.test("[ new Ctor() ] = [];", { esversion: 6 });

TestRun(test)
.addError(1, "Bad assignment.")
.test("({ x: new Ctor() } = {});", { esversion: 6 });

test.done();
};

exports["non-identifier PropertyNames in object destructuring"] = function (test) {
var code = [
"var { ['x' + 2]: a = 3, 0: b } = { x2: 1, 0: 2 };",
Expand Down

0 comments on commit 8bbd537

Please sign in to comment.