]> git.proxmox.com Git - pve-eslint.git/blob - eslint/lib/rules/no-label-var.js
a07d283f522b5ed33ca13b409893397df16ec396
[pve-eslint.git] / eslint / lib / rules / no-label-var.js
1 /**
2 * @fileoverview Rule to flag labels that are the same as an identifier
3 * @author Ian Christian Myers
4 */
5
6 "use strict";
7
8 //------------------------------------------------------------------------------
9 // Requirements
10 //------------------------------------------------------------------------------
11
12 const astUtils = require("./utils/ast-utils");
13
14 //------------------------------------------------------------------------------
15 // Rule Definition
16 //------------------------------------------------------------------------------
17
18 /** @type {import('../shared/types').Rule} */
19 module.exports = {
20 meta: {
21 type: "suggestion",
22
23 docs: {
24 description: "Disallow labels that share a name with a variable",
25 recommended: false,
26 url: "https://eslint.org/docs/rules/no-label-var"
27 },
28
29 schema: [],
30
31 messages: {
32 identifierClashWithLabel: "Found identifier with same name as label."
33 }
34 },
35
36 create(context) {
37
38 //--------------------------------------------------------------------------
39 // Helpers
40 //--------------------------------------------------------------------------
41
42 /**
43 * Check if the identifier is present inside current scope
44 * @param {Object} scope current scope
45 * @param {string} name To evaluate
46 * @returns {boolean} True if its present
47 * @private
48 */
49 function findIdentifier(scope, name) {
50 return astUtils.getVariableByName(scope, name) !== null;
51 }
52
53 //--------------------------------------------------------------------------
54 // Public API
55 //--------------------------------------------------------------------------
56
57 return {
58
59 LabeledStatement(node) {
60
61 // Fetch the innermost scope.
62 const scope = context.getScope();
63
64 /*
65 * Recursively find the identifier walking up the scope, starting
66 * with the innermost scope.
67 */
68 if (findIdentifier(scope, node.label.name)) {
69 context.report({
70 node,
71 messageId: "identifierClashWithLabel"
72 });
73 }
74 }
75
76 };
77
78 }
79 };