]>
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 //------------------------------------------------------------------------------
23 description
: "disallow unnecessary labels",
25 url
: "https://eslint.org/docs/rules/no-extra-label"
32 unexpected
: "This label '{{name}}' is unnecessary."
37 const sourceCode
= context
.getSourceCode();
41 * Creates a new scope with a breakable statement.
42 * @param {ASTNode} node A node to create. This is a BreakableStatement.
45 function enterBreakableStatement(node
) {
47 label
: node
.parent
.type
=== "LabeledStatement" ? node
.parent
.label
: null,
54 * Removes the top scope of the stack.
57 function exitBreakableStatement() {
58 scopeInfo
= scopeInfo
.upper
;
62 * Creates a new scope with a labeled statement.
64 * This ignores it if the body is a breakable statement.
65 * In this case it's handled in the `enterBreakableStatement` function.
66 * @param {ASTNode} node A node to create. This is a LabeledStatement.
69 function enterLabeledStatement(node
) {
70 if (!astUtils
.isBreakableStatement(node
.body
)) {
80 * Removes the top scope of the stack.
82 * This ignores it if the body is a breakable statement.
83 * In this case it's handled in the `exitBreakableStatement` function.
84 * @param {ASTNode} node A node. This is a LabeledStatement.
87 function exitLabeledStatement(node
) {
88 if (!astUtils
.isBreakableStatement(node
.body
)) {
89 scopeInfo
= scopeInfo
.upper
;
94 * Reports a given control node if it's unnecessary.
95 * @param {ASTNode} node A node. This is a BreakStatement or a
99 function reportIfUnnecessary(node
) {
104 const labelNode
= node
.label
;
106 for (let info
= scopeInfo
; info
!== null; info
= info
.upper
) {
107 if (info
.breakable
|| info
.label
&& info
.label
.name
=== labelNode
.name
) {
108 if (info
.breakable
&& info
.label
&& info
.label
.name
=== labelNode
.name
) {
111 messageId
: "unexpected",
114 const breakOrContinueToken
= sourceCode
.getFirstToken(node
);
116 if (sourceCode
.commentsExistBetween(breakOrContinueToken
, labelNode
)) {
120 return fixer
.removeRange([breakOrContinueToken
.range
[1], labelNode
.range
[1]]);
130 WhileStatement
: enterBreakableStatement
,
131 "WhileStatement:exit": exitBreakableStatement
,
132 DoWhileStatement
: enterBreakableStatement
,
133 "DoWhileStatement:exit": exitBreakableStatement
,
134 ForStatement
: enterBreakableStatement
,
135 "ForStatement:exit": exitBreakableStatement
,
136 ForInStatement
: enterBreakableStatement
,
137 "ForInStatement:exit": exitBreakableStatement
,
138 ForOfStatement
: enterBreakableStatement
,
139 "ForOfStatement:exit": exitBreakableStatement
,
140 SwitchStatement
: enterBreakableStatement
,
141 "SwitchStatement:exit": exitBreakableStatement
,
142 LabeledStatement
: enterLabeledStatement
,
143 "LabeledStatement:exit": exitLabeledStatement
,
144 BreakStatement
: reportIfUnnecessary
,
145 ContinueStatement
: reportIfUnnecessary