From c64afed9251a8e1508d1ce93668eec2f0b34636b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=80=E1=85=B5=E1=86=B7=E1=84=89=E1=85=A1=E1=86=BC?= =?UTF-8?q?=E1=84=83=E1=85=AE?= Date: Wed, 27 Nov 2024 00:03:13 +0900 Subject: [PATCH] feat: super logic --- .../eslint-plugin/src/rules/no-deprecated.ts | 17 ++++-- .../tests/rules/no-deprecated.test.ts | 52 ++++++++++++++++++- 2 files changed, 64 insertions(+), 5 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-deprecated.ts b/packages/eslint-plugin/src/rules/no-deprecated.ts index 4ee51d4a3835..bf0d80889ceb 100644 --- a/packages/eslint-plugin/src/rules/no-deprecated.ts +++ b/packages/eslint-plugin/src/rules/no-deprecated.ts @@ -6,7 +6,10 @@ import * as ts from 'typescript'; import { createRule, getParserServices, nullThrows } from '../util'; -type IdentifierLike = TSESTree.Identifier | TSESTree.JSXIdentifier; +type IdentifierLike = + | TSESTree.Identifier + | TSESTree.JSXIdentifier + | TSESTree.Super; export default createRule({ name: 'no-deprecated', @@ -276,7 +279,10 @@ export default createRule({ if (callLikeNode) { return getCallLikeDeprecation(callLikeNode); } - if (node.parent.type === AST_NODE_TYPES.Property) { + if ( + node.parent.type === AST_NODE_TYPES.Property && + node.type !== AST_NODE_TYPES.Super + ) { return getJsDocDeprecation( services.getTypeAtLocation(node.parent.parent).getProperty(node.name), ); @@ -297,15 +303,17 @@ export default createRule({ return; } + const name = node.type === AST_NODE_TYPES.Super ? 'super' : node.name; + context.report({ ...(reason ? { messageId: 'deprecatedWithReason', - data: { name: node.name, reason }, + data: { name, reason }, } : { messageId: 'deprecated', - data: { name: node.name }, + data: { name }, }), node, }); @@ -318,6 +326,7 @@ export default createRule({ checkIdentifier(node); } }, + Super: checkIdentifier, }; }, }); diff --git a/packages/eslint-plugin/tests/rules/no-deprecated.test.ts b/packages/eslint-plugin/tests/rules/no-deprecated.test.ts index ba4e27555657..8c99d8e161a2 100644 --- a/packages/eslint-plugin/tests/rules/no-deprecated.test.ts +++ b/packages/eslint-plugin/tests/rules/no-deprecated.test.ts @@ -2465,7 +2465,7 @@ ruleTester.run('no-deprecated', rule, { code: ` /** @deprecated */ declare function decorator(constructor: Function); - + @decorator export class Foo {} `, @@ -2500,5 +2500,55 @@ ruleTester.run('no-deprecated', rule, { }, ], }, + { + code: ` +class A { + /** @deprecated */ + constructor() {} +} + +class B extends A { + constructor() { + /** should report but does not */ + super(); + } +} + `, + errors: [ + { + column: 5, + data: { name: 'super' }, + endColumn: 10, + endLine: 10, + line: 10, + messageId: 'deprecated', + }, + ], + }, + { + code: ` +class A { + /** @deprecated test reason*/ + constructor() {} +} + +class B extends A { + constructor() { + /** should report but does not */ + super(); + } +} + `, + errors: [ + { + column: 5, + data: { name: 'super', reason: 'test reason' }, + endColumn: 10, + endLine: 10, + line: 10, + messageId: 'deprecatedWithReason', + }, + ], + }, ], });