Skip to content

Commit b1b9278

Browse files
committed
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`.
1 parent ca2fc42 commit b1b9278

File tree

86 files changed

+329
-312
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+329
-312
lines changed

compiler/rustc_ast_passes/src/feature_gate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ macro_rules! gate {
2323
($visitor:expr, $feature:ident, $span:expr, $explain:expr, $help:expr) => {{
2424
if !$visitor.features.$feature && !$span.allows_unstable(sym::$feature) {
2525
feature_err(&$visitor.sess.parse_sess, sym::$feature, $span, $explain)
26-
.help($help)
26+
.help_mv($help)
2727
.emit();
2828
}
2929
}};

compiler/rustc_borrowck/src/diagnostics/region_errors.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
348348
let named_ty = self.regioncx.name_regions(self.infcx.tcx, hidden_ty);
349349
let named_key = self.regioncx.name_regions(self.infcx.tcx, key);
350350
let named_region = self.regioncx.name_regions(self.infcx.tcx, member_region);
351-
let mut diag = unexpected_hidden_region_diagnostic(
351+
let diag = unexpected_hidden_region_diagnostic(
352352
self.infcx.tcx,
353353
span,
354354
named_ty,

compiler/rustc_borrowck/src/region_infer/opaque_types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ fn check_opaque_type_parameter_valid(
421421
return Err(tcx
422422
.dcx()
423423
.struct_span_err(span, "non-defining opaque type use in defining scope")
424-
.span_note(spans, format!("{descr} used multiple times"))
424+
.span_note_mv(spans, format!("{descr} used multiple times"))
425425
.emit());
426426
}
427427
}

compiler/rustc_builtin_macros/src/asm.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,7 @@ fn expand_preparsed_asm(ecx: &mut ExtCtxt<'_>, args: AsmArgs) -> Option<ast::Inl
458458
match expr_to_spanned_string(ecx, template_expr, msg) {
459459
Ok(template_part) => template_part,
460460
Err(err) => {
461-
if let Some((mut err, _)) = err {
461+
if let Some((err, _)) = err {
462462
err.emit();
463463
}
464464
return None;
@@ -747,7 +747,7 @@ pub(super) fn expand_asm<'cx>(
747747
};
748748
MacEager::expr(expr)
749749
}
750-
Err(mut err) => {
750+
Err(err) => {
751751
err.emit();
752752
DummyResult::any(sp)
753753
}
@@ -779,7 +779,7 @@ pub(super) fn expand_global_asm<'cx>(
779779
DummyResult::any(sp)
780780
}
781781
}
782-
Err(mut err) => {
782+
Err(err) => {
783783
err.emit();
784784
DummyResult::any(sp)
785785
}

compiler/rustc_builtin_macros/src/assert.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub fn expand_assert<'cx>(
2222
) -> Box<dyn MacResult + 'cx> {
2323
let Assert { cond_expr, custom_message } = match parse_assert(cx, span, tts) {
2424
Ok(assert) => assert,
25-
Err(mut err) => {
25+
Err(err) => {
2626
err.emit();
2727
return DummyResult::any(span);
2828
}

compiler/rustc_builtin_macros/src/cfg.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pub fn expand_cfg(
2828
);
2929
MacEager::expr(cx.expr_bool(sp, matches_cfg))
3030
}
31-
Err(mut err) => {
31+
Err(err) => {
3232
err.emit();
3333
DummyResult::any(sp)
3434
}

compiler/rustc_builtin_macros/src/cfg_eval.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ impl CfgEval<'_, '_> {
200200
parser.capture_cfg = true;
201201
match parse_annotatable_with(&mut parser) {
202202
Ok(a) => annotatable = a,
203-
Err(mut err) => {
203+
Err(err) => {
204204
err.emit();
205205
return Some(annotatable);
206206
}

compiler/rustc_builtin_macros/src/cmdline_attrs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub fn inject(krate: &mut ast::Crate, parse_sess: &ParseSess, attrs: &[String])
1818
let start_span = parser.token.span;
1919
let AttrItem { path, args, tokens: _ } = match parser.parse_attr_item(false) {
2020
Ok(ai) => ai,
21-
Err(mut err) => {
21+
Err(err) => {
2222
err.emit();
2323
continue;
2424
}

compiler/rustc_builtin_macros/src/format.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ fn parse_args<'a>(ecx: &mut ExtCtxt<'a>, sp: Span, tts: TokenStream) -> PResult<
9999
}
100100

101101
match p.expect(&token::Comma) {
102-
Err(mut err) => {
102+
Err(err) => {
103103
match token::TokenKind::Comma.similar_tokens() {
104104
Some(tks) if tks.contains(&p.token.kind) => {
105105
// If a similar token is found, then it may be a typo. We
@@ -630,8 +630,7 @@ fn report_missing_placeholders(
630630
.collect::<Vec<_>>();
631631

632632
if !placeholders.is_empty() {
633-
if let Some(mut new_diag) = report_redundant_format_arguments(ecx, args, used, placeholders)
634-
{
633+
if let Some(new_diag) = report_redundant_format_arguments(ecx, args, used, placeholders) {
635634
diag.cancel();
636635
new_diag.emit();
637636
return;
@@ -976,7 +975,7 @@ fn expand_format_args_impl<'cx>(
976975
MacEager::expr(DummyResult::raw_expr(sp, true))
977976
}
978977
}
979-
Err(mut err) => {
978+
Err(err) => {
980979
err.emit();
981980
DummyResult::any(sp)
982981
}

compiler/rustc_builtin_macros/src/proc_macro_harness.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ impl<'a> Visitor<'a> for CollectProcMacros<'a> {
194194

195195
self.dcx
196196
.struct_span_err(attr.span, msg)
197-
.span_label(prev_attr.span, "previous attribute here")
197+
.span_label_mv(prev_attr.span, "previous attribute here")
198198
.emit();
199199

200200
return;

0 commit comments

Comments
 (0)