]>
git.proxmox.com Git - pve-eslint.git/blob - eslint/lib/rules/no-extra-label.js
2 * @fileoverview Rule to disallow unnecessary labels
3 * @author Toru Nagashima
8 //------------------------------------------------------------------------------
10 //------------------------------------------------------------------------------
12 const astUtils
= require("./utils/ast-utils");
14 //------------------------------------------------------------------------------
16 //------------------------------------------------------------------------------
18 /** @type {import('../shared/types').Rule} */
24 description
: "Disallow unnecessary labels",
26 url
: "https://eslint.org/docs/rules/no-extra-label"
33 unexpected
: "This label '{{name}}' is unnecessary."
38 const sourceCode
= context
.getSourceCode();
42 * Creates a new scope with a breakable statement.
43 * @param {ASTNode} node A node to create. This is a BreakableStatement.
46 function enterBreakableStatement(node
) {
48 label
: node
.parent
.type
=== "LabeledStatement" ? node
.parent
.label
: null,
55 * Removes the top scope of the stack.
58 function exitBreakableStatement() {
59 scopeInfo
= scopeInfo
.upper
;
63 * Creates a new scope with a labeled statement.
65 * This ignores it if the body is a breakable statement.
66 * In this case it's handled in the `enterBreakableStatement` function.
67 * @param {ASTNode} node A node to create. This is a LabeledStatement.
70 function enterLabeledStatement(node
) {
71 if (!astUtils
.isBreakableStatement(node
.body
)) {
81 * Removes the top scope of the stack.
83 * This ignores it if the body is a breakable statement.
84 * In this case it's handled in the `exitBreakableStatement` function.
85 * @param {ASTNode} node A node. This is a LabeledStatement.
88 function exitLabeledStatement(node
) {
89 if (!astUtils
.isBreakableStatement(node
.body
)) {
90 scopeInfo
= scopeInfo
.upper
;
95 * Reports a given control node if it's unnecessary.
96 * @param {ASTNode} node A node. This is a BreakStatement or a
100 function reportIfUnnecessary(node
) {
105 const labelNode
= node
.label
;
107 for (let info
= scopeInfo
; info
!== null; info
= info
.upper
) {
108 if (info
.breakable
|| info
.label
&& info
.label
.name
=== labelNode
.name
) {
109 if (info
.breakable
&& info
.label
&& info
.label
.name
=== labelNode
.name
) {
112 messageId
: "unexpected",
115 const breakOrContinueToken
= sourceCode
.getFirstToken(node
);
117 if (sourceCode
.commentsExistBetween(breakOrContinueToken
, labelNode
)) {
121 return fixer
.removeRange([breakOrContinueToken
.range
[1], labelNode
.range
[1]]);
131 WhileStatement
: enterBreakableStatement
,
132 "WhileStatement:exit": exitBreakableStatement
,
133 DoWhileStatement
: enterBreakableStatement
,
134 "DoWhileStatement:exit": exitBreakableStatement
,
135 ForStatement
: enterBreakableStatement
,
136 "ForStatement:exit": exitBreakableStatement
,
137 ForInStatement
: enterBreakableStatement
,
138 "ForInStatement:exit": exitBreakableStatement
,
139 ForOfStatement
: enterBreakableStatement
,
140 "ForOfStatement:exit": exitBreakableStatement
,
141 SwitchStatement
: enterBreakableStatement
,
142 "SwitchStatement:exit": exitBreakableStatement
,
143 LabeledStatement
: enterLabeledStatement
,
144 "LabeledStatement:exit": exitLabeledStatement
,
145 BreakStatement
: reportIfUnnecessary
,
146 ContinueStatement
: reportIfUnnecessary