Skip to content

Commit f4fe930

Browse files
committed
chore: refactor for define-prototype-method-handler
1 parent 6c07320 commit f4fe930

File tree

2 files changed

+50
-87
lines changed

2 files changed

+50
-87
lines changed

lib/util/define-prototype-method-handler/index.js

+49-86
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,18 @@ const { getSourceCode } = require("eslint-compat-utils")
1111

1212
/**
1313
* @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
1419
*/
1520
/**
1621
* @typedef {object} CreateReportArgument
1722
* @property {true | 'aggressive'} objectTypeResult
1823
* @property {string} className
1924
* @property {string} propertyName
20-
* @property {MemberExpression} node
25+
* @property {MemberExpression|Property} node
2126
*/
2227
/**
2328
* @typedef {object} Options
@@ -29,7 +34,7 @@ const { getSourceCode } = require("eslint-compat-utils")
2934
* @param {RuleContext} context The rule context.
3035
* @param {Record<string, readonly string[]>} nameMap The method names to disallow. The key is class names and that value is method names.
3136
* @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.
3338
*/
3439
function definePrototypeMethodHandler(context, nameMap, options) {
3540
const sourceCode = getSourceCode(context)
@@ -40,6 +45,12 @@ function definePrototypeMethodHandler(context, nameMap, options) {
4045
buildObjectTypeCheckerForTS(context, aggressiveResult) ||
4146
buildObjectTypeChecker(context, aggressiveResult)
4247

48+
/**
49+
* @param {MemberExpression|Property} node
50+
* @param {string} className
51+
* @param {string} propertyName
52+
* @param {true | "aggressive"} objectTypeResult
53+
*/
4354
function report(node, className, propertyName, objectTypeResult) {
4455
context.report({
4556
node,
@@ -59,66 +70,44 @@ function definePrototypeMethodHandler(context, nameMap, options) {
5970
})
6071
}
6172

62-
// For performance
6373
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+
}
6496
if (nameMapEntries.length === 1) {
97+
// For performance
6598
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(
70104
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+
}
122111
}
123112
}
124113

@@ -132,20 +121,7 @@ function definePrototypeMethodHandler(context, nameMap, options) {
132121
if (propertyName == null) {
133122
return
134123
}
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)
149125
},
150126
/** @param {import("estree").Property} node */
151127
[[
@@ -169,20 +145,7 @@ function definePrototypeMethodHandler(context, nameMap, options) {
169145
if (!objectNode) {
170146
return
171147
}
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)
186149
},
187150
}
188151
}

lib/util/type-checker/object-type-checker.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ module.exports = { buildObjectTypeChecker, buildExpressionTypeProvider }
2727
* Build object type checker.
2828
* @param {RuleContext} context The rule context.
2929
* @param {boolean | "aggressive"} aggressiveResult The value to return if the type cannot be determined.
30-
* @returns {((memberAccessNode: MemberExpression|Property, objectNode: Expression, className: string) => boolean | "aggressive") | null} Returns an object type checker.
30+
* @returns {((memberAccessNode: MemberExpression|Property, objectNode: Expression, className: string) => boolean | "aggressive")} Returns an object type checker.
3131
*/
3232
function buildObjectTypeChecker(context, aggressiveResult) {
3333
const getType = buildExpressionTypeProvider(context)

0 commit comments

Comments
 (0)