rust/src
Nicholas Nethercote 141b31a23f Make DiagnosticBuilder::emit consuming.
This works for most of its call sites. This is nice, because `emit` very
much makes sense as a consuming operation -- indeed,
`DiagnosticBuilderState` exists to ensure no diagnostic is emitted
twice, but it uses runtime checks.

For the small number of call sites where a consuming emit doesn't work,
the commit adds `DiagnosticBuilder::emit_without_consuming`. (This will
be removed in subsequent commits.)

Likewise, `emit_unless` becomes consuming. And `delay_as_bug` becomes
consuming, while `delay_as_bug_without_consuming` is added (which will
also be removed in subsequent commits.)

All this requires significant changes to `DiagnosticBuilder`'s chaining
methods. Currently `DiagnosticBuilder` method chaining uses a
non-consuming `&mut self -> &mut Self` style, which allows chaining to
be used when the chain ends in `emit()`, like so:
```
    struct_err(msg).span(span).emit();
```
But it doesn't work when producing a `DiagnosticBuilder` value,
requiring this:
```
    let mut err = self.struct_err(msg);
    err.span(span);
    err
```
This style of chaining won't work with consuming `emit` though. For
that, we need to use to a `self -> Self` style. That also would allow
`DiagnosticBuilder` production to be chained, e.g.:
```
    self.struct_err(msg).span(span)
```
However, removing the `&mut self -> &mut Self` style would require that
individual modifications of a `DiagnosticBuilder` go from this:
```
    err.span(span);
```
to this:
```
    err = err.span(span);
```
There are *many* such places. I have a high tolerance for tedious
refactorings, but even I gave up after a long time trying to convert
them all.

Instead, this commit has it both ways: the existing `&mut self -> Self`
chaining methods are kept, and new `self -> Self` chaining methods are
added, all of which have a `_mv` suffix (short for "move"). Changes to
the existing `forward!` macro lets this happen with very little
additional boilerplate code. I chose to add the suffix to the new
chaining methods rather than the existing ones, because the number of
changes required is much smaller that way.

This doubled chainging is a bit clumsy, but I think it is worthwhile
because it allows a *lot* of good things to subsequently happen. In this
commit, there are many `mut` qualifiers removed in places where
diagnostics are emitted without being modified. In subsequent commits:
- chaining can be used more, making the code more concise;
- more use of chaining also permits the removal of redundant diagnostic
  APIs like `struct_err_with_code`, which can be replaced easily with
  `struct_err` + `code_mv`;
- `emit_without_diagnostic` can be removed, which simplifies a lot of
  machinery, removing the need for `DiagnosticBuilderState`.
2024-01-08 15:24:49 +11:00
..
attr Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
bin Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
cargo-fmt Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
config remove redundant imports 2023-12-10 10:56:22 +08:00
emitter remove redundant imports 2023-12-10 10:56:22 +08:00
format-diff Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
formatting Merge commit 'efa8f5521d' into rustfmt-subtree 2021-10-20 00:11:59 -05:00
git-rustfmt Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
modules Rename ast::Lit as ast::MetaItemLit. 2022-11-28 15:18:49 +11:00
parse Make DiagnosticBuilder::emit consuming. 2024-01-08 15:24:49 +11:00
test Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
attr.rs Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
chains.rs Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
closures.rs Plumb awaitness of for loops 2023-12-19 12:26:20 -08:00
comment.rs remove redundant imports 2023-12-10 10:56:22 +08:00
coverage.rs Implement closing-block procedure without relying on missed_span module (#3691) 2019-07-17 23:07:12 +09:00
emitter.rs Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
expr.rs Rename unused_tuple_struct_fields in rustfmt 2024-01-02 15:34:37 -05:00
format_report_formatter.rs Merge commit '7b73b60fac' into sync-rustfmt 2022-06-12 22:03:05 -05:00
formatting.rs Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
ignore_path.rs remove redundant imports 2023-12-10 10:56:22 +08:00
imports.rs remove redundant imports 2023-12-10 10:56:22 +08:00
items.rs Give VariantData::Struct named fields, to clairfy recovered. 2023-12-20 00:07:34 +00:00
lib.rs Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
lists.rs Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
macros.rs Add spacing information to delimiters. 2023-12-11 09:36:40 +11:00
matches.rs Plumb awaitness of for loops 2023-12-19 12:26:20 -08:00
missed_spans.rs Merge commit 'efa8f5521d' into rustfmt-subtree 2021-10-20 00:11:59 -05:00
modules.rs Use ThinVec in a few more AST types. 2023-02-21 11:51:56 +11:00
overflow.rs Plumb awaitness of for loops 2023-12-19 12:26:20 -08:00
pairs.rs Rework ast::BinOpKind::to_string and ast::UnOp::to_string. 2023-11-28 09:42:07 +11:00
patterns.rs bool->enum for ast::PatKind::Struct presence of .. 2023-12-23 02:50:31 +00:00
release_channel.rs Move macro to separate module 2019-05-17 16:13:46 +02:00
reorder.rs remove redundant imports 2023-12-10 10:56:22 +08:00
rewrite.rs Merge commit 'c4416f20dc' into sync-rustfmt 2022-06-22 22:14:32 -05:00
rustfmt_diff.rs Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
shape.rs Merge commit 'c4416f20dc' into sync-rustfmt 2022-06-22 22:14:32 -05:00
skip.rs Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
source_file.rs Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
source_map.rs refactor: backport syntux mod 2020-03-26 21:25:34 -05:00
spanned.rs Parse a pattern with no arm 2023-12-03 12:25:46 +01:00
stmt.rs Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
string.rs Merge commit '81fe905ca8' into rustfmt-sync 2023-10-22 20:21:44 -05:00
syntux.rs refactor: backport syntux mod 2020-03-26 21:25:34 -05:00
types.rs Refactor AST trait bound modifiers 2023-12-20 19:39:46 +01:00
utils.rs Plumb awaitness of for loops 2023-12-19 12:26:20 -08:00
vertical.rs Merge commit '5ff7b632a9' into sync-rustfmt-subtree 2022-03-29 23:17:30 -05:00
visitor.rs Merge commit '1d8491b120' into sync-from-rustfmt 2023-01-24 14:16:03 -06:00