57 lines
1.9 KiB
JavaScript
57 lines
1.9 KiB
JavaScript
"use strict"
|
|
|
|
const { getSourceCode } = require("eslint-compat-utils")
|
|
|
|
module.exports = {
|
|
meta: {
|
|
docs: {
|
|
description:
|
|
"disallow identifiers from shadowing catch parameter names.",
|
|
category: "legacy",
|
|
recommended: false,
|
|
url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-shadow-catch-param.html",
|
|
},
|
|
fixable: null,
|
|
messages: {
|
|
forbidden: "Shadowing of catch parameter '{{name}}'.",
|
|
},
|
|
schema: [],
|
|
type: "problem",
|
|
},
|
|
create(context) {
|
|
const sourceCode = getSourceCode(context)
|
|
return {
|
|
"CatchClause > Identifier.param:exit"(node) {
|
|
const scope = sourceCode.getScope(node)
|
|
const shadowingVar = scope.variableScope.set.get(node.name)
|
|
if (!shadowingVar) {
|
|
return
|
|
}
|
|
for (const def of shadowingVar.defs) {
|
|
if (def.type !== "Variable") {
|
|
continue
|
|
}
|
|
const varDecl = def.node
|
|
if (varDecl.parent.kind !== "var") {
|
|
continue
|
|
}
|
|
const varId = varDecl.id
|
|
const catchClause = node.parent
|
|
const bodyRange = catchClause.body.range
|
|
if (
|
|
bodyRange[0] <= varId.range[0] &&
|
|
varId.range[1] <= bodyRange[1]
|
|
) {
|
|
context.report({
|
|
node: varDecl,
|
|
messageId: "forbidden",
|
|
data: {
|
|
name: node.name,
|
|
},
|
|
})
|
|
}
|
|
}
|
|
},
|
|
}
|
|
},
|
|
}
|