Skip to content

Commit d0468a2

Browse files
committed
rm var_span_label to var_subdiag & eager subdiag
1 parent 9693b17 commit d0468a2

File tree

6 files changed

+729
-240
lines changed

6 files changed

+729
-240
lines changed

compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs

+119-69
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ use crate::borrow_set::TwoPhaseActivation;
3030
use crate::borrowck_errors;
3131

3232
use crate::diagnostics::conflict_errors::StorageDeadOrDrop::LocalStorageDead;
33-
use crate::diagnostics::find_all_local_uses;
3433
use crate::diagnostics::mutability_errors::mut_borrow_of_mutable_ref;
34+
use crate::diagnostics::{find_all_local_uses, CapturedMessageOpt};
3535
use crate::{
3636
borrow_set::BorrowData, diagnostics::Instance, prefixes::IsPrefixOf,
3737
InitializationRequiringAction, MirBorrowckCtxt, PrefixSet, WriteKind,
@@ -183,13 +183,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
183183
let move_spans = self.move_spans(moved_place.as_ref(), move_out.source);
184184
let move_span = move_spans.args_or_use();
185185

186-
let move_msg = if move_spans.for_closure() { " into closure" } else { "" };
186+
let is_move_msg = move_spans.for_closure();
187187

188-
let loop_message = if location == move_out.source || move_site.traversed_back_edge {
189-
", in previous iteration of loop"
190-
} else {
191-
""
192-
};
188+
let is_loop_message = location == move_out.source || move_site.traversed_back_edge;
193189

194190
if location == move_out.source {
195191
is_loop_move = true;
@@ -206,17 +202,21 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
206202
);
207203
}
208204

205+
let msg_opt = CapturedMessageOpt {
206+
is_partial_move,
207+
is_loop_message,
208+
is_move_msg,
209+
is_loop_move,
210+
maybe_reinitialized_locations_is_empty: maybe_reinitialized_locations
211+
.is_empty(),
212+
};
209213
self.explain_captures(
210214
&mut err,
211215
span,
212216
move_span,
213217
move_spans,
214218
*moved_place,
215-
partially_str,
216-
loop_message,
217-
move_msg,
218-
is_loop_move,
219-
maybe_reinitialized_locations.is_empty(),
219+
msg_opt,
220220
);
221221
}
222222
seen_spans.insert(move_span);
@@ -282,12 +282,21 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
282282
}
283283

284284
if needs_note {
285-
let span = if let Some(local) = place.as_local() {
286-
Some(self.body.local_decls[local].source_info.span)
285+
if let Some(local) = place.as_local() {
286+
let span = self.body.local_decls[local].source_info.span;
287+
err.subdiagnostic(crate::session_diagnostics::TypeNoCopy::Label {
288+
is_partial_move,
289+
ty,
290+
place: &note_msg,
291+
span,
292+
});
287293
} else {
288-
None
294+
err.subdiagnostic(crate::session_diagnostics::TypeNoCopy::Note {
295+
is_partial_move,
296+
ty,
297+
place: &note_msg,
298+
});
289299
};
290-
self.note_type_does_not_implement_copy(&mut err, &note_msg, ty, span, partial_str);
291300
}
292301

293302
if let UseSpans::FnSelfUse {
@@ -827,11 +836,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
827836

828837
borrow_spans.var_path_only_subdiag(&mut err, crate::InitializationRequiringAction::Borrow);
829838

830-
move_spans.var_span_label(
831-
&mut err,
832-
format!("move occurs due to use{}", move_spans.describe()),
833-
"moved",
834-
);
839+
move_spans.var_subdiag(None, &mut err, None, |kind, var_span| {
840+
use crate::session_diagnostics::CaptureVarCause::*;
841+
match kind {
842+
Some(_) => MoveUseInGenerator { var_span },
843+
None => MoveUseInClosure { var_span },
844+
}
845+
});
835846

836847
self.explain_why_borrow_contains_point(location, borrow, None)
837848
.add_explanation_to_diagnostic(
@@ -868,13 +879,15 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
868879
borrow_span,
869880
&self.describe_any_place(borrow.borrowed_place.as_ref()),
870881
);
871-
borrow_spans.var_subdiag(&mut err, Some(borrow.kind), |kind, var_span| {
882+
borrow_spans.var_subdiag(None, &mut err, Some(borrow.kind), |kind, var_span| {
872883
use crate::session_diagnostics::CaptureVarCause::*;
873884
let place = &borrow.borrowed_place;
874885
let desc_place = self.describe_any_place(place.as_ref());
875886
match kind {
876-
Some(_) => BorrowUsePlaceGenerator { place: desc_place, var_span },
877-
None => BorrowUsePlaceClosure { place: desc_place, var_span },
887+
Some(_) => {
888+
BorrowUsePlaceGenerator { place: desc_place, var_span, is_single_var: true }
889+
}
890+
None => BorrowUsePlaceClosure { place: desc_place, var_span, is_single_var: true },
878891
}
879892
});
880893

@@ -988,16 +1001,26 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
9881001
immutable_section_description,
9891002
"mutably borrow",
9901003
);
991-
borrow_spans.var_span_label(
1004+
borrow_spans.var_subdiag(
1005+
None,
9921006
&mut err,
993-
format!(
994-
"borrow occurs due to use of {}{}",
995-
desc_place,
996-
borrow_spans.describe(),
997-
),
998-
"immutable",
1007+
Some(BorrowKind::Unique),
1008+
|kind, var_span| {
1009+
use crate::session_diagnostics::CaptureVarCause::*;
1010+
match kind {
1011+
Some(_) => BorrowUsePlaceGenerator {
1012+
place: desc_place,
1013+
var_span,
1014+
is_single_var: true,
1015+
},
1016+
None => BorrowUsePlaceClosure {
1017+
place: desc_place,
1018+
var_span,
1019+
is_single_var: true,
1020+
},
1021+
}
1022+
},
9991023
);
1000-
10011024
return err;
10021025
} else {
10031026
first_borrow_desc = "immutable ";
@@ -1070,32 +1093,48 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
10701093
};
10711094

10721095
if issued_spans == borrow_spans {
1073-
borrow_spans.var_span_label(
1074-
&mut err,
1075-
format!("borrows occur due to use of {}{}", desc_place, borrow_spans.describe(),),
1076-
gen_borrow_kind.describe_mutability(),
1077-
);
1096+
borrow_spans.var_subdiag(None, &mut err, Some(gen_borrow_kind), |kind, var_span| {
1097+
use crate::session_diagnostics::CaptureVarCause::*;
1098+
match kind {
1099+
Some(_) => BorrowUsePlaceGenerator {
1100+
place: desc_place,
1101+
var_span,
1102+
is_single_var: false,
1103+
},
1104+
None => {
1105+
BorrowUsePlaceClosure { place: desc_place, var_span, is_single_var: false }
1106+
}
1107+
}
1108+
});
10781109
} else {
1079-
let borrow_place = &issued_borrow.borrowed_place;
1080-
let borrow_place_desc = self.describe_any_place(borrow_place.as_ref());
1081-
issued_spans.var_span_label(
1110+
issued_spans.var_subdiag(
1111+
Some(&self.infcx.tcx.sess.parse_sess.span_diagnostic),
10821112
&mut err,
1083-
format!(
1084-
"first borrow occurs due to use of {}{}",
1085-
borrow_place_desc,
1086-
issued_spans.describe(),
1087-
),
1088-
issued_borrow.kind.describe_mutability(),
1113+
Some(issued_borrow.kind),
1114+
|kind, var_span| {
1115+
use crate::session_diagnostics::CaptureVarCause::*;
1116+
let borrow_place = &issued_borrow.borrowed_place;
1117+
let borrow_place_desc = self.describe_any_place(borrow_place.as_ref());
1118+
match kind {
1119+
Some(_) => {
1120+
FirstBorrowUsePlaceGenerator { place: borrow_place_desc, var_span }
1121+
}
1122+
None => FirstBorrowUsePlaceClosure { place: borrow_place_desc, var_span },
1123+
}
1124+
},
10891125
);
10901126

1091-
borrow_spans.var_span_label(
1127+
borrow_spans.var_subdiag(
1128+
Some(&self.infcx.tcx.sess.parse_sess.span_diagnostic),
10921129
&mut err,
1093-
format!(
1094-
"second borrow occurs due to use of {}{}",
1095-
desc_place,
1096-
borrow_spans.describe(),
1097-
),
1098-
gen_borrow_kind.describe_mutability(),
1130+
Some(gen_borrow_kind),
1131+
|kind, var_span| {
1132+
use crate::session_diagnostics::CaptureVarCause::*;
1133+
match kind {
1134+
Some(_) => SecondBorrowUsePlaceGenerator { place: desc_place, var_span },
1135+
None => SecondBorrowUsePlaceClosure { place: desc_place, var_span },
1136+
}
1137+
},
10991138
);
11001139
}
11011140

@@ -1731,9 +1770,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
17311770
err.span_label(borrow_span, "borrowed value does not live long enough");
17321771
err.span_label(drop_span, format!("`{}` dropped here while still borrowed", name));
17331772

1734-
let within = if borrow_spans.for_generator() { " by generator" } else { "" };
1735-
1736-
borrow_spans.args_span_label(&mut err, format!("value captured here{}", within));
1773+
borrow_spans.args_subdiag(&mut err, |args_span| {
1774+
crate::session_diagnostics::CaptureArgLabel::Capture {
1775+
is_within: borrow_spans.for_generator(),
1776+
args_span,
1777+
}
1778+
});
17371779

17381780
explanation.add_explanation_to_diagnostic(
17391781
self.infcx.tcx,
@@ -1947,9 +1989,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
19471989
None,
19481990
);
19491991

1950-
let within = if borrow_spans.for_generator() { " by generator" } else { "" };
1951-
1952-
borrow_spans.args_span_label(&mut err, format!("value captured here{}", within));
1992+
borrow_spans.args_subdiag(&mut err, |args_span| {
1993+
crate::session_diagnostics::CaptureArgLabel::Capture {
1994+
is_within: borrow_spans.for_generator(),
1995+
args_span,
1996+
}
1997+
});
19531998

19541999
err
19552000
}
@@ -2382,11 +2427,14 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
23822427
section,
23832428
"assign",
23842429
);
2385-
loan_spans.var_span_label(
2386-
&mut err,
2387-
format!("borrow occurs due to use{}", loan_spans.describe()),
2388-
loan.kind.describe_mutability(),
2389-
);
2430+
2431+
loan_spans.var_subdiag(None, &mut err, Some(loan.kind), |kind, var_span| {
2432+
use crate::session_diagnostics::CaptureVarCause::*;
2433+
match kind {
2434+
Some(_) => BorrowUseInGenerator { var_span },
2435+
None => BorrowUseInClosure { var_span },
2436+
}
2437+
});
23902438

23912439
self.buffer_error(err);
23922440

@@ -2396,11 +2444,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
23962444

23972445
let mut err = self.cannot_assign_to_borrowed(span, loan_span, &descr_place);
23982446

2399-
loan_spans.var_span_label(
2400-
&mut err,
2401-
format!("borrow occurs due to use{}", loan_spans.describe()),
2402-
loan.kind.describe_mutability(),
2403-
);
2447+
loan_spans.var_subdiag(None, &mut err, Some(loan.kind), |kind, var_span| {
2448+
use crate::session_diagnostics::CaptureVarCause::*;
2449+
match kind {
2450+
Some(_) => BorrowUseInGenerator { var_span },
2451+
None => BorrowUseInClosure { var_span },
2452+
}
2453+
});
24042454

24052455
self.explain_why_borrow_contains_point(location, loan, None).add_explanation_to_diagnostic(
24062456
self.infcx.tcx,

0 commit comments

Comments
 (0)