From 69bd50140f3ed6395d6a7c23fb3753511fa85740 Mon Sep 17 00:00:00 2001 From: YeonJuan Date: Fri, 2 Feb 2024 13:41:35 +0900 Subject: [PATCH] fix(eslint-plugin): [class-literal-property-style] allow getter when same key setter exists (#8277) --- .../src/rules/class-literal-property-style.ts | 24 ++++++++++- .../class-literal-property-style.test.ts | 42 +++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/src/rules/class-literal-property-style.ts b/packages/eslint-plugin/src/rules/class-literal-property-style.ts index ec5df76bb61..d2212e8e751 100644 --- a/packages/eslint-plugin/src/rules/class-literal-property-style.ts +++ b/packages/eslint-plugin/src/rules/class-literal-property-style.ts @@ -2,7 +2,7 @@ import type { TSESLint, TSESTree } from '@typescript-eslint/utils'; import { AST_NODE_TYPES } from '@typescript-eslint/utils'; import { getSourceCode } from '@typescript-eslint/utils/eslint-utils'; -import { createRule } from '../util'; +import { createRule, getStaticStringValue } from '../util'; type Options = ['fields' | 'getters']; type MessageIds = @@ -66,6 +66,12 @@ export default createRule({ }, defaultOptions: ['fields'], create(context, [style]) { + const sourceCode = getSourceCode(context); + + function getMethodName(node: TSESTree.MethodDefinition): string { + return getStaticStringValue(node.key) ?? sourceCode.getText(node.key); + } + return { ...(style === 'fields' && { MethodDefinition(node): void { @@ -89,6 +95,21 @@ export default createRule({ return; } + const name = getMethodName(node); + + if (node.parent.type === AST_NODE_TYPES.ClassBody) { + const hasDuplicateKeySetter = node.parent.body.some(element => { + return ( + element.type === AST_NODE_TYPES.MethodDefinition && + element.kind === 'set' && + getMethodName(element) === name + ); + }); + if (hasDuplicateKeySetter) { + return; + } + } + context.report({ node: node.key, messageId: 'preferFieldStyle', @@ -96,7 +117,6 @@ export default createRule({ { messageId: 'preferFieldStyleSuggestion', fix(fixer): TSESLint.RuleFix { - const sourceCode = getSourceCode(context); const name = sourceCode.getText(node.key); let text = ''; diff --git a/packages/eslint-plugin/tests/rules/class-literal-property-style.test.ts b/packages/eslint-plugin/tests/rules/class-literal-property-style.test.ts index 6eeda2a62fb..1959b1cdaa8 100644 --- a/packages/eslint-plugin/tests/rules/class-literal-property-style.test.ts +++ b/packages/eslint-plugin/tests/rules/class-literal-property-style.test.ts @@ -84,6 +84,48 @@ abstract class Mx { \`; } `, + ` + class Mx { + set p1(val) {} + get p1() { + return ''; + } + } + `, + ` + let p1 = 'p1'; + class Mx { + set [p1](val) {} + get [p1]() { + return ''; + } + } + `, + ` + let p1 = 'p1'; + class Mx { + set [/* before set */ p1 /* after set */](val) {} + get [/* before get */ p1 /* after get */]() { + return ''; + } + } + `, + ` + class Mx { + set ['foo'](val) {} + get foo() { + return ''; + } + set bar(val) {} + get ['bar']() { + return ''; + } + set ['baz'](val) {} + get baz() { + return ''; + } + } + `, { code: ` class Mx {