From df7fe80eb4bd7e266cca20d81c0ad6b49f3e25bb Mon Sep 17 00:00:00 2001 From: Ronen Amiel Date: Tue, 4 Feb 2025 21:14:49 +0200 Subject: [PATCH 1/3] handle accessor property with explicit-member-accessibility --- .../rules/explicit-member-accessibility.ts | 8 +- .../src/util/getMemberHeadLoc.ts | 2 + .../explicit-member-accessibility.test.ts | 94 +++++++++++++++++++ 3 files changed, 103 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/explicit-member-accessibility.ts b/packages/eslint-plugin/src/rules/explicit-member-accessibility.ts index cf1a0492e95c..d3e734c72b7c 100644 --- a/packages/eslint-plugin/src/rules/explicit-member-accessibility.ts +++ b/packages/eslint-plugin/src/rules/explicit-member-accessibility.ts @@ -196,8 +196,10 @@ export default createRule({ */ function findPublicKeyword( node: + | TSESTree.AccessorProperty | TSESTree.MethodDefinition | TSESTree.PropertyDefinition + | TSESTree.TSAbstractAccessorProperty | TSESTree.TSAbstractMethodDefinition | TSESTree.TSAbstractPropertyDefinition | TSESTree.TSParameterProperty, @@ -238,8 +240,10 @@ export default createRule({ */ function getMissingAccessibilitySuggestions( node: + | TSESTree.AccessorProperty | TSESTree.MethodDefinition | TSESTree.PropertyDefinition + | TSESTree.TSAbstractAccessorProperty | TSESTree.TSAbstractMethodDefinition | TSESTree.TSAbstractPropertyDefinition | TSESTree.TSParameterProperty, @@ -284,7 +288,9 @@ export default createRule({ */ function checkPropertyAccessibilityModifier( propertyDefinition: + | TSESTree.AccessorProperty | TSESTree.PropertyDefinition + | TSESTree.TSAbstractAccessorProperty | TSESTree.TSAbstractPropertyDefinition, ): void { if (propertyDefinition.key.type === AST_NODE_TYPES.PrivateIdentifier) { @@ -389,7 +395,7 @@ export default createRule({ return { 'MethodDefinition, TSAbstractMethodDefinition': checkMethodAccessibilityModifier, - 'PropertyDefinition, TSAbstractPropertyDefinition': + 'PropertyDefinition, TSAbstractPropertyDefinition, AccessorProperty, TSAbstractAccessorProperty': checkPropertyAccessibilityModifier, TSParameterProperty: checkParameterPropertyAccessibilityModifier, }; diff --git a/packages/eslint-plugin/src/util/getMemberHeadLoc.ts b/packages/eslint-plugin/src/util/getMemberHeadLoc.ts index d28058d45691..9949068539fe 100644 --- a/packages/eslint-plugin/src/util/getMemberHeadLoc.ts +++ b/packages/eslint-plugin/src/util/getMemberHeadLoc.ts @@ -30,8 +30,10 @@ import { export function getMemberHeadLoc( sourceCode: Readonly, node: + | TSESTree.AccessorProperty | TSESTree.MethodDefinition | TSESTree.PropertyDefinition + | TSESTree.TSAbstractAccessorProperty | TSESTree.TSAbstractMethodDefinition | TSESTree.TSAbstractPropertyDefinition, ): TSESTree.SourceLocation { diff --git a/packages/eslint-plugin/tests/rules/explicit-member-accessibility.test.ts b/packages/eslint-plugin/tests/rules/explicit-member-accessibility.test.ts index 133ce5671e21..8f67814d4ca8 100644 --- a/packages/eslint-plugin/tests/rules/explicit-member-accessibility.test.ts +++ b/packages/eslint-plugin/tests/rules/explicit-member-accessibility.test.ts @@ -1919,6 +1919,100 @@ abstract class SomeClass { }, { code: ` +class SomeClass { + accessor foo = 1; +} + `, + errors: [ + { + column: 3, + endColumn: 15, + endLine: 3, + line: 3, + messageId: 'missingAccessibility', + suggestions: [ + { + data: { type: 'public' }, + messageId: 'addExplicitAccessibility', + output: ` +class SomeClass { + public accessor foo = 1; +} + `, + }, + { + data: { type: 'private' }, + messageId: 'addExplicitAccessibility', + output: ` +class SomeClass { + private accessor foo = 1; +} + `, + }, + { + data: { type: 'protected' }, + messageId: 'addExplicitAccessibility', + output: ` +class SomeClass { + protected accessor foo = 1; +} + `, + }, + ], + }, + ], + options: [{ accessibility: 'explicit' }], + output: null, + }, + { + code: ` +abstract class SomeClass { + abstract accessor foo: string; +} + `, + errors: [ + { + column: 3, + endColumn: 24, + endLine: 3, + line: 3, + messageId: 'missingAccessibility', + suggestions: [ + { + data: { type: 'public' }, + messageId: 'addExplicitAccessibility', + output: ` +abstract class SomeClass { + public abstract accessor foo: string; +} + `, + }, + { + data: { type: 'private' }, + messageId: 'addExplicitAccessibility', + output: ` +abstract class SomeClass { + private abstract accessor foo: string; +} + `, + }, + { + data: { type: 'protected' }, + messageId: 'addExplicitAccessibility', + output: ` +abstract class SomeClass { + protected abstract accessor foo: string; +} + `, + }, + ], + }, + ], + options: [{ accessibility: 'explicit' }], + output: null, + }, + { + code: ` class DecoratedClass { constructor(@foo @bar() readonly arg: string) {} @foo @bar() x: string; From da894b43f73b7113748bd2327eb9a1d1b4bf32c9 Mon Sep 17 00:00:00 2001 From: Ronen Amiel Date: Thu, 6 Feb 2025 17:41:34 +0200 Subject: [PATCH 2/3] add valid tests --- .../rules/explicit-member-accessibility.test.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/tests/rules/explicit-member-accessibility.test.ts b/packages/eslint-plugin/tests/rules/explicit-member-accessibility.test.ts index 8f67814d4ca8..500f4676b554 100644 --- a/packages/eslint-plugin/tests/rules/explicit-member-accessibility.test.ts +++ b/packages/eslint-plugin/tests/rules/explicit-member-accessibility.test.ts @@ -308,7 +308,6 @@ class Test { `, options: [{ accessibility: 'no-public' }], }, - // private members { code: ` class Test { @@ -318,6 +317,20 @@ class Test { `, options: [{ accessibility: 'explicit' }], }, + { + code: ` +class Test { + private accessor foo = 1; +} + `, + }, + { + code: ` +abstract class Test { + private abstract accessor foo: number; +} + `, + }, ], invalid: [ { From 488caeed16e53c7f257807097596c6bf5f684919 Mon Sep 17 00:00:00 2001 From: Ronen Amiel Date: Thu, 6 Feb 2025 17:43:51 +0200 Subject: [PATCH 3/3] remove unnecessary output: null --- .../tests/rules/explicit-member-accessibility.test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/explicit-member-accessibility.test.ts b/packages/eslint-plugin/tests/rules/explicit-member-accessibility.test.ts index 500f4676b554..6aa2bf795749 100644 --- a/packages/eslint-plugin/tests/rules/explicit-member-accessibility.test.ts +++ b/packages/eslint-plugin/tests/rules/explicit-member-accessibility.test.ts @@ -1975,7 +1975,6 @@ class SomeClass { }, ], options: [{ accessibility: 'explicit' }], - output: null, }, { code: ` @@ -2022,7 +2021,6 @@ abstract class SomeClass { }, ], options: [{ accessibility: 'explicit' }], - output: null, }, { code: `