diff --git a/lib/rules/no-shadow.js b/lib/rules/no-shadow.js index 18d2c2593ba8..9327269a9b1a 100644 --- a/lib/rules/no-shadow.js +++ b/lib/rules/no-shadow.js @@ -44,7 +44,8 @@ module.exports = { ], messages: { - noShadow: "'{{name}}' is already declared in the upper scope {{shadowedLine}}:{{shadowedColumn}}." + noShadow: "'{{name}}' is already declared in the upper scope {{shadowedLine}}:{{shadowedColumn}}.", + noShadowGlobal: "{{name}} is already a global variable." } }, @@ -128,13 +129,13 @@ module.exports = { if (identifier) { obj = { + global: false, line: identifier.loc.start.line, column: identifier.loc.start.column + 1 }; } else { obj = { - line: 0, - column: 0 + global: true }; } return obj; @@ -189,12 +190,15 @@ module.exports = { !(options.hoist !== "all" && isInTdz(variable, shadowed)) ) { const location = getDeclaredLocation(shadowed); + const messageId = location.global ? "noShadowGlobal" : "noShadow"; - variable.shadowedLine = location.line; - variable.shadowedColumn = location.column; + if (!location.global) { + variable.shadowedLine = location.line; + variable.shadowedColumn = location.column; + } context.report({ node: variable.identifiers[0], - messageId: "noShadow", + messageId, data: variable }); } diff --git a/tests/lib/rules/no-shadow.js b/tests/lib/rules/no-shadow.js index 2053c675f56c..dc2cc63c4dea 100644 --- a/tests/lib/rules/no-shadow.js +++ b/tests/lib/rules/no-shadow.js @@ -633,11 +633,9 @@ ruleTester.run("no-shadow", rule, { code: "function foo() { var Object = 0; }", options: [{ builtinGlobals: true }], errors: [{ - messageId: "noShadow", + messageId: "noShadowGlobal", data: { - name: "Object", - shadowedLine: 0, - shadowedColumn: 0 + name: "Object" }, type: "Identifier" }] @@ -647,11 +645,9 @@ ruleTester.run("no-shadow", rule, { options: [{ builtinGlobals: true }], env: { browser: true }, errors: [{ - messageId: "noShadow", + messageId: "noShadowGlobal", data: { - name: "top", - shadowedLine: 0, - shadowedColumn: 0 + name: "top" }, type: "Identifier" }] @@ -661,11 +657,9 @@ ruleTester.run("no-shadow", rule, { options: [{ builtinGlobals: true }], parserOptions: { ecmaVersion: 6, sourceType: "module" }, errors: [{ - messageId: "noShadow", + messageId: "noShadowGlobal", data: { - name: "Object", - shadowedLine: 0, - shadowedColumn: 0 + name: "Object" }, type: "Identifier" }] @@ -676,11 +670,9 @@ ruleTester.run("no-shadow", rule, { parserOptions: { ecmaVersion: 6, sourceType: "module" }, env: { browser: true }, errors: [{ - messageId: "noShadow", + messageId: "noShadowGlobal", data: { - name: "top", - shadowedLine: 0, - shadowedColumn: 0 + name: "top" }, type: "Identifier" }] @@ -690,11 +682,9 @@ ruleTester.run("no-shadow", rule, { options: [{ builtinGlobals: true }], parserOptions: { ecmaFeatures: { globalReturn: true } }, errors: [{ - messageId: "noShadow", + messageId: "noShadowGlobal", data: { - name: "Object", - shadowedLine: 0, - shadowedColumn: 0 + name: "Object" }, type: "Identifier" }] @@ -705,11 +695,9 @@ ruleTester.run("no-shadow", rule, { parserOptions: { ecmaFeatures: { globalReturn: true } }, env: { browser: true }, errors: [{ - messageId: "noShadow", + messageId: "noShadowGlobal", data: { - name: "top", - shadowedLine: 0, - shadowedColumn: 0 + name: "top" }, type: "Identifier" }]