Skip to content

Commit ba41680

Browse files
authored
fix(typescript-estree): forward compatibility for new compound assignment operators (typescript-eslint#2253)
1 parent 5fdd21a commit ba41680

File tree

1 file changed

+73
-85
lines changed

1 file changed

+73
-85
lines changed

packages/typescript-estree/src/node-utils.ts

Lines changed: 73 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,6 @@ import { AST_NODE_TYPES, AST_TOKEN_TYPES, TSESTree } from './ts-estree';
55

66
const SyntaxKind = ts.SyntaxKind;
77

8-
const ASSIGNMENT_OPERATORS: ts.AssignmentOperator[] = [
9-
SyntaxKind.EqualsToken,
10-
SyntaxKind.PlusEqualsToken,
11-
SyntaxKind.MinusEqualsToken,
12-
SyntaxKind.AsteriskEqualsToken,
13-
SyntaxKind.AsteriskAsteriskEqualsToken,
14-
SyntaxKind.SlashEqualsToken,
15-
SyntaxKind.PercentEqualsToken,
16-
SyntaxKind.LessThanLessThanEqualsToken,
17-
SyntaxKind.GreaterThanGreaterThanEqualsToken,
18-
SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken,
19-
SyntaxKind.AmpersandEqualsToken,
20-
SyntaxKind.BarEqualsToken,
21-
SyntaxKind.CaretEqualsToken,
22-
];
23-
248
const LOGICAL_OPERATORS: (
259
| ts.LogicalOperator
2610
| ts.SyntaxKind.QuestionQuestionToken
@@ -30,71 +14,71 @@ const LOGICAL_OPERATORS: (
3014
SyntaxKind.QuestionQuestionToken,
3115
];
3216

33-
const TOKEN_TO_TEXT = {
34-
[SyntaxKind.OpenBraceToken]: '{',
35-
[SyntaxKind.CloseBraceToken]: '}',
36-
[SyntaxKind.OpenParenToken]: '(',
37-
[SyntaxKind.CloseParenToken]: ')',
38-
[SyntaxKind.OpenBracketToken]: '[',
39-
[SyntaxKind.CloseBracketToken]: ']',
40-
[SyntaxKind.DotToken]: '.',
41-
[SyntaxKind.DotDotDotToken]: '...',
42-
[SyntaxKind.SemicolonToken]: ';',
43-
[SyntaxKind.CommaToken]: ',',
44-
[SyntaxKind.LessThanToken]: '<',
45-
[SyntaxKind.GreaterThanToken]: '>',
46-
[SyntaxKind.LessThanEqualsToken]: '<=',
47-
[SyntaxKind.GreaterThanEqualsToken]: '>=',
48-
[SyntaxKind.EqualsEqualsToken]: '==',
49-
[SyntaxKind.ExclamationEqualsToken]: '!=',
50-
[SyntaxKind.EqualsEqualsEqualsToken]: '===',
51-
[SyntaxKind.InstanceOfKeyword]: 'instanceof',
52-
[SyntaxKind.ExclamationEqualsEqualsToken]: '!==',
53-
[SyntaxKind.EqualsGreaterThanToken]: '=>',
54-
[SyntaxKind.PlusToken]: '+',
55-
[SyntaxKind.MinusToken]: '-',
56-
[SyntaxKind.AsteriskToken]: '*',
57-
[SyntaxKind.AsteriskAsteriskToken]: '**',
58-
[SyntaxKind.SlashToken]: '/',
59-
[SyntaxKind.PercentToken]: '%',
60-
[SyntaxKind.PlusPlusToken]: '++',
61-
[SyntaxKind.MinusMinusToken]: '--',
62-
[SyntaxKind.LessThanLessThanToken]: '<<',
63-
[SyntaxKind.LessThanSlashToken]: '</',
64-
[SyntaxKind.GreaterThanGreaterThanToken]: '>>',
65-
[SyntaxKind.GreaterThanGreaterThanGreaterThanToken]: '>>>',
66-
[SyntaxKind.AmpersandToken]: '&',
67-
[SyntaxKind.BarToken]: '|',
68-
[SyntaxKind.CaretToken]: '^',
69-
[SyntaxKind.ExclamationToken]: '!',
70-
[SyntaxKind.TildeToken]: '~',
71-
[SyntaxKind.AmpersandAmpersandToken]: '&&',
72-
[SyntaxKind.BarBarToken]: '||',
73-
[SyntaxKind.QuestionToken]: '?',
74-
[SyntaxKind.ColonToken]: ':',
75-
[SyntaxKind.EqualsToken]: '=',
76-
[SyntaxKind.PlusEqualsToken]: '+=',
77-
[SyntaxKind.MinusEqualsToken]: '-=',
78-
[SyntaxKind.AsteriskEqualsToken]: '*=',
79-
[SyntaxKind.AsteriskAsteriskEqualsToken]: '**=',
80-
[SyntaxKind.SlashEqualsToken]: '/=',
81-
[SyntaxKind.PercentEqualsToken]: '%=',
82-
[SyntaxKind.LessThanLessThanEqualsToken]: '<<=',
83-
[SyntaxKind.GreaterThanGreaterThanEqualsToken]: '>>=',
84-
[SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken]: '>>>=',
85-
[SyntaxKind.AmpersandEqualsToken]: '&=',
86-
[SyntaxKind.BarEqualsToken]: '|=',
87-
[SyntaxKind.CaretEqualsToken]: '^=',
88-
[SyntaxKind.AtToken]: '@',
89-
[SyntaxKind.InKeyword]: 'in',
90-
[SyntaxKind.UniqueKeyword]: 'unique',
91-
[SyntaxKind.KeyOfKeyword]: 'keyof',
92-
[SyntaxKind.NewKeyword]: 'new',
93-
[SyntaxKind.ImportKeyword]: 'import',
94-
[SyntaxKind.ReadonlyKeyword]: 'readonly',
95-
[SyntaxKind.QuestionQuestionToken]: '??',
96-
[SyntaxKind.QuestionDotToken]: '?.',
97-
} as const;
17+
interface TokenToText {
18+
[SyntaxKind.OpenBraceToken]: '{';
19+
[SyntaxKind.CloseBraceToken]: '}';
20+
[SyntaxKind.OpenParenToken]: '(';
21+
[SyntaxKind.CloseParenToken]: ')';
22+
[SyntaxKind.OpenBracketToken]: '[';
23+
[SyntaxKind.CloseBracketToken]: ']';
24+
[SyntaxKind.DotToken]: '.';
25+
[SyntaxKind.DotDotDotToken]: '...';
26+
[SyntaxKind.SemicolonToken]: ';';
27+
[SyntaxKind.CommaToken]: ',';
28+
[SyntaxKind.LessThanToken]: '<';
29+
[SyntaxKind.GreaterThanToken]: '>';
30+
[SyntaxKind.LessThanEqualsToken]: '<=';
31+
[SyntaxKind.GreaterThanEqualsToken]: '>=';
32+
[SyntaxKind.EqualsEqualsToken]: '==';
33+
[SyntaxKind.ExclamationEqualsToken]: '!=';
34+
[SyntaxKind.EqualsEqualsEqualsToken]: '===';
35+
[SyntaxKind.InstanceOfKeyword]: 'instanceof';
36+
[SyntaxKind.ExclamationEqualsEqualsToken]: '!==';
37+
[SyntaxKind.EqualsGreaterThanToken]: '=>';
38+
[SyntaxKind.PlusToken]: '+';
39+
[SyntaxKind.MinusToken]: '-';
40+
[SyntaxKind.AsteriskToken]: '*';
41+
[SyntaxKind.AsteriskAsteriskToken]: '**';
42+
[SyntaxKind.SlashToken]: '/';
43+
[SyntaxKind.PercentToken]: '%';
44+
[SyntaxKind.PlusPlusToken]: '++';
45+
[SyntaxKind.MinusMinusToken]: '--';
46+
[SyntaxKind.LessThanLessThanToken]: '<<';
47+
[SyntaxKind.LessThanSlashToken]: '</';
48+
[SyntaxKind.GreaterThanGreaterThanToken]: '>>';
49+
[SyntaxKind.GreaterThanGreaterThanGreaterThanToken]: '>>>';
50+
[SyntaxKind.AmpersandToken]: '&';
51+
[SyntaxKind.BarToken]: '|';
52+
[SyntaxKind.CaretToken]: '^';
53+
[SyntaxKind.ExclamationToken]: '!';
54+
[SyntaxKind.TildeToken]: '~';
55+
[SyntaxKind.AmpersandAmpersandToken]: '&&';
56+
[SyntaxKind.BarBarToken]: '||';
57+
[SyntaxKind.QuestionToken]: '?';
58+
[SyntaxKind.ColonToken]: ':';
59+
[SyntaxKind.EqualsToken]: '=';
60+
[SyntaxKind.PlusEqualsToken]: '+=';
61+
[SyntaxKind.MinusEqualsToken]: '-=';
62+
[SyntaxKind.AsteriskEqualsToken]: '*=';
63+
[SyntaxKind.AsteriskAsteriskEqualsToken]: '**=';
64+
[SyntaxKind.SlashEqualsToken]: '/=';
65+
[SyntaxKind.PercentEqualsToken]: '%=';
66+
[SyntaxKind.LessThanLessThanEqualsToken]: '<<=';
67+
[SyntaxKind.GreaterThanGreaterThanEqualsToken]: '>>=';
68+
[SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken]: '>>>=';
69+
[SyntaxKind.AmpersandEqualsToken]: '&=';
70+
[SyntaxKind.BarEqualsToken]: '|=';
71+
[SyntaxKind.CaretEqualsToken]: '^=';
72+
[SyntaxKind.AtToken]: '@';
73+
[SyntaxKind.InKeyword]: 'in';
74+
[SyntaxKind.UniqueKeyword]: 'unique';
75+
[SyntaxKind.KeyOfKeyword]: 'keyof';
76+
[SyntaxKind.NewKeyword]: 'new';
77+
[SyntaxKind.ImportKeyword]: 'import';
78+
[SyntaxKind.ReadonlyKeyword]: 'readonly';
79+
[SyntaxKind.QuestionQuestionToken]: '??';
80+
[SyntaxKind.QuestionDotToken]: '?.';
81+
}
9882

9983
/**
10084
* Returns true if the given ts.Token is the assignment operator
@@ -104,7 +88,10 @@ const TOKEN_TO_TEXT = {
10488
export function isAssignmentOperator<T extends ts.SyntaxKind>(
10589
operator: ts.Token<T>,
10690
): boolean {
107-
return (ASSIGNMENT_OPERATORS as ts.SyntaxKind[]).includes(operator.kind);
91+
return (
92+
operator.kind >= SyntaxKind.FirstAssignment &&
93+
operator.kind <= SyntaxKind.LastAssignment
94+
);
10895
}
10996

11097
/**
@@ -125,9 +112,10 @@ export function isLogicalOperator<T extends ts.SyntaxKind>(
125112
*/
126113
export function getTextForTokenKind<T extends ts.SyntaxKind>(
127114
kind: T,
128-
): T extends keyof typeof TOKEN_TO_TEXT ? typeof TOKEN_TO_TEXT[T] : undefined {
129-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
130-
return kind in TOKEN_TO_TEXT ? (TOKEN_TO_TEXT as any)[kind] : undefined;
115+
): T extends keyof TokenToText ? TokenToText[T] : string | undefined {
116+
return ts.tokenToString(kind) as T extends keyof TokenToText
117+
? TokenToText[T]
118+
: string | undefined;
131119
}
132120

133121
/**

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy