Skip to content

Commit dc80fb8

Browse files
committed
test(eslint-plugin): add more tests for no-experimental and no-developer-preview rules
1 parent 04d33e0 commit dc80fb8

File tree

13 files changed

+4082
-81
lines changed

13 files changed

+4082
-81
lines changed

packages/eslint-plugin/docs/rules/no-developer-preview.md

Lines changed: 1361 additions & 5 deletions
Large diffs are not rendered by default.

packages/eslint-plugin/docs/rules/no-experimental.md

Lines changed: 1450 additions & 4 deletions
Large diffs are not rendered by default.

packages/eslint-plugin/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
],
2020
"dependencies": {
2121
"@angular-eslint/bundled-angular-compiler": "workspace:*",
22-
"@angular-eslint/utils": "workspace:*"
22+
"@angular-eslint/utils": "workspace:*",
23+
"ts-api-utils": "^1.4.0"
2324
},
2425
"devDependencies": {
2526
"@angular-eslint/test-utils": "workspace:*"

packages/eslint-plugin/src/rules/no-developer-preview.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import { createESLintRule } from '../utils/create-eslint-rule';
22
import { getParserServices } from '@typescript-eslint/utils/eslint-utils';
33
import {
4-
getCallLikeNode,
5-
getCallLikeNodeSignature,
64
getSymbol,
75
hasJsDocTag,
86
isDeclaration,
@@ -36,12 +34,8 @@ export default createESLintRule<Options, MessageIds>({
3634
return;
3735
}
3836

39-
const callLikeNode = getCallLikeNode(node);
40-
const signatureOrSymbol = callLikeNode
41-
? getCallLikeNodeSignature(callLikeNode, services, checker)
42-
: getSymbol(node, services);
43-
44-
if (!hasJsDocTag(signatureOrSymbol, 'developerPreview')) {
37+
const symbol = getSymbol(node, services, checker);
38+
if (!hasJsDocTag(symbol, 'developerPreview')) {
4539
return;
4640
}
4741

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

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import { createESLintRule } from '../utils/create-eslint-rule';
22
import { getParserServices } from '@typescript-eslint/utils/eslint-utils';
33
import {
4-
getCallLikeNode,
5-
getCallLikeNodeSignature,
64
getSymbol,
75
hasJsDocTag,
86
isDeclaration,
@@ -36,12 +34,8 @@ export default createESLintRule<Options, MessageIds>({
3634
return;
3735
}
3836

39-
const callLikeNode = getCallLikeNode(node);
40-
const signatureOrSymbol = callLikeNode
41-
? getCallLikeNodeSignature(callLikeNode, services, checker)
42-
: getSymbol(node, services);
43-
44-
if (!hasJsDocTag(signatureOrSymbol, 'experimental')) {
37+
const symbol = getSymbol(node, services, checker);
38+
if (!hasJsDocTag(symbol, 'experimental')) {
4539
return;
4640
}
4741

packages/eslint-plugin/src/utils/jsdoc.ts

Lines changed: 28 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,11 @@ import type {
33
TSESTree,
44
} from '@typescript-eslint/utils';
55
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
6-
import type ts from 'typescript';
7-
8-
export function getSymbol(
9-
node: TSESTree.Identifier,
10-
services: ParserServicesWithTypeInformation,
11-
): ts.Signature | ts.Symbol | undefined {
12-
if (
13-
node.parent?.type === AST_NODE_TYPES.AssignmentPattern ||
14-
node.parent?.type === AST_NODE_TYPES.Property
15-
) {
16-
return services
17-
.getTypeAtLocation(node.parent.parent)
18-
.getProperty(node.name);
19-
}
20-
21-
return services.getSymbolAtLocation(node);
22-
}
6+
import ts from 'typescript';
7+
import * as tsutils from 'ts-api-utils';
238

249
export type CallLikeNode =
2510
| TSESTree.CallExpression
26-
| TSESTree.JSXOpeningElement
2711
| TSESTree.NewExpression
2812
| TSESTree.TaggedTemplateExpression;
2913

@@ -40,6 +24,23 @@ export function getCallLikeNode(node: TSESTree.Node): CallLikeNode | undefined {
4024
return isNodeCalleeOfParent(callee) ? callee : undefined;
4125
}
4226

27+
export function getSymbol(
28+
node: TSESTree.Identifier,
29+
services: ParserServicesWithTypeInformation,
30+
checker: ts.TypeChecker,
31+
): ts.Symbol | undefined {
32+
const callLikeNode = getCallLikeNode(node);
33+
if (callLikeNode) {
34+
return getCallLikeNodeSymbol(callLikeNode, services, checker);
35+
} else if (node.parent.type === AST_NODE_TYPES.Property) {
36+
return services
37+
.getTypeAtLocation(node.parent.parent)
38+
.getProperty(node.name);
39+
} else {
40+
return services.getSymbolAtLocation(node);
41+
}
42+
}
43+
4344
export function isNodeCalleeOfParent(
4445
node: TSESTree.Node,
4546
): node is CallLikeNode {
@@ -51,9 +52,6 @@ export function isNodeCalleeOfParent(
5152
case AST_NODE_TYPES.TaggedTemplateExpression:
5253
return node.parent.tag === node;
5354

54-
case AST_NODE_TYPES.JSXOpeningElement:
55-
return node.parent.name === node;
56-
5755
default:
5856
return false;
5957
}
@@ -66,24 +64,22 @@ export function hasJsDocTag(
6664
return !!symbol?.getJsDocTags().find((tag) => tag.name === tagName);
6765
}
6866

69-
export function getCallLikeNodeSignature(
70-
callLikeNode: CallLikeNode,
67+
export function getCallLikeNodeSymbol(
68+
node: CallLikeNode,
7169
services: ParserServicesWithTypeInformation,
7270
checker: ts.TypeChecker,
73-
): ts.Signature | undefined {
74-
const tsNode = services.esTreeNodeToTSNodeMap.get(callLikeNode.parent);
75-
76-
return checker.getResolvedSignature(tsNode as ts.CallLikeExpression);
71+
): ts.Symbol | undefined {
72+
const symbol = services.getSymbolAtLocation(node);
73+
return symbol !== undefined &&
74+
tsutils.isSymbolFlagSet(symbol, ts.SymbolFlags.Alias)
75+
? checker.getAliasedSymbol(symbol)
76+
: symbol;
7777
}
7878

7979
export function isDeclaration(node: TSESTree.Identifier): boolean {
8080
const { parent } = node;
8181

8282
switch (parent.type) {
83-
case AST_NODE_TYPES.ArrayPattern:
84-
return parent.elements.includes(node as TSESTree.Identifier);
85-
86-
case AST_NODE_TYPES.ClassExpression:
8783
case AST_NODE_TYPES.ClassDeclaration:
8884
case AST_NODE_TYPES.VariableDeclarator:
8985
case AST_NODE_TYPES.TSEnumMember:
@@ -100,15 +96,8 @@ export function isDeclaration(node: TSESTree.Identifier): boolean {
10096
);
10197

10298
case AST_NODE_TYPES.AssignmentPattern:
103-
return (
104-
parent.left === node &&
105-
!(
106-
parent.parent.type === AST_NODE_TYPES.Property &&
107-
parent.parent.shorthand
108-
)
109-
);
99+
return parent.left === node;
110100

111-
case AST_NODE_TYPES.ArrowFunctionExpression:
112101
case AST_NODE_TYPES.FunctionDeclaration:
113102
case AST_NODE_TYPES.FunctionExpression:
114103
case AST_NODE_TYPES.TSDeclareFunction:

0 commit comments

Comments
 (0)