| /** |
| * @fileoverview Rule to flag variable leak in CatchClauses in IE 8 and earlier |
| * @author Ian Christian Myers |
| * @deprecated in ESLint v5.1.0 |
| */ |
| |
| "use strict"; |
| |
| //------------------------------------------------------------------------------ |
| // Requirements |
| //------------------------------------------------------------------------------ |
| |
| const astUtils = require("./utils/ast-utils"); |
| |
| //------------------------------------------------------------------------------ |
| // Rule Definition |
| //------------------------------------------------------------------------------ |
| |
| module.exports = { |
| meta: { |
| type: "suggestion", |
| |
| docs: { |
| description: "disallow `catch` clause parameters from shadowing variables in the outer scope", |
| category: "Variables", |
| recommended: false, |
| url: "https://eslint.org/docs/rules/no-catch-shadow" |
| }, |
| |
| replacedBy: ["no-shadow"], |
| |
| deprecated: true, |
| schema: [], |
| |
| messages: { |
| mutable: "Value of '{{name}}' may be overwritten in IE 8 and earlier." |
| } |
| }, |
| |
| create(context) { |
| |
| //-------------------------------------------------------------------------- |
| // Helpers |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * Check if the parameters are been shadowed |
| * @param {Object} scope current scope |
| * @param {string} name parameter name |
| * @returns {boolean} True is its been shadowed |
| */ |
| function paramIsShadowing(scope, name) { |
| return astUtils.getVariableByName(scope, name) !== null; |
| } |
| |
| //-------------------------------------------------------------------------- |
| // Public API |
| //-------------------------------------------------------------------------- |
| |
| return { |
| |
| "CatchClause[param!=null]"(node) { |
| let scope = context.getScope(); |
| |
| /* |
| * When ecmaVersion >= 6, CatchClause creates its own scope |
| * so start from one upper scope to exclude the current node |
| */ |
| if (scope.block === node) { |
| scope = scope.upper; |
| } |
| |
| if (paramIsShadowing(scope, node.param.name)) { |
| context.report({ node, messageId: "mutable", data: { name: node.param.name } }); |
| } |
| } |
| }; |
| |
| } |
| }; |