.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / 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 module.exports = {
19     meta: {
20         type: "suggestion",
21
22         docs: {
23             description: "disallow labels that share a name with a variable",
24             category: "Variables",
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 };