Blame view
node_modules/eslint/lib/rules/no-unused-labels.js
3.04 KB
f7563de62
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
/** * @fileoverview Rule to disallow unused labels. * @author Toru Nagashima */ "use strict"; //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ module.exports = { meta: { docs: { description: "disallow unused labels", category: "Best Practices", recommended: true }, schema: [], fixable: "code" }, create(context) { const sourceCode = context.getSourceCode(); let scopeInfo = null; /** * Adds a scope info to the stack. * * @param {ASTNode} node - A node to add. This is a LabeledStatement. * @returns {void} */ function enterLabeledScope(node) { scopeInfo = { label: node.label.name, used: false, upper: scopeInfo }; } /** * Removes the top of the stack. * At the same time, this reports the label if it's never used. * * @param {ASTNode} node - A node to report. This is a LabeledStatement. * @returns {void} */ function exitLabeledScope(node) { if (!scopeInfo.used) { context.report({ node: node.label, message: "'{{name}}:' is defined but never used.", data: node.label, fix(fixer) { /* * Only perform a fix if there are no comments between the label and the body. This will be the case * when there is exactly one token/comment (the ":") between the label and the body. */ if (sourceCode.getTokenAfter(node.label, { includeComments: true }) === sourceCode.getTokenBefore(node.body, { includeComments: true })) { return fixer.removeRange([node.range[0], node.body.range[0]]); } return null; } }); } scopeInfo = scopeInfo.upper; } /** * Marks the label of a given node as used. * * @param {ASTNode} node - A node to mark. This is a BreakStatement or * ContinueStatement. * @returns {void} */ function markAsUsed(node) { if (!node.label) { return; } const label = node.label.name; let info = scopeInfo; while (info) { if (info.label === label) { info.used = true; break; } info = info.upper; } } return { LabeledStatement: enterLabeledScope, "LabeledStatement:exit": exitLabeledScope, BreakStatement: markAsUsed, ContinueStatement: markAsUsed }; } }; |