1/** 2 * @fileoverview Rule to flag variable leak in CatchClauses in IE 8 and earlier 3 * @author Ian Christian Myers 4 * @deprecated in ESLint v5.1.0 5 */ 6 7"use strict"; 8 9//------------------------------------------------------------------------------ 10// Requirements 11//------------------------------------------------------------------------------ 12 13const astUtils = require("./utils/ast-utils"); 14 15//------------------------------------------------------------------------------ 16// Rule Definition 17//------------------------------------------------------------------------------ 18 19module.exports = { 20 meta: { 21 type: "suggestion", 22 23 docs: { 24 description: "disallow `catch` clause parameters from shadowing variables in the outer scope", 25 category: "Variables", 26 recommended: false, 27 url: "https://eslint.org/docs/rules/no-catch-shadow" 28 }, 29 30 replacedBy: ["no-shadow"], 31 32 deprecated: true, 33 schema: [], 34 35 messages: { 36 mutable: "Value of '{{name}}' may be overwritten in IE 8 and earlier." 37 } 38 }, 39 40 create(context) { 41 42 //-------------------------------------------------------------------------- 43 // Helpers 44 //-------------------------------------------------------------------------- 45 46 /** 47 * Check if the parameters are been shadowed 48 * @param {Object} scope current scope 49 * @param {string} name parameter name 50 * @returns {boolean} True is its been shadowed 51 */ 52 function paramIsShadowing(scope, name) { 53 return astUtils.getVariableByName(scope, name) !== null; 54 } 55 56 //-------------------------------------------------------------------------- 57 // Public API 58 //-------------------------------------------------------------------------- 59 60 return { 61 62 "CatchClause[param!=null]"(node) { 63 let scope = context.getScope(); 64 65 /* 66 * When ecmaVersion >= 6, CatchClause creates its own scope 67 * so start from one upper scope to exclude the current node 68 */ 69 if (scope.block === node) { 70 scope = scope.upper; 71 } 72 73 if (paramIsShadowing(scope, node.param.name)) { 74 context.report({ node, messageId: "mutable", data: { name: node.param.name } }); 75 } 76 } 77 }; 78 79 } 80}; 81