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:
Matthias Krüger 2023-02-02 06:52:13 +01:00 committed by GitHub
commit f838fa87b2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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