diff --git a/packages/eslint-plugin/src/rules/adjacent-overload-signatures.ts b/packages/eslint-plugin/src/rules/adjacent-overload-signatures.ts index 6f3f31c9c6e..a72bd186e29 100644 --- a/packages/eslint-plugin/src/rules/adjacent-overload-signatures.ts +++ b/packages/eslint-plugin/src/rules/adjacent-overload-signatures.ts @@ -55,13 +55,13 @@ export default util.createRule({ case AST_NODE_TYPES.FunctionDeclaration: return member.id && member.id.name; case AST_NODE_TYPES.TSMethodSignature: - return util.getNameFromPropertyName(member.key); + return util.getNameFromMember(member, sourceCode); case AST_NODE_TYPES.TSCallSignatureDeclaration: return 'call'; case AST_NODE_TYPES.TSConstructSignatureDeclaration: return 'new'; case AST_NODE_TYPES.MethodDefinition: - return util.getNameFromClassMember(member, sourceCode); + return util.getNameFromMember(member, sourceCode); } return null; diff --git a/packages/eslint-plugin/src/rules/explicit-member-accessibility.ts b/packages/eslint-plugin/src/rules/explicit-member-accessibility.ts index 3d44d0b61ac..fe8c38c0341 100644 --- a/packages/eslint-plugin/src/rules/explicit-member-accessibility.ts +++ b/packages/eslint-plugin/src/rules/explicit-member-accessibility.ts @@ -125,10 +125,7 @@ export default util.createRule({ break; } - const methodName = util.getNameFromClassMember( - methodDefinition, - sourceCode, - ); + const methodName = util.getNameFromMember(methodDefinition, sourceCode); if (check === 'off' || ignoredMethodNames.has(methodName)) { return; @@ -163,7 +160,7 @@ export default util.createRule({ ): void { const nodeType = 'class property'; - const propertyName = util.getNameFromPropertyName(classProperty.key); + const propertyName = util.getNameFromMember(classProperty, sourceCode); if ( propCheck === 'no-public' && classProperty.accessibility === 'public' diff --git a/packages/eslint-plugin/src/rules/member-naming.ts b/packages/eslint-plugin/src/rules/member-naming.ts index d850ef69060..f2e4567dcb4 100644 --- a/packages/eslint-plugin/src/rules/member-naming.ts +++ b/packages/eslint-plugin/src/rules/member-naming.ts @@ -99,7 +99,7 @@ export default util.createRule({ validate( node.key, - util.getNameFromClassMember(node, sourceCode), + util.getNameFromMember(node, sourceCode), node.accessibility, ); } diff --git a/packages/eslint-plugin/src/rules/member-ordering.ts b/packages/eslint-plugin/src/rules/member-ordering.ts index 56e3fae240c..ffc8d9e90c1 100644 --- a/packages/eslint-plugin/src/rules/member-ordering.ts +++ b/packages/eslint-plugin/src/rules/member-ordering.ts @@ -231,12 +231,12 @@ export default util.createRule({ case AST_NODE_TYPES.TSMethodSignature: case AST_NODE_TYPES.TSAbstractClassProperty: case AST_NODE_TYPES.ClassProperty: - return util.getNameFromPropertyName(node.key); + return util.getNameFromMember(node, sourceCode); case AST_NODE_TYPES.TSAbstractMethodDefinition: case AST_NODE_TYPES.MethodDefinition: return node.kind === 'constructor' ? 'constructor' - : util.getNameFromClassMember(node, sourceCode); + : util.getNameFromMember(node, sourceCode); case AST_NODE_TYPES.TSConstructSignatureDeclaration: return 'new'; case AST_NODE_TYPES.TSIndexSignature: diff --git a/packages/eslint-plugin/src/util/misc.ts b/packages/eslint-plugin/src/util/misc.ts index bf65b97b898..74bc37fabbb 100644 --- a/packages/eslint-plugin/src/util/misc.ts +++ b/packages/eslint-plugin/src/util/misc.ts @@ -48,29 +48,6 @@ type InferMessageIdsTypeFromRule = T extends TSESLint.RuleModule< ? TMessageIds : unknown; -/** - * Gets a string representation of the name of the index signature. - */ -export function getNameFromIndexSignature( - node: TSESTree.TSIndexSignature, -): string { - const propName: TSESTree.PropertyName | undefined = node.parameters.find( - (parameter: TSESTree.Parameter): parameter is TSESTree.Identifier => - parameter.type === AST_NODE_TYPES.Identifier, - ); - return propName ? getNameFromPropertyName(propName) : '(index signature)'; -} - -/** - * Gets a string name representation of the given PropertyName node - */ -function getNameFromPropertyName(propertyName: TSESTree.PropertyName): string { - if (propertyName.type === AST_NODE_TYPES.Identifier) { - return propertyName.name; - } - return `${propertyName.value}`; -} - /** Return true if both parameters are equal. */ type Equal = (a: T, b: T) => boolean; @@ -102,31 +79,51 @@ function findFirstResult( return undefined; } +/** + * Gets a string representation of the name of the index signature. + */ +export function getNameFromIndexSignature( + node: TSESTree.TSIndexSignature, +): string { + const propName: TSESTree.PropertyName | undefined = node.parameters.find( + (parameter: TSESTree.Parameter): parameter is TSESTree.Identifier => + parameter.type === AST_NODE_TYPES.Identifier, + ); + return propName ? propName.name : '(index signature)'; +} + /** * Gets a string name representation of the name of the given MethodDefinition * or ClassProperty node, with handling for computed property names. */ -function getNameFromClassMember( - methodDefinition: +function getNameFromMember( + member: | TSESTree.MethodDefinition + | TSESTree.TSMethodSignature + | TSESTree.TSAbstractMethodDefinition | TSESTree.ClassProperty - | TSESTree.TSAbstractMethodDefinition, + | TSESTree.TSAbstractClassProperty + | TSESTree.Property + | TSESTree.TSPropertySignature, sourceCode: TSESLint.SourceCode, ): string { - if (keyCanBeReadAsPropertyName(methodDefinition.key)) { - return getNameFromPropertyName(methodDefinition.key); + if (isLiteralOrIdentifier(member.key)) { + if (member.key.type === AST_NODE_TYPES.Identifier) { + return member.key.name; + } + return `${member.key.value}`; } - return sourceCode.text.slice(...methodDefinition.key.range); + return sourceCode.text.slice(...member.key.range); } /** * This covers both actual property names, as well as computed properties that are either * an identifier or a literal at the top level. */ -function keyCanBeReadAsPropertyName( +function isLiteralOrIdentifier( node: TSESTree.Expression, -): node is TSESTree.PropertyName { +): node is TSESTree.Literal | TSESTree.Identifier { return ( node.type === AST_NODE_TYPES.Literal || node.type === AST_NODE_TYPES.Identifier @@ -147,11 +144,11 @@ export { Equal, ExcludeKeys, findFirstResult, - getNameFromClassMember, - getNameFromPropertyName, + getNameFromMember, InferMessageIdsTypeFromRule, InferOptionsTypeFromRule, isDefinitionFile, + isLiteralOrIdentifier, RequireKeys, upperCaseFirst, }; diff --git a/packages/typescript-estree/src/ts-estree/ts-estree.ts b/packages/typescript-estree/src/ts-estree/ts-estree.ts index a0e554ea67f..438730ab8fc 100644 --- a/packages/typescript-estree/src/ts-estree/ts-estree.ts +++ b/packages/typescript-estree/src/ts-estree/ts-estree.ts @@ -345,7 +345,6 @@ export type Modifier = export type ObjectLiteralElementLike = | MethodDefinition | Property - | RestElement | SpreadElement | TSAbstractMethodDefinition; export type Parameter = @@ -355,6 +354,13 @@ export type Parameter = | ObjectPattern | Identifier | TSParameterProperty; +export type DestructuringPattern = + | Identifier + | ObjectPattern + | ArrayPattern + | RestElement + | AssignmentPattern + | MemberExpression; export type PrimaryExpression = | ArrayExpression | ArrayPattern @@ -374,7 +380,7 @@ export type PrimaryExpression = | TemplateLiteral | ThisExpression | TSNullKeyword; -export type PropertyName = Identifier | Literal; +export type PropertyName = Expression; export type Statement = | BlockStatement | BreakStatement @@ -509,7 +515,7 @@ interface LiteralBase extends BaseNode { } interface MethodDefinitionBase extends BaseNode { - key: Expression; + key: PropertyName; value: FunctionExpression | TSEmptyBodyFunctionExpression; computed: boolean; static: boolean; @@ -542,7 +548,7 @@ export interface ArrayExpression extends BaseNode { export interface ArrayPattern extends BaseNode { type: AST_NODE_TYPES.ArrayPattern; - elements: Expression[]; + elements: DestructuringPattern[]; typeAnnotation?: TSTypeAnnotation; optional?: boolean; decorators?: Decorator[]; @@ -897,7 +903,7 @@ export interface ObjectExpression extends BaseNode { export interface ObjectPattern extends BaseNode { type: AST_NODE_TYPES.ObjectPattern; - properties: ObjectLiteralElementLike[]; + properties: (Property | RestElement)[]; typeAnnotation?: TSTypeAnnotation; optional?: boolean; decorators?: Decorator[]; @@ -923,7 +929,7 @@ export interface Property extends BaseNode { export interface RestElement extends BaseNode { type: AST_NODE_TYPES.RestElement; - argument: BindingName | Expression | PropertyName; + argument: DestructuringPattern; typeAnnotation?: TSTypeAnnotation; optional?: boolean; value?: AssignmentPattern;