Skip to content

Commit f335c50

Browse files
authoredDec 18, 2019
feat(typescript-estree): tighten prop name and destructure types (#1346)
1 parent 9cd5815 commit f335c50

File tree

6 files changed

+49
-49
lines changed

6 files changed

+49
-49
lines changed
 

‎packages/eslint-plugin/src/rules/adjacent-overload-signatures.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,13 @@ export default util.createRule({
5555
case AST_NODE_TYPES.FunctionDeclaration:
5656
return member.id && member.id.name;
5757
case AST_NODE_TYPES.TSMethodSignature:
58-
return util.getNameFromPropertyName(member.key);
58+
return util.getNameFromMember(member, sourceCode);
5959
case AST_NODE_TYPES.TSCallSignatureDeclaration:
6060
return 'call';
6161
case AST_NODE_TYPES.TSConstructSignatureDeclaration:
6262
return 'new';
6363
case AST_NODE_TYPES.MethodDefinition:
64-
return util.getNameFromClassMember(member, sourceCode);
64+
return util.getNameFromMember(member, sourceCode);
6565
}
6666

6767
return null;

‎packages/eslint-plugin/src/rules/explicit-member-accessibility.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,7 @@ export default util.createRule<Options, MessageIds>({
125125
break;
126126
}
127127

128-
const methodName = util.getNameFromClassMember(
129-
methodDefinition,
130-
sourceCode,
131-
);
128+
const methodName = util.getNameFromMember(methodDefinition, sourceCode);
132129

133130
if (check === 'off' || ignoredMethodNames.has(methodName)) {
134131
return;
@@ -163,7 +160,7 @@ export default util.createRule<Options, MessageIds>({
163160
): void {
164161
const nodeType = 'class property';
165162

166-
const propertyName = util.getNameFromPropertyName(classProperty.key);
163+
const propertyName = util.getNameFromMember(classProperty, sourceCode);
167164
if (
168165
propCheck === 'no-public' &&
169166
classProperty.accessibility === 'public'

‎packages/eslint-plugin/src/rules/member-naming.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export default util.createRule<Options, MessageIds>({
9999

100100
validate(
101101
node.key,
102-
util.getNameFromClassMember(node, sourceCode),
102+
util.getNameFromMember(node, sourceCode),
103103
node.accessibility,
104104
);
105105
}

‎packages/eslint-plugin/src/rules/member-ordering.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -231,12 +231,12 @@ export default util.createRule<Options, MessageIds>({
231231
case AST_NODE_TYPES.TSMethodSignature:
232232
case AST_NODE_TYPES.TSAbstractClassProperty:
233233
case AST_NODE_TYPES.ClassProperty:
234-
return util.getNameFromPropertyName(node.key);
234+
return util.getNameFromMember(node, sourceCode);
235235
case AST_NODE_TYPES.TSAbstractMethodDefinition:
236236
case AST_NODE_TYPES.MethodDefinition:
237237
return node.kind === 'constructor'
238238
? 'constructor'
239-
: util.getNameFromClassMember(node, sourceCode);
239+
: util.getNameFromMember(node, sourceCode);
240240
case AST_NODE_TYPES.TSConstructSignatureDeclaration:
241241
return 'new';
242242
case AST_NODE_TYPES.TSIndexSignature:

‎packages/eslint-plugin/src/util/misc.ts

+30-33
Original file line numberDiff line numberDiff line change
@@ -48,29 +48,6 @@ type InferMessageIdsTypeFromRule<T> = T extends TSESLint.RuleModule<
4848
? TMessageIds
4949
: unknown;
5050

51-
/**
52-
* Gets a string representation of the name of the index signature.
53-
*/
54-
export function getNameFromIndexSignature(
55-
node: TSESTree.TSIndexSignature,
56-
): string {
57-
const propName: TSESTree.PropertyName | undefined = node.parameters.find(
58-
(parameter: TSESTree.Parameter): parameter is TSESTree.Identifier =>
59-
parameter.type === AST_NODE_TYPES.Identifier,
60-
);
61-
return propName ? getNameFromPropertyName(propName) : '(index signature)';
62-
}
63-
64-
/**
65-
* Gets a string name representation of the given PropertyName node
66-
*/
67-
function getNameFromPropertyName(propertyName: TSESTree.PropertyName): string {
68-
if (propertyName.type === AST_NODE_TYPES.Identifier) {
69-
return propertyName.name;
70-
}
71-
return `${propertyName.value}`;
72-
}
73-
7451
/** Return true if both parameters are equal. */
7552
type Equal<T> = (a: T, b: T) => boolean;
7653

@@ -102,31 +79,51 @@ function findFirstResult<T, U>(
10279
return undefined;
10380
}
10481

82+
/**
83+
* Gets a string representation of the name of the index signature.
84+
*/
85+
export function getNameFromIndexSignature(
86+
node: TSESTree.TSIndexSignature,
87+
): string {
88+
const propName: TSESTree.PropertyName | undefined = node.parameters.find(
89+
(parameter: TSESTree.Parameter): parameter is TSESTree.Identifier =>
90+
parameter.type === AST_NODE_TYPES.Identifier,
91+
);
92+
return propName ? propName.name : '(index signature)';
93+
}
94+
10595
/**
10696
* Gets a string name representation of the name of the given MethodDefinition
10797
* or ClassProperty node, with handling for computed property names.
10898
*/
109-
function getNameFromClassMember(
110-
methodDefinition:
99+
function getNameFromMember(
100+
member:
111101
| TSESTree.MethodDefinition
102+
| TSESTree.TSMethodSignature
103+
| TSESTree.TSAbstractMethodDefinition
112104
| TSESTree.ClassProperty
113-
| TSESTree.TSAbstractMethodDefinition,
105+
| TSESTree.TSAbstractClassProperty
106+
| TSESTree.Property
107+
| TSESTree.TSPropertySignature,
114108
sourceCode: TSESLint.SourceCode,
115109
): string {
116-
if (keyCanBeReadAsPropertyName(methodDefinition.key)) {
117-
return getNameFromPropertyName(methodDefinition.key);
110+
if (isLiteralOrIdentifier(member.key)) {
111+
if (member.key.type === AST_NODE_TYPES.Identifier) {
112+
return member.key.name;
113+
}
114+
return `${member.key.value}`;
118115
}
119116

120-
return sourceCode.text.slice(...methodDefinition.key.range);
117+
return sourceCode.text.slice(...member.key.range);
121118
}
122119

123120
/**
124121
* This covers both actual property names, as well as computed properties that are either
125122
* an identifier or a literal at the top level.
126123
*/
127-
function keyCanBeReadAsPropertyName(
124+
function isLiteralOrIdentifier(
128125
node: TSESTree.Expression,
129-
): node is TSESTree.PropertyName {
126+
): node is TSESTree.Literal | TSESTree.Identifier {
130127
return (
131128
node.type === AST_NODE_TYPES.Literal ||
132129
node.type === AST_NODE_TYPES.Identifier
@@ -147,11 +144,11 @@ export {
147144
Equal,
148145
ExcludeKeys,
149146
findFirstResult,
150-
getNameFromClassMember,
151-
getNameFromPropertyName,
147+
getNameFromMember,
152148
InferMessageIdsTypeFromRule,
153149
InferOptionsTypeFromRule,
154150
isDefinitionFile,
151+
isLiteralOrIdentifier,
155152
RequireKeys,
156153
upperCaseFirst,
157154
};

‎packages/typescript-estree/src/ts-estree/ts-estree.ts

+12-6
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,6 @@ export type Modifier =
345345
export type ObjectLiteralElementLike =
346346
| MethodDefinition
347347
| Property
348-
| RestElement
349348
| SpreadElement
350349
| TSAbstractMethodDefinition;
351350
export type Parameter =
@@ -355,6 +354,13 @@ export type Parameter =
355354
| ObjectPattern
356355
| Identifier
357356
| TSParameterProperty;
357+
export type DestructuringPattern =
358+
| Identifier
359+
| ObjectPattern
360+
| ArrayPattern
361+
| RestElement
362+
| AssignmentPattern
363+
| MemberExpression;
358364
export type PrimaryExpression =
359365
| ArrayExpression
360366
| ArrayPattern
@@ -374,7 +380,7 @@ export type PrimaryExpression =
374380
| TemplateLiteral
375381
| ThisExpression
376382
| TSNullKeyword;
377-
export type PropertyName = Identifier | Literal;
383+
export type PropertyName = Expression;
378384
export type Statement =
379385
| BlockStatement
380386
| BreakStatement
@@ -509,7 +515,7 @@ interface LiteralBase extends BaseNode {
509515
}
510516

511517
interface MethodDefinitionBase extends BaseNode {
512-
key: Expression;
518+
key: PropertyName;
513519
value: FunctionExpression | TSEmptyBodyFunctionExpression;
514520
computed: boolean;
515521
static: boolean;
@@ -542,7 +548,7 @@ export interface ArrayExpression extends BaseNode {
542548

543549
export interface ArrayPattern extends BaseNode {
544550
type: AST_NODE_TYPES.ArrayPattern;
545-
elements: Expression[];
551+
elements: DestructuringPattern[];
546552
typeAnnotation?: TSTypeAnnotation;
547553
optional?: boolean;
548554
decorators?: Decorator[];
@@ -897,7 +903,7 @@ export interface ObjectExpression extends BaseNode {
897903

898904
export interface ObjectPattern extends BaseNode {
899905
type: AST_NODE_TYPES.ObjectPattern;
900-
properties: ObjectLiteralElementLike[];
906+
properties: (Property | RestElement)[];
901907
typeAnnotation?: TSTypeAnnotation;
902908
optional?: boolean;
903909
decorators?: Decorator[];
@@ -923,7 +929,7 @@ export interface Property extends BaseNode {
923929

924930
export interface RestElement extends BaseNode {
925931
type: AST_NODE_TYPES.RestElement;
926-
argument: BindingName | Expression | PropertyName;
932+
argument: DestructuringPattern;
927933
typeAnnotation?: TSTypeAnnotation;
928934
optional?: boolean;
929935
value?: AssignmentPattern;

0 commit comments

Comments
 (0)
Please sign in to comment.