@@ -11,13 +11,18 @@ const { getSourceCode } = require("eslint-compat-utils")
11
11
12
12
/**
13
13
* @typedef {import("estree").MemberExpression } MemberExpression
14
+ * @typedef {import("estree").Property } Property
15
+ * @typedef {import("estree").Expression } Expression
16
+ * @typedef {import("estree").Node } Node
17
+ * @typedef {import("eslint").Rule.RuleContext } RuleContext
18
+ * @typedef {import("eslint").Rule.ReportDescriptor } ReportDescriptor
14
19
*/
15
20
/**
16
21
* @typedef {object } CreateReportArgument
17
22
* @property {true | 'aggressive' } objectTypeResult
18
23
* @property {string } className
19
24
* @property {string } propertyName
20
- * @property {MemberExpression } node
25
+ * @property {MemberExpression|Property } node
21
26
*/
22
27
/**
23
28
* @typedef {object } Options
@@ -29,7 +34,7 @@ const { getSourceCode } = require("eslint-compat-utils")
29
34
* @param {RuleContext } context The rule context.
30
35
* @param {Record<string, readonly string[]> } nameMap The method names to disallow. The key is class names and that value is method names.
31
36
* @param {Options } [options] The options.
32
- * @returns {Record<string, (node: ASTNode ) => void> } The defined handlers.
37
+ * @returns {Record<string, (node: Node ) => void> } The defined handlers.
33
38
*/
34
39
function definePrototypeMethodHandler ( context , nameMap , options ) {
35
40
const sourceCode = getSourceCode ( context )
@@ -40,6 +45,12 @@ function definePrototypeMethodHandler(context, nameMap, options) {
40
45
buildObjectTypeCheckerForTS ( context , aggressiveResult ) ||
41
46
buildObjectTypeChecker ( context , aggressiveResult )
42
47
48
+ /**
49
+ * @param {MemberExpression|Property } node
50
+ * @param {string } className
51
+ * @param {string } propertyName
52
+ * @param {true | "aggressive" } objectTypeResult
53
+ */
43
54
function report ( node , className , propertyName , objectTypeResult ) {
44
55
context . report ( {
45
56
node,
@@ -59,66 +70,44 @@ function definePrototypeMethodHandler(context, nameMap, options) {
59
70
} )
60
71
}
61
72
62
- // For performance
63
73
const nameMapEntries = Object . entries ( nameMap )
74
+ /**
75
+ * @param {MemberExpression|Property } node
76
+ * @param {string } propertyName
77
+ * @param {Expression } objectNode
78
+ */
79
+ // eslint-disable-next-line func-style
80
+ let verifyPropertyName = ( node , propertyName , objectNode ) => {
81
+ for ( const [ className , methodNames ] of nameMapEntries ) {
82
+ let objectTypeResult = undefined
83
+ if (
84
+ methodNames . includes ( propertyName ) &&
85
+ ( objectTypeResult = objectTypeChecker (
86
+ node ,
87
+ objectNode ,
88
+ className ,
89
+ ) )
90
+ ) {
91
+ report ( node , className , propertyName , objectTypeResult )
92
+ return
93
+ }
94
+ }
95
+ }
64
96
if ( nameMapEntries . length === 1 ) {
97
+ // For performance
65
98
const [ [ className , methodNames ] ] = nameMapEntries
66
- return {
67
- /** @param {MemberExpression } node */
68
- MemberExpression ( node ) {
69
- const propertyName = getPropertyName (
99
+ verifyPropertyName = ( node , propertyName , objectNode ) => {
100
+ let objectTypeResult = undefined
101
+ if (
102
+ methodNames . includes ( propertyName ) &&
103
+ ( objectTypeResult = objectTypeChecker (
70
104
node ,
71
- sourceCode . getScope ( node ) ,
72
- )
73
- if ( propertyName == null ) {
74
- return
75
- }
76
- let objectTypeResult = undefined
77
- if (
78
- methodNames . includes ( propertyName ) &&
79
- ( objectTypeResult = objectTypeChecker (
80
- node ,
81
- node . object ,
82
- className ,
83
- ) )
84
- ) {
85
- report ( node , className , propertyName , objectTypeResult )
86
- }
87
- } ,
88
- /** @param {import("estree").Property } node */
89
- [ [
90
- "VariableDeclarator > ObjectPattern.id > Property.properties" ,
91
- "AssignmentExpression > ObjectPattern.left > Property.properties" ,
92
- "AssignmentPattern > ObjectPattern.left > Property.properties" ,
93
- ] . join ( "," ) ] ( node ) {
94
- const propertyName = getPropertyName (
95
- node ,
96
- sourceCode . getScope ( node ) ,
97
- )
98
- if ( propertyName == null ) {
99
- return
100
- }
101
- /** @type {import("estree").VariableDeclarator | import("estree").AssignmentExpression | import("estree").AssignmentPattern } */
102
- const assignmentNode = node . parent . parent
103
- const objectNode =
104
- assignmentNode . type === "VariableDeclarator"
105
- ? assignmentNode . init
106
- : assignmentNode . right
107
- if ( ! objectNode ) {
108
- return
109
- }
110
- let objectTypeResult = undefined
111
- if (
112
- methodNames . includes ( propertyName ) &&
113
- ( objectTypeResult = objectTypeChecker (
114
- node ,
115
- objectNode ,
116
- className ,
117
- ) )
118
- ) {
119
- report ( node , className , propertyName , objectTypeResult )
120
- }
121
- } ,
105
+ objectNode ,
106
+ className ,
107
+ ) )
108
+ ) {
109
+ report ( node , className , propertyName , objectTypeResult )
110
+ }
122
111
}
123
112
}
124
113
@@ -132,20 +121,7 @@ function definePrototypeMethodHandler(context, nameMap, options) {
132
121
if ( propertyName == null ) {
133
122
return
134
123
}
135
- for ( const [ className , methodNames ] of nameMapEntries ) {
136
- let objectTypeResult = undefined
137
- if (
138
- methodNames . includes ( propertyName ) &&
139
- ( objectTypeResult = objectTypeChecker (
140
- node ,
141
- node . object ,
142
- className ,
143
- ) )
144
- ) {
145
- report ( node , className , propertyName , objectTypeResult )
146
- return
147
- }
148
- }
124
+ verifyPropertyName ( node , propertyName , node . object )
149
125
} ,
150
126
/** @param {import("estree").Property } node */
151
127
[ [
@@ -169,20 +145,7 @@ function definePrototypeMethodHandler(context, nameMap, options) {
169
145
if ( ! objectNode ) {
170
146
return
171
147
}
172
- for ( const [ className , methodNames ] of nameMapEntries ) {
173
- let objectTypeResult = undefined
174
- if (
175
- methodNames . includes ( propertyName ) &&
176
- ( objectTypeResult = objectTypeChecker (
177
- node ,
178
- objectNode ,
179
- className ,
180
- ) )
181
- ) {
182
- report ( node , className , propertyName , objectTypeResult )
183
- return
184
- }
185
- }
148
+ verifyPropertyName ( node , propertyName , objectNode )
186
149
} ,
187
150
}
188
151
}
0 commit comments