Throw errors for invalid TSEmptyBodyFunctionExpression node (#12982)

This commit is contained in:
fisker Cheung authored and GitHub committed 2022-06-14 12:33:44 +08:00
1 parent 1bec824556
commit d2bcaea121
6 files changed
+195 -10

No files matched your search

+15
View File
@@ -0,0 +1,15 @@
#### Stop parsing invalid code (#12982 by @fisker)
<!-- prettier-ignore -->
```tsx
// Input
const object = ({ methodName() });
// Prettier stable
const object = { methodName(); };
// Prettier main
SyntaxError: Unexpected token. (1:29)
> 1 | const object = ({ methodName() });
| ^^
```
@@ -6,6 +6,7 @@ const isTypeCastComment = require("../../utils/is-type-cast-comment.js");
const getLast = require("../../../utils/get-last.js");
const visitNode = require("./visit-node.js");
const { throwErrorForInvalidNodes } = require("./typescript.js");
const throwSyntaxError = require("./throw-syntax-error.js");
function postprocess(ast, options) {
if (
@@ -102,6 +103,20 @@ function postprocess(ast, options) {
};
}
break;
case "ObjectExpression":
// #12963
if (options.parser === "typescript") {
const invalidProperty = node.properties.find(
(property) =>
property.type === "Property" &&
property.value.type === "TSEmptyBodyFunctionExpression"
);
if (invalidProperty) {
throwSyntaxError(invalidProperty.value, "Unexpected token.");
}
}
break;
case "SequenceExpression": {
// Babel (unlike other parsers) includes spaces and comments in the range. Let's unify this.
const lastExpression = getLast(node.expressions);
@@ -0,0 +1,12 @@
"use strict";
const createError = require("../../../common/parser-create-error.js");
function throwSyntaxError(node, message) {
const { start, end } = node.loc;
throw createError(message, {
start: { line: start.line, column: start.column + 1 },
end: { line: end.line, column: end.column + 1 },
});
}
module.exports = throwSyntaxError;
@@ -1,15 +1,7 @@
"use strict";
const createError = require("../../../common/parser-create-error.js");
const visitNode = require("./visit-node.js");
function throwSyntaxError(node, message) {
const { start, end } = node.loc;
throw createError(message, {
start: { line: start.line, column: start.column + 1 },
end: { line: end.line, column: end.column + 1 },
});
}
const throwSyntaxError = require("./throw-syntax-error.js");
// Invalid decorators are removed since `@typescript-eslint/typescript-estree` v4
// https://github.com/typescript-eslint/typescript-eslint/pull/2375
@@ -73,6 +65,7 @@ function throwErrorForInvalidNodes(ast, options) {
if (esTreeNode !== node) {
return;
}
throwErrorForInvalidDecorator(tsNode, esTreeNode, tsNodeToESTreeNodeMap);
throwErrorForInvalidAbstractProperty(tsNode, esTreeNode);
});
@@ -156,92 +156,236 @@ exports[`snippet: #1 [typescript] format 1`] = `
| ^"
`;
exports[`snippet: #2 [acorn] format 1`] = `
"Unexpected token (1:13)
> 1 | ({ method() })
| ^"
`;
exports[`snippet: #2 [babel] format 1`] = `
"Unexpected token, expected "{" (1:13)
> 1 | ({ method() })
| ^"
`;
exports[`snippet: #2 [babel] format 2`] = `
"Invalid parenthesized assignment pattern. (1:1)
> 1 | (a = 1) = 2
| ^"
`;
exports[`snippet: #2 [babel-flow] format 1`] = `
"Unexpected token, expected "{" (1:13)
> 1 | ({ method() })
| ^"
`;
exports[`snippet: #2 [babel-flow] format 2`] = `
"Invalid parenthesized assignment pattern. (1:1)
> 1 | (a = 1) = 2
| ^"
`;
exports[`snippet: #2 [babel-ts] format 1`] = `
"Unexpected token, expected "{" (1:13)
> 1 | ({ method() })
| ^"
`;
exports[`snippet: #2 [babel-ts] format 2`] = `
"Invalid parenthesized assignment pattern. (1:1)
> 1 | (a = 1) = 2
| ^"
`;
exports[`snippet: #2 [espree] format 1`] = `
"Unexpected token } (1:13)
> 1 | ({ method() })
| ^"
`;
exports[`snippet: #2 [flow] format 1`] = `
"Unexpected token \`}\`, expected the token \`{\` (1:13)
> 1 | ({ method() })
| ^"
`;
exports[`snippet: #2 [flow] format 2`] = `
"Invalid left-hand side in assignment (1:2)
> 1 | (a = 1) = 2
| ^^^^^"
`;
exports[`snippet: #2 [meriyah] format 1`] = `
"Expected '{' (1:13)
> 1 | ({ method() })
| ^"
`;
exports[`snippet: #2 [meriyah] format 2`] = `
"Invalid left-hand side in assignment (1:9)
> 1 | (a = 1) = 2
| ^"
`;
exports[`snippet: #2 [typescript] format 1`] = `
"Unexpected token. (1:10)
> 1 | ({ method() })
| ^^"
`;
exports[`snippet: #3 [acorn] format 1`] = `
"Unexpected token (1:15)
> 1 | ({ method({}) })
| ^"
`;
exports[`snippet: #3 [babel] format 1`] = `
"Unexpected token, expected "{" (1:15)
> 1 | ({ method({}) })
| ^"
`;
exports[`snippet: #3 [babel] format 2`] = `
"Invalid parenthesized assignment pattern. (1:1)
> 1 | (a += b) = 1
| ^"
`;
exports[`snippet: #3 [babel-flow] format 1`] = `
"Unexpected token, expected "{" (1:15)
> 1 | ({ method({}) })
| ^"
`;
exports[`snippet: #3 [babel-flow] format 2`] = `
"Invalid parenthesized assignment pattern. (1:1)
> 1 | (a += b) = 1
| ^"
`;
exports[`snippet: #3 [babel-ts] format 1`] = `
"Unexpected token, expected "{" (1:15)
> 1 | ({ method({}) })
| ^"
`;
exports[`snippet: #3 [babel-ts] format 2`] = `
"Invalid parenthesized assignment pattern. (1:1)
> 1 | (a += b) = 1
| ^"
`;
exports[`snippet: #3 [espree] format 1`] = `
"Unexpected token } (1:15)
> 1 | ({ method({}) })
| ^"
`;
exports[`snippet: #3 [flow] format 1`] = `
"Unexpected token \`}\`, expected the token \`{\` (1:15)
> 1 | ({ method({}) })
| ^"
`;
exports[`snippet: #3 [flow] format 2`] = `
"Invalid left-hand side in assignment (1:2)
> 1 | (a += b) = 1
| ^^^^^^"
`;
exports[`snippet: #3 [meriyah] format 1`] = `
"Expected '{' (1:15)
> 1 | ({ method({}) })
| ^"
`;
exports[`snippet: #3 [meriyah] format 2`] = `
"Invalid left-hand side in assignment (1:10)
> 1 | (a += b) = 1
| ^"
`;
exports[`snippet: #3 [typescript] format 1`] = `
"Unexpected token. (1:10)
> 1 | ({ method({}) })
| ^^^^"
`;
exports[`snippet: #4 [acorn] format 1`] = `
"Unexpected token (1:23)
> 1 | ({ method(parameter,) })
| ^"
`;
exports[`snippet: #4 [babel] format 1`] = `
"Unexpected token, expected "{" (1:23)
> 1 | ({ method(parameter,) })
| ^"
`;
exports[`snippet: #4 [babel] format 2`] = `
"Invalid left-hand side in parenthesized expression. (1:2)
> 1 | (a = b) += 1
| ^"
`;
exports[`snippet: #4 [babel-flow] format 1`] = `
"Unexpected token, expected "{" (1:23)
> 1 | ({ method(parameter,) })
| ^"
`;
exports[`snippet: #4 [babel-flow] format 2`] = `
"Invalid left-hand side in parenthesized expression. (1:2)
> 1 | (a = b) += 1
| ^"
`;
exports[`snippet: #4 [babel-ts] format 1`] = `
"Unexpected token, expected "{" (1:23)
> 1 | ({ method(parameter,) })
| ^"
`;
exports[`snippet: #4 [babel-ts] format 2`] = `
"Invalid left-hand side in parenthesized expression. (1:2)
> 1 | (a = b) += 1
| ^"
`;
exports[`snippet: #4 [espree] format 1`] = `
"Unexpected token } (1:23)
> 1 | ({ method(parameter,) })
| ^"
`;
exports[`snippet: #4 [flow] format 1`] = `
"Unexpected token \`}\`, expected the token \`{\` (1:23)
> 1 | ({ method(parameter,) })
| ^"
`;
exports[`snippet: #4 [flow] format 2`] = `
"Invalid left-hand side in assignment (1:2)
> 1 | (a = b) += 1
| ^^^^^"
`;
exports[`snippet: #4 [meriyah] format 1`] = `
"Expected '{' (1:23)
> 1 | ({ method(parameter,) })
| ^"
`;
exports[`snippet: #4 [meriyah] format 2`] = `
"Invalid left-hand side in assignment (1:10)
> 1 | (a = b) += 1
| ^"
`;
exports[`snippet: #4 [typescript] format 1`] = `
"Unexpected token. (1:10)
> 1 | ({ method(parameter,) })
| ^^^^^^^^^^^^"
`;
@@ -1,7 +1,13 @@
run_spec(
{
dirname: __dirname,
snippets: ["for each (a in b) {}", "class switch() {}"],
snippets: [
"for each (a in b) {}",
"class switch() {}",
"({ method() })",
"({ method({}) })",
"({ method(parameter,) })",
],
},
[
"babel",