Rollup merge of #107312 - calebcartwright:style-let-else, r=joshtriplett
Add Style Guide rules for let-else statements
cc `@rust-lang/style` `@rust-lang/rustfmt`
[rendered](c694d07c64/src/doc/style-guide/src/statements.md (else-blocks-let-else-statements)
)
This commit is contained in:
commit
f838fa87b2
1 changed files with 78 additions and 0 deletions
|
@ -99,6 +99,84 @@ let Foo {
|
|||
);
|
||||
```
|
||||
|
||||
#### else blocks (let-else statements)
|
||||
|
||||
If a let statement contains an `else` component, also known as a let-else statement,
|
||||
then the `else` component should be formatted according to the same rules as the `else` block
|
||||
in [control flow expressions (i.e. if-else, and if-let-else expressions)](./expressions.md#control-flow-expressions).
|
||||
Apply the same formatting rules to the components preceding
|
||||
the `else` block (i.e. the `let pattern: Type = initializer_expr ...` portion)
|
||||
as described [above](#let-statements)
|
||||
|
||||
Similarly to if-else expressions, if the initializer
|
||||
expression is multi-lined, then the `else` keyword and opening brace of the block (i.e. `else {`)
|
||||
should be put on the same line as the end of the initializer
|
||||
expression with a preceding space if all the following are true:
|
||||
|
||||
* The initializer expression ends with one or more closing
|
||||
parentheses, square brackets, and/or braces
|
||||
* There is nothing else on that line
|
||||
* That line is not indented beyond the indent of the first line containing the `let` keyword
|
||||
|
||||
For example:
|
||||
|
||||
```rust
|
||||
let Some(x) = y.foo(
|
||||
"abc",
|
||||
fairly_long_identifier,
|
||||
"def",
|
||||
"123456",
|
||||
"string",
|
||||
"cheese",
|
||||
) else {
|
||||
bar()
|
||||
}
|
||||
```
|
||||
|
||||
Otherwise, the `else` keyword and opening brace should be placed on the next line after the end of the initializer expression, and should not be indented (the `else` keyword should be aligned with the `let` keyword).
|
||||
|
||||
For example:
|
||||
|
||||
```rust
|
||||
let Some(x) = abcdef()
|
||||
.foo(
|
||||
"abc",
|
||||
some_really_really_really_long_ident,
|
||||
"ident",
|
||||
"123456",
|
||||
)
|
||||
.bar()
|
||||
.baz()
|
||||
.qux("fffffffffffffffff")
|
||||
else {
|
||||
foo_bar()
|
||||
}
|
||||
```
|
||||
|
||||
##### Single line let-else statements
|
||||
|
||||
The entire let-else statement may be formatted on a single line if all the following are true:
|
||||
|
||||
* the entire statement is *short*
|
||||
* the `else` block contains a single-line expression and no statements
|
||||
* the `else` block contains no comments
|
||||
* the let statement components preceding the `else` block can be formatted on a single line
|
||||
|
||||
```rust
|
||||
let Some(1) = opt else { return };
|
||||
|
||||
let Some(1) = opt else {
|
||||
return;
|
||||
};
|
||||
|
||||
let Some(1) = opt else {
|
||||
// nope
|
||||
return
|
||||
};
|
||||
```
|
||||
|
||||
Formatters may allow users to configure the value of the threshold
|
||||
used to determine whether a let-else statement is *short*.
|
||||
|
||||
### Macros in statement position
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue