mirror of
https://git.proxmox.com/git/pve-eslint
synced 2025-10-05 14:20:28 +00:00

includes a (minimal) working wrapper Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
170 lines
3.4 KiB
Markdown
170 lines
3.4 KiB
Markdown
# Disallow Case Statement Fallthrough (no-fallthrough)
|
|
|
|
The `switch` statement in JavaScript is one of the more error-prone constructs of the language thanks in part to the ability to "fall through" from one `case` to the next. For example:
|
|
|
|
```js
|
|
switch(foo) {
|
|
case 1:
|
|
doSomething();
|
|
|
|
case 2:
|
|
doSomethingElse();
|
|
}
|
|
```
|
|
|
|
In this example, if `foo` is `1`, then execution will flow through both cases, as the first falls through to the second. You can prevent this by using `break`, as in this example:
|
|
|
|
```js
|
|
switch(foo) {
|
|
case 1:
|
|
doSomething();
|
|
break;
|
|
|
|
case 2:
|
|
doSomethingElse();
|
|
}
|
|
```
|
|
|
|
That works fine when you don't want a fallthrough, but what if the fallthrough is intentional, there is no way to indicate that in the language. It's considered a best practice to always indicate when a fallthrough is intentional using a comment which matches the `/falls?\s?through/i` regular expression:
|
|
|
|
```js
|
|
switch(foo) {
|
|
case 1:
|
|
doSomething();
|
|
// falls through
|
|
|
|
case 2:
|
|
doSomethingElse();
|
|
}
|
|
|
|
switch(foo) {
|
|
case 1:
|
|
doSomething();
|
|
// fall through
|
|
|
|
case 2:
|
|
doSomethingElse();
|
|
}
|
|
|
|
switch(foo) {
|
|
case 1:
|
|
doSomething();
|
|
// fallsthrough
|
|
|
|
case 2:
|
|
doSomethingElse();
|
|
}
|
|
```
|
|
|
|
In this example, there is no confusion as to the expected behavior. It is clear that the first case is meant to fall through to the second case.
|
|
|
|
## Rule Details
|
|
|
|
This rule is aimed at eliminating unintentional fallthrough of one case to the other. As such, it flags any fallthrough scenarios that are not marked by a comment.
|
|
|
|
Examples of **incorrect** code for this rule:
|
|
|
|
```js
|
|
/*eslint no-fallthrough: "error"*/
|
|
|
|
switch(foo) {
|
|
case 1:
|
|
doSomething();
|
|
|
|
case 2:
|
|
doSomething();
|
|
}
|
|
```
|
|
|
|
Examples of **correct** code for this rule:
|
|
|
|
```js
|
|
/*eslint no-fallthrough: "error"*/
|
|
|
|
switch(foo) {
|
|
case 1:
|
|
doSomething();
|
|
break;
|
|
|
|
case 2:
|
|
doSomething();
|
|
}
|
|
|
|
function bar(foo) {
|
|
switch(foo) {
|
|
case 1:
|
|
doSomething();
|
|
return;
|
|
|
|
case 2:
|
|
doSomething();
|
|
}
|
|
}
|
|
|
|
switch(foo) {
|
|
case 1:
|
|
doSomething();
|
|
throw new Error("Boo!");
|
|
|
|
case 2:
|
|
doSomething();
|
|
}
|
|
|
|
switch(foo) {
|
|
case 1:
|
|
case 2:
|
|
doSomething();
|
|
}
|
|
|
|
switch(foo) {
|
|
case 1:
|
|
doSomething();
|
|
// falls through
|
|
|
|
case 2:
|
|
doSomething();
|
|
}
|
|
```
|
|
|
|
Note that the last `case` statement in these examples does not cause a warning because there is nothing to fall through into.
|
|
|
|
## Options
|
|
|
|
This rule accepts a single options argument:
|
|
|
|
* Set the `commentPattern` option to a regular expression string to change the test for intentional fallthrough comment
|
|
|
|
### commentPattern
|
|
|
|
Examples of **correct** code for the `{ "commentPattern": "break[\\s\\w]*omitted" }` option:
|
|
|
|
```js
|
|
/*eslint no-fallthrough: ["error", { "commentPattern": "break[\\s\\w]*omitted" }]*/
|
|
|
|
switch(foo) {
|
|
case 1:
|
|
doSomething();
|
|
// break omitted
|
|
|
|
case 2:
|
|
doSomething();
|
|
}
|
|
|
|
switch(foo) {
|
|
case 1:
|
|
doSomething();
|
|
// caution: break is omitted intentionally
|
|
|
|
default:
|
|
doSomething();
|
|
}
|
|
```
|
|
|
|
## When Not To Use It
|
|
|
|
If you don't want to enforce that each `case` statement should end with a `throw`, `return`, `break`, or comment, then you can safely turn this rule off.
|
|
|
|
## Related Rules
|
|
|
|
* [default-case](default-case.md)
|