/** * @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 //------------------------------------------------------------------------------ /** @type {import('../types').Rule.RuleModule} */ module.exports = { meta: { type: 'suggestion', docs: { description: 'Disallow `catch` clause parameters from shadowing variables in the outer scope', recommended: false, url: 'https://eslint.org/docs/latest/rules/no-catch-shadow', }, deprecated: { message: 'This rule was renamed.', url: 'https://eslint.org/blog/2018/07/eslint-v5.1.0-released/', deprecatedSince: '5.1.0', availableUntil: null, replacedBy: [ { rule: { name: 'no-shadow', url: 'https://eslint.org/docs/rules/no-shadow', }, }, ], }, schema: [], messages: { mutable: "Value of '{{name}}' may be overwritten in IE 8 and earlier.", }, }, create(context) { const sourceCode = context.sourceCode; //-------------------------------------------------------------------------- // 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 = sourceCode.getScope(node); /* * 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 }, }); } }, }; }, };