pve-eslint/eslint/docs/rules/no-fallthrough.md
Dominik Csapak eb39fafa4f first commit
includes a (minimal) working wrapper

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
2020-04-06 15:06:03 +02:00

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)