Skip to content

Commit

Permalink
Rollup merge of #107312 - calebcartwright:style-let-else, r=joshtriplett
Browse files Browse the repository at this point in the history
  • Loading branch information
matthiaskrgr authored Feb 2, 2023
2 parents 480c4a1 + 10b9c1d commit f838fa8
Showing 1 changed file with 78 additions and 0 deletions.
78 changes: 78 additions & 0 deletions src/doc/style-guide/src/statements.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down

0 comments on commit f838fa8

Please sign in to comment.