Skip to content

Commit

Permalink
Throw errors for invalid left-hand side assignment (#10416)
Browse files Browse the repository at this point in the history
* Throw errors for invalid left-hand side assignment

* Fix tests

* FIx tests

* Add tests from babel/babel#12933
  • Loading branch information
fisker committed Mar 29, 2021
1 parent 4407d7b commit 24d39a9
Show file tree
Hide file tree
Showing 12 changed files with 248 additions and 38 deletions.
6 changes: 0 additions & 6 deletions src/language-js/parser-babel.js
Expand Up @@ -150,11 +150,6 @@ const allowedMessages = new Set([
"'with' in strict mode",
"Legacy octal literals are not allowed in strict mode",

"Invalid left-hand side in parenthesized expression",
"Invalid left-hand side in assignment expression",
"Invalid left-hand side in postfix operation",
"Invalid left-hand side in prefix operation",

"Type argument list cannot be empty.",
"Type parameter list cannot be empty.",
"Type parameters cannot appear on a constructor declaration.",
Expand Down Expand Up @@ -185,7 +180,6 @@ const allowedMessages = new Set([
"Unexpected trailing comma after rest element",
"Decorators cannot be used to decorate parameters",
"Unterminated JSX contents",
"Invalid parenthesized assignment pattern",
'Unexpected token, expected "}"',
"Unexpected token :",
"Unexpected reserved word 'package'",
Expand Down
28 changes: 0 additions & 28 deletions tests/js/logical-assignment/__snapshots__/jsfmt.spec.js.snap
@@ -1,33 +1,5 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`invalid.js [espree] format 1`] = `
"Assigning to rvalue (1:21)
> 1 | c.foo.bar().baz ??= result.foo.bar().baz(a.baz) &&= result.baz;
| ^
2 |"
`;

exports[`invalid.js [meriyah] format 1`] = `
"[1:51]: Invalid left-hand side in assignment (1:51)
> 1 | c.foo.bar().baz ??= result.foo.bar().baz(a.baz) &&= result.baz;
| ^
2 |"
`;

exports[`invalid.js format 1`] = `
====================================options=====================================
parsers: ["babel", "typescript"]
printWidth: 80
| printWidth
=====================================input======================================
c.foo.bar().baz ??= result.foo.bar().baz(a.baz) &&= result.baz;
=====================================output=====================================
c.foo.bar().baz ??= result.foo.bar().baz(a.baz) &&= result.baz;
================================================================================
`;

exports[`logical-assignment.js format 1`] = `
====================================options=====================================
parsers: ["babel", "typescript"]
Expand Down
1 change: 0 additions & 1 deletion tests/js/logical-assignment/invalid.js

This file was deleted.

4 changes: 1 addition & 3 deletions tests/js/logical-assignment/jsfmt.spec.js
@@ -1,3 +1 @@
run_spec(__dirname, ["babel", "typescript"], {
errors: { espree: ["invalid.js"], meriyah: ["invalid.js"] },
});
run_spec(__dirname, ["babel", "typescript"]);
150 changes: 150 additions & 0 deletions tests/misc/errors/invalid/__snapshots__/jsfmt.spec.js.snap
Expand Up @@ -6,18 +6,36 @@ exports[`snippet: #0 [babel] format 1`] = `
| ^"
`;

exports[`snippet: #0 [babel] format 2`] = `
"Invalid parenthesized assignment pattern (1:1)
> 1 | (a = b) = 1
| ^"
`;

exports[`snippet: #0 [babel-flow] format 1`] = `
"Unexpected token, expected \\"(\\" (1:5)
> 1 | for each (a in b) {}
| ^"
`;

exports[`snippet: #0 [babel-flow] format 2`] = `
"Invalid parenthesized assignment pattern (1:1)
> 1 | (a = b) = 1
| ^"
`;

exports[`snippet: #0 [babel-ts] format 1`] = `
"Unexpected token, expected \\"(\\" (1:5)
> 1 | for each (a in b) {}
| ^"
`;

exports[`snippet: #0 [babel-ts] format 2`] = `
"Invalid parenthesized assignment pattern (1:1)
> 1 | (a = b) = 1
| ^"
`;

exports[`snippet: #0 [espree] format 1`] = `
"Unexpected token each (1:5)
> 1 | for each (a in b) {}
Expand All @@ -30,12 +48,24 @@ exports[`snippet: #0 [flow] format 1`] = `
| ^^^^"
`;

exports[`snippet: #0 [flow] format 2`] = `
"Invalid left-hand side in assignment (1:2)
> 1 | (a = b) = 1
| ^^^^^"
`;

exports[`snippet: #0 [meriyah] format 1`] = `
"[1:8]: Expected '(' (1:8)
> 1 | for each (a in b) {}
| ^"
`;

exports[`snippet: #0 [meriyah] format 2`] = `
"[1:9]: Invalid left-hand side in assignment (1:9)
> 1 | (a = b) = 1
| ^"
`;

exports[`snippet: #0 [typescript] format 1`] = `
"'(' expected. (1:5)
> 1 | for each (a in b) {}
Expand All @@ -48,18 +78,36 @@ exports[`snippet: #1 [babel] format 1`] = `
| ^"
`;

exports[`snippet: #1 [babel] format 2`] = `
"Invalid left-hand side in assignment expression (1:5)
> 1 | a = 1 = 2
| ^"
`;

exports[`snippet: #1 [babel-flow] format 1`] = `
"A class name is required (1:7)
> 1 | class switch() {}
| ^"
`;

exports[`snippet: #1 [babel-flow] format 2`] = `
"Invalid left-hand side in assignment expression (1:5)
> 1 | a = 1 = 2
| ^"
`;

exports[`snippet: #1 [babel-ts] format 1`] = `
"A class name is required (1:7)
> 1 | class switch() {}
| ^"
`;

exports[`snippet: #1 [babel-ts] format 2`] = `
"Invalid left-hand side in assignment expression (1:5)
> 1 | a = 1 = 2
| ^"
`;

exports[`snippet: #1 [espree] format 1`] = `
"Unexpected token switch (1:7)
> 1 | class switch() {}
Expand All @@ -72,14 +120,116 @@ exports[`snippet: #1 [flow] format 1`] = `
| ^^^^^^"
`;

exports[`snippet: #1 [flow] format 2`] = `
"Invalid left-hand side in assignment (1:5)
> 1 | a = 1 = 2
| ^"
`;

exports[`snippet: #1 [meriyah] format 1`] = `
"[1:12]: Unexpected strict mode reserved word (1:12)
> 1 | class switch() {}
| ^"
`;

exports[`snippet: #1 [meriyah] format 2`] = `
"[1:7]: Invalid left-hand side in assignment (1:7)
> 1 | a = 1 = 2
| ^"
`;

exports[`snippet: #1 [typescript] format 1`] = `
"'{' expected. (1:7)
> 1 | class switch() {}
| ^"
`;
exports[`snippet: #2 [babel] format 1`] = `
"Invalid parenthesized assignment pattern (1:1)
> 1 | (a = 1) = 2
| ^"
`;
exports[`snippet: #2 [babel-flow] format 1`] = `
"Invalid parenthesized assignment pattern (1:1)
> 1 | (a = 1) = 2
| ^"
`;
exports[`snippet: #2 [babel-ts] format 1`] = `
"Invalid parenthesized assignment pattern (1:1)
> 1 | (a = 1) = 2
| ^"
`;
exports[`snippet: #2 [flow] format 1`] = `
"Invalid left-hand side in assignment (1:2)
> 1 | (a = 1) = 2
| ^^^^^"
`;
exports[`snippet: #2 [meriyah] format 1`] = `
"[1:9]: Invalid left-hand side in assignment (1:9)
> 1 | (a = 1) = 2
| ^"
`;
exports[`snippet: #3 [babel] format 1`] = `
"Invalid parenthesized assignment pattern (1:1)
> 1 | (a += b) = 1
| ^"
`;
exports[`snippet: #3 [babel-flow] format 1`] = `
"Invalid parenthesized assignment pattern (1:1)
> 1 | (a += b) = 1
| ^"
`;
exports[`snippet: #3 [babel-ts] format 1`] = `
"Invalid parenthesized assignment pattern (1:1)
> 1 | (a += b) = 1
| ^"
`;
exports[`snippet: #3 [flow] format 1`] = `
"Invalid left-hand side in assignment (1:2)
> 1 | (a += b) = 1
| ^^^^^^"
`;
exports[`snippet: #3 [meriyah] format 1`] = `
"[1:10]: Invalid left-hand side in assignment (1:10)
> 1 | (a += b) = 1
| ^"
`;
exports[`snippet: #4 [babel] format 1`] = `
"Invalid left-hand side in parenthesized expression (1:2)
> 1 | (a = b) += 1
| ^"
`;
exports[`snippet: #4 [babel-flow] format 1`] = `
"Invalid left-hand side in parenthesized expression (1:2)
> 1 | (a = b) += 1
| ^"
`;
exports[`snippet: #4 [babel-ts] format 1`] = `
"Invalid left-hand side in parenthesized expression (1:2)
> 1 | (a = b) += 1
| ^"
`;
exports[`snippet: #4 [flow] format 1`] = `
"Invalid left-hand side in assignment (1:2)
> 1 | (a = b) += 1
| ^^^^^"
`;
exports[`snippet: #4 [meriyah] format 1`] = `
"[1:10]: Invalid left-hand side in assignment (1:10)
> 1 | (a = b) += 1
| ^"
`;
23 changes: 23 additions & 0 deletions tests/misc/errors/invalid/jsfmt.spec.js
Expand Up @@ -5,3 +5,26 @@ run_spec(
},
["babel", "flow", "typescript", "babel-flow", "babel-ts", "espree", "meriyah"]
);

run_spec(
{
dirname: __dirname,
snippets: [
"(a = b) = 1",
"a = 1 = 2",
"(a = 1) = 2",
"(a += b) = 1",
"(a = b) += 1",
],
},
[
"babel",
"flow",
// "typescript",
"babel-flow",
"babel-ts",
// https://github.com/eslint/espree/issues/470
// "espree",
"meriyah",
]
);
25 changes: 25 additions & 0 deletions tests/misc/errors/js/assignment/__snapshots__/jsfmt.spec.js.snap
@@ -0,0 +1,25 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`snippet: #0 [babel] format 1`] = `
"Invalid parenthesized assignment pattern (1:1)
> 1 | ({}) = x;
| ^"
`;

exports[`snippet: #0 [babel-ts] format 1`] = `
"Invalid parenthesized assignment pattern (1:1)
> 1 | ({}) = x;
| ^"
`;

exports[`snippet: #0 [espree] format 1`] = `
"Parenthesized pattern (1:1)
> 1 | ({}) = x;
| ^"
`;

exports[`snippet: #0 [meriyah] format 1`] = `
"[1:6]: Invalid left-hand side in assignment (1:6)
> 1 | ({}) = x;
| ^"
`;
7 changes: 7 additions & 0 deletions tests/misc/errors/js/assignment/jsfmt.spec.js
@@ -0,0 +1,7 @@
run_spec(
{
dirname: __dirname,
snippets: ["({}) = x;"],
},
["babel", "babel-ts", "espree", "meriyah"]
);
24 changes: 24 additions & 0 deletions tests/typescript/assignment/__snapshots__/jsfmt.spec.js.snap
Expand Up @@ -179,3 +179,27 @@ const firestorePersonallyIdentifiablePaths: Array<Collections.Users.Entity> =
================================================================================
`;
exports[`parenthesized.ts format 1`] = `
====================================options=====================================
parsers: ["typescript"]
printWidth: 80
| printWidth
=====================================input======================================
// https://github.com/babel/babel/pull/12933/files
(<number>x) = null;
(x!) = null;
(a as any) = null;
(a as number) = 42;
((a as any) as string) = null;
=====================================output=====================================
// https://github.com/babel/babel/pull/12933/files
(<number>x) = null;
x! = null;
(a as any) = null;
(a as number) = 42;
((a as any) as string) = null;
================================================================================
`;
6 changes: 6 additions & 0 deletions tests/typescript/assignment/parenthesized.ts
@@ -0,0 +1,6 @@
// https://github.com/babel/babel/pull/12933/files
(<number>x) = null;
(x!) = null;
(a as any) = null;
(a as number) = 42;
((a as any) as string) = null;
11 changes: 11 additions & 0 deletions tests/typescript/compiler/__snapshots__/jsfmt.spec.js.snap
Expand Up @@ -325,6 +325,17 @@ module T.U {
================================================================================
`;
exports[`decrementAndIncrementOperators.ts [babel-ts] format 1`] = `
"Invalid left-hand side in postfix operation (4:1)
2 |
3 | // errors
> 4 | 1 ++;
| ^
5 |
6 | (1)++;
7 | (1)--;"
`;
exports[`decrementAndIncrementOperators.ts format 1`] = `
====================================options=====================================
parsers: ["typescript"]
Expand Down
1 change: 1 addition & 0 deletions tests/typescript/compiler/jsfmt.spec.js
Expand Up @@ -3,6 +3,7 @@ run_spec(__dirname, ["typescript"], {
"babel-ts": [
"downlevelLetConst1.ts",
"errorOnInitializerInInterfaceProperty.ts",
"decrementAndIncrementOperators.ts",
],
},
});

0 comments on commit 24d39a9

Please sign in to comment.