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..6aa2bf795749 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: [ { @@ -1919,6 +1932,98 @@ 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' }], + }, + { + 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' }], + }, + { + code: ` class DecoratedClass { constructor(@foo @bar() readonly arg: string) {} @foo @bar() x: string;