Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ce41d7d

Browse files
armano2bradzacher
authored andcommitted
fix: improve token types and add missing type guards (typescript-eslint#1497)
1 parent 56acddd commit ce41d7d

File tree

8 files changed

+172
-107
lines changed

8 files changed

+172
-107
lines changed

.eslintignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ jest.config.js
44
fixtures
55
shared-fixtures
66
coverage
7+
__snapshots__
78

89
packages/eslint-plugin-tslint/tests

packages/eslint-plugin/src/rules/comma-spacing.ts

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export default createRule<Options, MessageIds>({
5454
create(context, [{ before: spaceBefore, after: spaceAfter }]) {
5555
const sourceCode = context.getSourceCode();
5656
const tokensAndComments = sourceCode.tokensAndComments;
57-
const ignoredTokens = new Set<TSESTree.Token>();
57+
const ignoredTokens = new Set<TSESTree.PunctuatorToken>();
5858

5959
/**
6060
* Adds null elements of the ArrayExpression or ArrayPattern node to the ignore list
@@ -67,7 +67,7 @@ export default createRule<Options, MessageIds>({
6767
for (const element of node.elements) {
6868
let token: TSESTree.Token | null;
6969
if (element === null) {
70-
token = sourceCode.getTokenAfter(previousToken as TSESTree.Token);
70+
token = sourceCode.getTokenAfter(previousToken!);
7171
if (token && isCommaToken(token)) {
7272
ignoredTokens.add(token);
7373
}
@@ -100,9 +100,9 @@ export default createRule<Options, MessageIds>({
100100
* @param nextToken The first token after the comma
101101
*/
102102
function validateCommaSpacing(
103-
commaToken: TSESTree.Token,
104-
prevToken: TSESTree.Token | null,
105-
nextToken: TSESTree.Token | null,
103+
commaToken: TSESTree.PunctuatorToken,
104+
prevToken: TSESTree.Token | TSESTree.Comment | null,
105+
nextToken: TSESTree.Token | TSESTree.Comment | null,
106106
): void {
107107
if (
108108
prevToken &&
@@ -166,20 +166,15 @@ export default createRule<Options, MessageIds>({
166166
return;
167167
}
168168

169-
if (token.type === AST_TOKEN_TYPES.JSXText) {
170-
return;
171-
}
172-
173-
const commaToken = token as TSESTree.Token;
174-
const prevToken = tokensAndComments[i - 1] as TSESTree.Token;
175-
const nextToken = tokensAndComments[i + 1] as TSESTree.Token;
169+
const prevToken = tokensAndComments[i - 1];
170+
const nextToken = tokensAndComments[i + 1];
176171

177172
validateCommaSpacing(
178-
commaToken,
179-
isCommaToken(prevToken) || ignoredTokens.has(commaToken)
173+
token,
174+
isCommaToken(prevToken) || ignoredTokens.has(token)
180175
? null
181176
: prevToken,
182-
isCommaToken(nextToken) || ignoredTokens.has(commaToken)
177+
isCommaToken(nextToken) || ignoredTokens.has(token)
183178
? null
184179
: nextToken,
185180
);

packages/eslint-plugin/src/util/astUtils.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const LINEBREAK_MATCHER = /\r\n|[\r\n\u2028\u2029]/;
88

99
function isOptionalChainPunctuator(
1010
token: TSESTree.Token | TSESTree.Comment,
11-
): boolean {
11+
): token is TSESTree.PunctuatorToken & { value: '?.' } {
1212
return token.type === AST_TOKEN_TYPES.Punctuator && token.value === '?.';
1313
}
1414
function isNotOptionalChainPunctuator(
@@ -19,7 +19,7 @@ function isNotOptionalChainPunctuator(
1919

2020
function isNonNullAssertionPunctuator(
2121
token: TSESTree.Token | TSESTree.Comment,
22-
): boolean {
22+
): token is TSESTree.PunctuatorToken & { value: '!' } {
2323
return token.type === AST_TOKEN_TYPES.Punctuator && token.value === '!';
2424
}
2525
function isNotNonNullAssertionPunctuator(
@@ -33,7 +33,7 @@ function isNotNonNullAssertionPunctuator(
3333
*/
3434
function isOptionalOptionalChain(
3535
node: TSESTree.Node,
36-
): node is TSESTree.OptionalCallExpression {
36+
): node is TSESTree.OptionalCallExpression & { optional: true } {
3737
return (
3838
node.type === AST_NODE_TYPES.OptionalCallExpression &&
3939
// this flag means the call expression itself is option
@@ -45,7 +45,9 @@ function isOptionalOptionalChain(
4545
/**
4646
* Returns true if and only if the node represents logical OR
4747
*/
48-
function isLogicalOrOperator(node: TSESTree.Node): boolean {
48+
function isLogicalOrOperator(
49+
node: TSESTree.Node,
50+
): node is TSESTree.LogicalExpression & { operator: '||' } {
4951
return (
5052
node.type === AST_NODE_TYPES.LogicalExpression && node.operator === '||'
5153
);

packages/eslint-plugin/typings/eslint-utils.d.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -113,67 +113,67 @@ declare module 'eslint-utils' {
113113

114114
export function isArrowToken(
115115
token: TSESTree.Token | TSESTree.Comment,
116-
): boolean;
116+
): token is TSESTree.PunctuatorToken & { value: '=>' };
117117
export function isNotArrowToken(
118118
token: TSESTree.Token | TSESTree.Comment,
119119
): boolean;
120120
export function isClosingBraceToken(
121121
token: TSESTree.Token | TSESTree.Comment,
122-
): boolean;
122+
): token is TSESTree.PunctuatorToken & { value: '}' };
123123
export function isNotClosingBraceToken(
124124
token: TSESTree.Token | TSESTree.Comment,
125125
): boolean;
126126
export function isClosingBracketToken(
127127
token: TSESTree.Token | TSESTree.Comment,
128-
): boolean;
128+
): token is TSESTree.PunctuatorToken & { value: ']' };
129129
export function isNotClosingBracketToken(
130130
token: TSESTree.Token | TSESTree.Comment,
131131
): boolean;
132132
export function isClosingParenToken(
133133
token: TSESTree.Token | TSESTree.Comment,
134-
): boolean;
134+
): token is TSESTree.PunctuatorToken & { value: ')' };
135135
export function isNotClosingParenToken(
136136
token: TSESTree.Token | TSESTree.Comment,
137137
): boolean;
138138
export function isColonToken(
139139
token: TSESTree.Token | TSESTree.Comment,
140-
): boolean;
140+
): token is TSESTree.PunctuatorToken & { value: ':' };
141141
export function isNotColonToken(
142142
token: TSESTree.Token | TSESTree.Comment,
143143
): boolean;
144144
export function isCommaToken(
145145
token: TSESTree.Token | TSESTree.Comment,
146-
): boolean;
146+
): token is TSESTree.PunctuatorToken & { value: ',' };
147147
export function isNotCommaToken(
148148
token: TSESTree.Token | TSESTree.Comment,
149149
): boolean;
150150
export function isCommentToken(
151151
token: TSESTree.Token | TSESTree.Comment,
152-
): boolean;
153-
export function isNotCommentToken(
154-
token: TSESTree.Token | TSESTree.Comment,
155-
): boolean;
152+
): token is TSESTree.Comment;
153+
export function isNotCommentToken<
154+
T extends TSESTree.Token | TSESTree.Comment
155+
>(token: T): token is Exclude<T, TSESTree.Comment>;
156156
export function isOpeningBraceToken(
157157
token: TSESTree.Token | TSESTree.Comment,
158-
): boolean;
158+
): token is TSESTree.PunctuatorToken & { value: '{' };
159159
export function isNotOpeningBraceToken(
160160
token: TSESTree.Token | TSESTree.Comment,
161161
): boolean;
162162
export function isOpeningBracketToken(
163163
token: TSESTree.Token | TSESTree.Comment,
164-
): boolean;
164+
): token is TSESTree.PunctuatorToken & { value: '[' };
165165
export function isNotOpeningBracketToken(
166166
token: TSESTree.Token | TSESTree.Comment,
167167
): boolean;
168168
export function isOpeningParenToken(
169169
token: TSESTree.Token | TSESTree.Comment,
170-
): boolean;
170+
): token is TSESTree.PunctuatorToken & { value: '(' };
171171
export function isNotOpeningParenToken(
172172
token: TSESTree.Token | TSESTree.Comment,
173173
): boolean;
174174
export function isSemicolonToken(
175175
token: TSESTree.Token | TSESTree.Comment,
176-
): boolean;
176+
): token is TSESTree.PunctuatorToken & { value: ';' };
177177
export function isNotSemicolonToken(
178178
token: TSESTree.Token | TSESTree.Comment,
179179
): boolean;

packages/experimental-utils/src/ts-eslint/SourceCode.ts

Lines changed: 51 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ declare interface SourceCode {
3333
getNodeByRangeIndex(index: number): TSESTree.Node | null;
3434

3535
isSpaceBetween(
36-
first: TSESTree.Token | TSESTree.Node,
37-
second: TSESTree.Token | TSESTree.Node,
36+
first: TSESTree.Token | TSESTree.Comment | TSESTree.Node,
37+
second: TSESTree.Token | TSESTree.Comment | TSESTree.Node,
3838
): boolean;
3939

4040
/**
@@ -49,93 +49,90 @@ declare interface SourceCode {
4949
// Inherited methods from TokenStore
5050
// ---------------------------------
5151

52-
getTokenByRangeStart(
52+
getTokenByRangeStart<T extends { includeComments?: boolean }>(
5353
offset: number,
54-
options?: { includeComments?: boolean },
55-
): TSESTree.Token | null;
54+
options?: T,
55+
): SourceCode.ReturnTypeFromOptions<T> | null;
5656

57-
getFirstToken(
57+
getFirstToken<T extends SourceCode.CursorWithSkipOptions>(
5858
node: TSESTree.Node,
59-
options?: SourceCode.CursorWithSkipOptions,
60-
): TSESTree.Token | null;
59+
options?: T,
60+
): SourceCode.ReturnTypeFromOptions<T> | null;
6161

62-
getFirstTokens(
62+
getFirstTokens<T extends SourceCode.CursorWithCountOptions>(
6363
node: TSESTree.Node,
64-
options?: SourceCode.CursorWithCountOptions,
65-
): TSESTree.Token[];
64+
options?: T,
65+
): SourceCode.ReturnTypeFromOptions<T>[];
6666

67-
getLastToken(
67+
getLastToken<T extends SourceCode.CursorWithSkipOptions>(
6868
node: TSESTree.Node,
69-
options?: SourceCode.CursorWithSkipOptions,
70-
): TSESTree.Token | null;
69+
options?: T,
70+
): SourceCode.ReturnTypeFromOptions<T> | null;
7171

72-
getLastTokens(
72+
getLastTokens<T extends SourceCode.CursorWithCountOptions>(
7373
node: TSESTree.Node,
74-
options?: SourceCode.CursorWithCountOptions,
75-
): TSESTree.Token[];
74+
options?: T,
75+
): SourceCode.ReturnTypeFromOptions<T>[];
7676

77-
getTokenBefore(
77+
getTokenBefore<T extends SourceCode.CursorWithSkipOptions>(
7878
node: TSESTree.Node | TSESTree.Token | TSESTree.Comment,
79-
options?: SourceCode.CursorWithSkipOptions,
80-
): TSESTree.Token | null;
79+
options?: T,
80+
): SourceCode.ReturnTypeFromOptions<T> | null;
8181

82-
getTokensBefore(
82+
getTokensBefore<T extends SourceCode.CursorWithCountOptions>(
8383
node: TSESTree.Node | TSESTree.Token | TSESTree.Comment,
84-
options?: SourceCode.CursorWithCountOptions,
85-
): TSESTree.Token[];
84+
options?: T,
85+
): SourceCode.ReturnTypeFromOptions<T>[];
8686

87-
getTokenAfter(
87+
getTokenAfter<T extends SourceCode.CursorWithSkipOptions>(
8888
node: TSESTree.Node | TSESTree.Token | TSESTree.Comment,
89-
options?: SourceCode.CursorWithSkipOptions,
90-
): TSESTree.Token | null;
89+
options?: T,
90+
): SourceCode.ReturnTypeFromOptions<T> | null;
9191

92-
getTokensAfter(
92+
getTokensAfter<T extends SourceCode.CursorWithCountOptions>(
9393
node: TSESTree.Node | TSESTree.Token | TSESTree.Comment,
94-
options?: SourceCode.CursorWithCountOptions,
95-
): TSESTree.Token[];
94+
options?: T,
95+
): SourceCode.ReturnTypeFromOptions<T>[];
9696

97-
getFirstTokenBetween(
97+
getFirstTokenBetween<T extends SourceCode.CursorWithSkipOptions>(
9898
left: TSESTree.Node | TSESTree.Token | TSESTree.Comment,
9999
right: TSESTree.Node | TSESTree.Token | TSESTree.Comment,
100-
options?: SourceCode.CursorWithSkipOptions,
101-
): TSESTree.Token | null;
100+
options?: T,
101+
): SourceCode.ReturnTypeFromOptions<T> | null;
102102

103-
getFirstTokensBetween(
103+
getFirstTokensBetween<T extends SourceCode.CursorWithCountOptions>(
104104
left: TSESTree.Node | TSESTree.Token | TSESTree.Comment,
105105
right: TSESTree.Node | TSESTree.Token | TSESTree.Comment,
106-
options?: SourceCode.CursorWithCountOptions,
107-
): TSESTree.Token[];
106+
options?: T,
107+
): SourceCode.ReturnTypeFromOptions<T>[];
108108

109-
getLastTokenBetween(
109+
getLastTokenBetween<T extends SourceCode.CursorWithSkipOptions>(
110110
left: TSESTree.Node | TSESTree.Token | TSESTree.Comment,
111111
right: TSESTree.Node | TSESTree.Token | TSESTree.Comment,
112-
options?: SourceCode.CursorWithSkipOptions,
113-
): TSESTree.Token | null;
112+
options?: T,
113+
): SourceCode.ReturnTypeFromOptions<T> | null;
114114

115-
getLastTokensBetween(
115+
getLastTokensBetween<T extends SourceCode.CursorWithCountOptions>(
116116
left: TSESTree.Node | TSESTree.Token | TSESTree.Comment,
117117
right: TSESTree.Node | TSESTree.Token | TSESTree.Comment,
118-
options?: SourceCode.CursorWithCountOptions,
119-
): TSESTree.Token[];
118+
options?: T,
119+
): SourceCode.ReturnTypeFromOptions<T>[];
120120

121-
getTokensBetween(
121+
getTokensBetween<T extends SourceCode.CursorWithCountOptions>(
122122
left: TSESTree.Node | TSESTree.Token | TSESTree.Comment,
123123
right: TSESTree.Node | TSESTree.Token | TSESTree.Comment,
124-
padding?:
125-
| number
126-
| SourceCode.FilterPredicate
127-
| SourceCode.CursorWithCountOptions,
128-
): TSESTree.Token[];
124+
padding?: T,
125+
): SourceCode.ReturnTypeFromOptions<T>[];
129126

130127
getTokens(
131128
node: TSESTree.Node,
132129
beforeCount?: number,
133130
afterCount?: number,
134131
): TSESTree.Token[];
135-
getTokens(
132+
getTokens<T extends SourceCode.CursorWithCountOptions>(
136133
node: TSESTree.Node,
137-
options: SourceCode.FilterPredicate | SourceCode.CursorWithCountOptions,
138-
): TSESTree.Token[];
134+
options: T,
135+
): SourceCode.ReturnTypeFromOptions<T>[];
139136

140137
commentsExistBetween(
141138
left: TSESTree.Node | TSESTree.Token,
@@ -175,6 +172,10 @@ namespace SourceCode {
175172
tokenOrComment: TSESTree.Token | TSESTree.Comment,
176173
) => boolean;
177174

175+
export type ReturnTypeFromOptions<T> = T extends { includeComments: true }
176+
? TSESTree.Token | TSESTree.Comment
177+
: TSESTree.Token;
178+
178179
export type CursorWithSkipOptions =
179180
| number
180181
| FilterPredicate

packages/typescript-estree/src/convert-comments.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as ts from 'typescript';
22
import { forEachComment } from 'tsutils/util/util';
33
import { getLocFor } from './node-utils';
4-
import { TSESTree } from './ts-estree';
4+
import { AST_TOKEN_TYPES, TSESTree } from './ts-estree';
55

66
/**
77
* Convert all comments for the given AST.
@@ -21,8 +21,8 @@ export function convertComments(
2121
(_, comment) => {
2222
const type =
2323
comment.kind == ts.SyntaxKind.SingleLineCommentTrivia
24-
? 'Line'
25-
: 'Block';
24+
? AST_TOKEN_TYPES.Line
25+
: AST_TOKEN_TYPES.Block;
2626
const range: TSESTree.Range = [comment.pos, comment.end];
2727
const loc = getLocFor(range[0], range[1], ast);
2828

0 commit comments

Comments
 (0)