@@ -40,70 +40,138 @@ function definePrototypeMethodHandler(context, nameMap, options) {
40
40
buildObjectTypeCheckerForTS ( context , aggressiveResult ) ||
41
41
buildObjectTypeChecker ( context , aggressiveResult )
42
42
43
+ function report ( node , className , propertyName , objectTypeResult ) {
44
+ context . report ( {
45
+ node,
46
+ messageId : "forbidden" ,
47
+ data : {
48
+ name : `${ className } .prototype.${ propertyName } ` ,
49
+ } ,
50
+ ...( ( options &&
51
+ options . createReport &&
52
+ options . createReport ( {
53
+ objectTypeResult,
54
+ className,
55
+ propertyName,
56
+ node,
57
+ } ) ) ||
58
+ { } ) ,
59
+ } )
60
+ }
61
+
43
62
// For performance
44
63
const nameMapEntries = Object . entries ( nameMap )
45
64
if ( nameMapEntries . length === 1 ) {
46
65
const [ [ className , methodNames ] ] = nameMapEntries
47
66
return {
67
+ /** @param {MemberExpression } node */
48
68
MemberExpression ( node ) {
49
69
const propertyName = getPropertyName (
50
70
node ,
51
71
sourceCode . getScope ( node ) ,
52
72
)
73
+ if ( propertyName == null ) {
74
+ return
75
+ }
53
76
let objectTypeResult = undefined
54
77
if (
55
78
methodNames . includes ( propertyName ) &&
56
- ( objectTypeResult = objectTypeChecker ( node , className ) )
79
+ ( objectTypeResult = objectTypeChecker (
80
+ node ,
81
+ node . object ,
82
+ className ,
83
+ ) )
57
84
) {
58
- context . report ( {
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
+ ] . join ( "," ) ] ( node ) {
93
+ const propertyName = getPropertyName (
94
+ node ,
95
+ sourceCode . getScope ( node ) ,
96
+ )
97
+ if ( propertyName == null ) {
98
+ return
99
+ }
100
+ /** @type {import("estree").VariableDeclarator | import("estree").AssignmentExpression } */
101
+ const assignmentNode = node . parent . parent
102
+ const objectNode =
103
+ assignmentNode . type === "VariableDeclarator"
104
+ ? assignmentNode . init
105
+ : assignmentNode . right
106
+ let objectTypeResult = undefined
107
+ if (
108
+ methodNames . includes ( propertyName ) &&
109
+ ( objectTypeResult = objectTypeChecker (
59
110
node ,
60
- messageId : "forbidden" ,
61
- data : {
62
- name : `${ className } .prototype.${ propertyName } ` ,
63
- } ,
64
- ...( ( options &&
65
- options . createReport &&
66
- options . createReport ( {
67
- objectTypeResult,
68
- className,
69
- propertyName,
70
- node,
71
- } ) ) ||
72
- { } ) ,
73
- } )
111
+ objectNode ,
112
+ className ,
113
+ ) )
114
+ ) {
115
+ report ( node , className , propertyName , objectTypeResult )
74
116
}
75
117
} ,
76
118
}
77
119
}
78
120
79
121
return {
122
+ /** @param {MemberExpression } node */
80
123
MemberExpression ( node ) {
81
124
const propertyName = getPropertyName (
82
125
node ,
83
126
sourceCode . getScope ( node ) ,
84
127
)
128
+ if ( propertyName == null ) {
129
+ return
130
+ }
85
131
for ( const [ className , methodNames ] of nameMapEntries ) {
86
132
let objectTypeResult = undefined
87
133
if (
88
134
methodNames . includes ( propertyName ) &&
89
- ( objectTypeResult = objectTypeChecker ( node , className ) )
135
+ ( objectTypeResult = objectTypeChecker (
136
+ node ,
137
+ node . object ,
138
+ className ,
139
+ ) )
90
140
) {
91
- context . report ( {
141
+ report ( node , className , propertyName , objectTypeResult )
142
+ return
143
+ }
144
+ }
145
+ } ,
146
+ /** @param {import("estree").Property } node */
147
+ [ [
148
+ "VariableDeclarator > ObjectPattern.id > Property.properties" ,
149
+ "AssignmentExpression > ObjectPattern.left > Property.properties" ,
150
+ ] . join ( "," ) ] ( node ) {
151
+ const propertyName = getPropertyName (
152
+ node ,
153
+ sourceCode . getScope ( node ) ,
154
+ )
155
+ if ( propertyName == null ) {
156
+ return
157
+ }
158
+ /** @type {import("estree").VariableDeclarator | import("estree").AssignmentExpression } */
159
+ const assignmentNode = node . parent . parent
160
+ const objectNode =
161
+ assignmentNode . type === "VariableDeclarator"
162
+ ? assignmentNode . init
163
+ : assignmentNode . right
164
+ for ( const [ className , methodNames ] of nameMapEntries ) {
165
+ let objectTypeResult = undefined
166
+ if (
167
+ methodNames . includes ( propertyName ) &&
168
+ ( objectTypeResult = objectTypeChecker (
92
169
node ,
93
- messageId : "forbidden" ,
94
- data : {
95
- name : `${ className } .prototype.${ propertyName } ` ,
96
- } ,
97
- ...( ( options &&
98
- options . createReport &&
99
- options . createReport ( {
100
- objectTypeResult,
101
- className,
102
- propertyName,
103
- node,
104
- } ) ) ||
105
- { } ) ,
106
- } )
170
+ objectNode ,
171
+ className ,
172
+ ) )
173
+ ) {
174
+ report ( node , className , propertyName , objectTypeResult )
107
175
return
108
176
}
109
177
}
0 commit comments