From f89840747316ea9ba764bdc684a920198838685f Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 28 Sep 2025 22:05:11 +0800 Subject: [PATCH] fix(typescript-estree): forbid `abstract` modifier in object methods --- .../fixtures/_error_/abstract-method/fixture.ts | 1 + .../abstract-method/snapshots/1-TSESTree-Error.shot | 7 +++++++ .../abstract-method/snapshots/2-Babel-Error.shot | 8 ++++++++ .../abstract-method/snapshots/3-Alignment-Error.shot | 4 ++++ packages/typescript-estree/src/convert.ts | 12 ++++++++++++ 5 files changed, 32 insertions(+) create mode 100644 packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/fixture.ts create mode 100644 packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/snapshots/1-TSESTree-Error.shot create mode 100644 packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/snapshots/2-Babel-Error.shot create mode 100644 packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/snapshots/3-Alignment-Error.shot diff --git a/packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/fixture.ts b/packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/fixture.ts new file mode 100644 index 000000000000..8d7ba0694b01 --- /dev/null +++ b/packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/fixture.ts @@ -0,0 +1 @@ +({abstract method(){}}) diff --git a/packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/snapshots/1-TSESTree-Error.shot b/packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/snapshots/1-TSESTree-Error.shot new file mode 100644 index 000000000000..dc431453e57a --- /dev/null +++ b/packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/snapshots/1-TSESTree-Error.shot @@ -0,0 +1,7 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`AST Fixtures > expression > ObjectExpression > _error_ > abstract-method > TSESTree - Error`] +TSError +> 1 | ({abstract method(){}}) + | ^^^^^^^^ 'abstract' modifier cannot be used here. + 2 | diff --git a/packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/snapshots/2-Babel-Error.shot b/packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/snapshots/2-Babel-Error.shot new file mode 100644 index 000000000000..b186e7ceed16 --- /dev/null +++ b/packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/snapshots/2-Babel-Error.shot @@ -0,0 +1,8 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`AST Fixtures > expression > ObjectExpression > _error_ > abstract-method > Babel - Error`] +BabelError +> 1 | ({abstract method(){}}) + | ^ Unexpected token, expected "," (1:11) + 2 | + diff --git a/packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/snapshots/3-Alignment-Error.shot b/packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/snapshots/3-Alignment-Error.shot new file mode 100644 index 000000000000..2285aeb1e136 --- /dev/null +++ b/packages/ast-spec/src/expression/ObjectExpression/fixtures/_error_/abstract-method/snapshots/3-Alignment-Error.shot @@ -0,0 +1,4 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`AST Fixtures > expression > ObjectExpression > _error_ > abstract-method > Error Alignment`] +Both errored diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index bec26fede610..23ef63e6a94e 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -398,6 +398,18 @@ export class Converter { ); } } + + // TODO: There are more cases in `checkGrammarObjectLiteralExpression` in typescript + if ( + modifier.kind === SyntaxKind.AbstractKeyword && + node.kind === SyntaxKind.MethodDeclaration && + node.parent.kind === SyntaxKind.ObjectLiteralExpression + ) { + this.#throwError( + modifier, + `'${ts.tokenToString(modifier.kind)}' modifier cannot be used here.`, + ); + } } }