8000 feat(typescript-estree): add strict type mapping to esTreeNodeToTSNod… · CarsonF/typescript-eslint@d3d70a3 · GitHub
[go: up one dir, main page]

Skip to content

Commit d3d70a3

Browse files
armano2bradzacher
authored andcommitted
feat(typescript-estree): add strict type mapping to esTreeNodeToTSNodeMap (typescript-eslint#1382)
1 parent a2cd3a7 commit d3d70a3

25 files changed

+394
-76
lines changed

packages/eslint-plugin/src/rules/await-thenable.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,7 @@ export default util.createRule({
2626

2727
return {
2828
AwaitExpression(node): void {
29-
const originalNode = parserServices.esTreeNodeToTSNodeMap.get<
30-
ts.AwaitExpression
31-
>(node);
29+
const originalNode = parserServices.esTreeNodeToTSNodeMap.get(node);
3230
const type = checker.getTypeAtLocation(originalNode.expression);
3331

3432
if (

packages/eslint-plugin/src/rules/no-floating-promises.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@ export default util.createRule<Options, 'floating'>({
4444

4545
return {
4646
ExpressionStatement(node): void {
47-
const { expression } = parserServices.esTreeNodeToTSNodeMap.get<
48-
ts.ExpressionStatement
49-
>(node);
47+
const { expression } = parserServices.esTreeNodeToTSNodeMap.get(node);
5048

5149
if (isUnhandledPromise(checker, expression)) {
5250
context.report({

packages/eslint-plugin/src/rules/no-for-in-array.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,7 @@ export default util.createRule({
2323
ForInStatement(node): void {
2424
const parserServices = util.getParserServices(context);
2525
const checker = parserServices.program.getTypeChecker();
26-
const originalNode = parserServices.esTreeNodeToTSNodeMap.get<
27-
ts.ForInStatement
28-
>(node);
26+
const originalNode = parserServices.esTreeNodeToTSNodeMap.get(node);
2927

3028
const type = checker.getTypeAtLocation(originalNode.expression);
3129

packages/eslint-plugin/src/rules/no-misused-promises.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,7 @@ export default util.createRule<Options, 'conditional' | 'voidReturn'>({
9999
| TSESTree.OptionalCallExpression
100100
| TSESTree.NewExpression,
101101
): void {
102-
const tsNode = parserServices.esTreeNodeToTSNodeMap.get<
103-
ts.CallExpression | ts.NewExpression
104-
>(node);
102+
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);
105103
const voidParams = voidFunctionParams(checker, tsNode);
106104
if (voidParams.size === 0) {
107105
return;

packages/eslint-plugin/src/rules/no-unnecessary-condition.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,12 @@ export default createRule<Options, MessageId>({
136136
const checker = service.program.getTypeChecker();
137137
const sourceCode = context.getSourceCode();
138138

139-
function getNodeType(node: TSESTree.Node): ts.Type {
139+
function getNodeType(node: TSESTree.Expression): ts.Type {
140140
const tsNode = service.esTreeNodeToTSNodeMap.get(node);
141141
return getConstrainedTypeAtLocation(checker, tsNode);
142142
}
143143

144-
function nodeIsArrayType(node: TSESTree.Node): boolean {
144+
function nodeIsArrayType(node: TSESTree.Expression): boolean {
145145
const nodeType = getNodeType(node);
146146
return checker.isArrayType(nodeType) || checker.isTupleType(nodeType);
147147
}
@@ -150,7 +150,7 @@ export default createRule<Options, MessageId>({
150150
* Checks if a conditional node is necessary:
151151
* if the type of the node is always true or always false, it's not necessary.
152152
*/
153-
function checkNode(node: TSESTree.Node): void {
153+
function checkNode(node: TSESTree.Expression): void {
154154
const type = getNodeType(node);
155155

156156
// Conditional is always necessary if it involves:
@@ -180,7 +180,7 @@ export default createRule<Options, MessageId>({
180180
}
181181
}
182182

183-
function checkNodeForNullish(node: TSESTree.Node): void {
183+
function checkNodeForNullish(node: TSESTree.Expression): void {
184184
const type = getNodeType(node);
185185
// Conditional is always necessary if it involves `any` or `unknown`
186186
if (isTypeFlagSet(type, ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {

packages/eslint-plugin/src/rules/no-unnecessary-qualifier.ts

Lines changed: 11 additions & 4 deletions
79
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export default util.createRule({
7474
}
7575

7676
function qualifierIsUnnecessary(
77-
qualifier: TSESTree.Node,
77+
qualifier: TSESTree.EntityName | TSESTree.MemberExpression,
7878
name: TSESTree.Identifier,
79
): boolean {
8080
const tsQualifier = esTreeNodeToTSNodeMap.get(qualifier);
@@ -110,7 +110,7 @@ export default util.createRule({
110110

111111
function visitNamespaceAccess(
112112
node: TSESTree.Node,
113-
qualifier: TSESTree.Node,
113+
qualifier: TSESTree.EntityName | TSESTree.MemberExpression,
114114
name: TSESTree.Identifier,
115115
): void {
116116
// Only look for nested qualifier errors if we didn't already fail on the outer qualifier.
@@ -132,7 +132,12 @@ export default util.createRule({
132132
}
133133
}
134134

135-
function enterDeclaration(node: TSESTree.Node): void {
135+
function enterDeclaration(
136+
node:
137+
| TSESTree.TSModuleDeclaration
138+
| TSESTree.TSEnumDeclaration
139+
| TSESTree.ExportNamedDeclaration,
140+
): void {
136141
namespacesInScope.push(esTreeNodeToTSNodeMap.get(node));
137142
}
138143

@@ -152,7 +157,9 @@ export default util.createRule({
152157
return node.type === AST_NODE_TYPES.MemberExpression && !node.computed;
153158
}
154159

155-
function isEntityNameExpression(node: TSESTree.Node): boolean {
160+
function isEntityNameExpression(
161+
node: TSESTree.Node,
162+
): node is TSESTree.Identifier | TSESTree.MemberExpression {
156163
return (
157164
node.type === AST_NODE_TYPES.Identifier ||
158165
(isPropertyAccessExpression(node) &&

packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@ import * as util from '../util';
55
import { findFirstResult } from '../util';
66

77
type ParameterCapableTSNode =
8+
| ts.TaggedTemplateExpression
9+
| ts.ImportTypeNode
810
| ts.CallExpression
911
| ts.NewExpression
1012
| ts.TypeReferenceNode
11-
| ts.ExpressionWithTypeArguments;
13+
| ts.ExpressionWithTypeArguments
14+
| ts.JsxOpeningElement
15+
| ts.JsxSelfClosingElement;
1216

1317
type MessageIds = 'unnecessaryTypeParameter';
1418

@@ -67,9 +71,7 @@ export default util.createRule<[], MessageIds>({
6771

6872
return {
6973
TSTypeParameterInstantiation(node): void {
70-
const expression = parserServices.esTreeNodeToTSNodeMap.get<
71-
ParameterCapableTSNode
72-
>(node);
74+
const expression = parserServices.esTreeNodeToTSNodeMap.get(node);
7375

7476
const typeParameters = getTypeParametersFromNode(expression, checker);
7577
if (typeParameters) {

packages/eslint-plugin/src/rules/no-unnecessary-type-assertion.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,7 @@ export default util.createRule<Options, MessageIds>({
168168

169169
return {
170170
TSNonNullExpression(node): void {
171-
const originalNode = parserServices.esTreeNodeToTSNodeMap.get<
172-
ts.NonNullExpression
173-
>(node);
171+
const originalNode = parserServices.esTreeNodeToTSNodeMap.get(node);
174172
const type = util.getConstrainedTypeAtLocation(
175173
checker,
176174
originalNode.expression,
@@ -252,9 +250,7 @@ export default util.createRule<Options, MessageIds>({
252250
return;
253251
}
254252

255-
const originalNode = parserServices.esTreeNodeToTSNodeMap.get<
256-
ts.AssertionExpression
257-
>(node);
253+
const originalNode = parserServices.esTreeNodeToTSNodeMap.get(node);
258254
const castType = checker.getTypeAtLocation(originalNode);
259255

260256
if (

packages/eslint-plugin/src/rules/no-unused-vars-experimental.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ export default util.createRule<Options, MessageIds>({
290290
}
291291

292292
return {
293-
'Program:exit'(program: TSESTree.Node): void {
293+
'Program:exit'(program: TSESTree.Program): void {
294294
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(program);
295295
const sourceFile = util.getSourceFileOfNode(tsNode);
296296
const diagnostics = tsProgram.getSemanticDiagnostics(sourceFile);

packages/eslint-plugin/src/rules/prefer-nullish-coalescing.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
TSESLint,
55
TSESTree,
66
} from '@typescript-eslint/experimental-utils';
7-
import * as ts from 'typescript';
87
import * as util from '../util';
98

109
export type Options = [
@@ -75,9 +74,7 @@ export default util.createRule<Options, MessageIds>({
7574
'LogicalExpression[operator = "||"]'(
7675
node: TSESTree.LogicalExpression,
7776
): void {
78-
const tsNode = parserServices.esTreeNodeToTSNodeMap.get<
79-
ts.BinaryExpression
80-
>(node);
77+
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);
8178
const type = checker.getTypeAtLocation(tsNode.left);
8279
const isNullish = util.isNullableType(type, { allowUndefined: true });
8380
if (!isNullish) {

0 commit comments

Comments
 (0)
0