Skip to content

Commit 94cb442

Browse files
committed
migrate var_span_label to var_subdiag
(blessed to pass CI) eager translation question? unbless 1 capture reason args_span_label to args_subdiag closure twice notes bless blesssd unbless 2 note on type no 'Copy' Imut in name, squash later plural ftl, squash later is_partial rename, squash_todo eager_closure twice rewrite hist var_subdiag with eager option
1 parent 41e0363 commit 94cb442

File tree

6 files changed

+579
-252
lines changed

6 files changed

+579
-252
lines changed

compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs

+113-66
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
127127
&& used_place.is_prefix_of(moved_place.as_ref())
128128
});
129129

130+
//FIXME: move to ftl
130131
let partial_str = if is_partial_move { "partial " } else { "" };
131132
let partially_str = if is_partial_move { "partially " } else { "" };
132133

@@ -180,13 +181,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
180181
let move_spans = self.move_spans(moved_place.as_ref(), move_out.source);
181182
let move_span = move_spans.args_or_use();
182183

183-
let move_msg = if move_spans.for_closure() { " into closure" } else { "" };
184+
let is_move_msg = move_spans.for_closure();
184185

185-
let loop_message = if location == move_out.source || move_site.traversed_back_edge {
186-
", in previous iteration of loop"
187-
} else {
188-
""
189-
};
186+
let is_loop_message = location == move_out.source || move_site.traversed_back_edge;
190187

191188
if location == move_out.source {
192189
is_loop_move = true;
@@ -203,9 +200,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
203200
move_span,
204201
move_spans,
205202
*moved_place,
206-
partially_str,
207-
loop_message,
208-
move_msg,
203+
is_partial_move,
204+
is_loop_message,
205+
is_move_msg,
209206
is_loop_move,
210207
maybe_reinitialized_locations.is_empty(),
211208
);
@@ -277,12 +274,21 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
277274
}
278275

279276
if needs_note {
280-
let span = if let Some(local) = place.as_local() {
281-
Some(self.body.local_decls[local].source_info.span)
277+
if let Some(local) = place.as_local() {
278+
let span = self.body.local_decls[local].source_info.span;
279+
err.subdiagnostic(crate::session_diagnostics::TypeNoCopy::Label {
280+
is_partial_move,
281+
ty,
282+
place: &note_msg,
283+
span,
284+
});
282285
} else {
283-
None
286+
err.subdiagnostic(crate::session_diagnostics::TypeNoCopy::Note {
287+
is_partial_move,
288+
ty,
289+
place: &note_msg,
290+
});
284291
};
285-
self.note_type_does_not_implement_copy(&mut err, &note_msg, ty, span, partial_str);
286292
}
287293

288294
if let UseSpans::FnSelfUse {
@@ -836,11 +842,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
836842

837843
borrow_spans.var_path_only_subdiag(&mut err, crate::InitializationRequiringAction::Borrow);
838844

839-
move_spans.var_span_label(
840-
&mut err,
841-
format!("move occurs due to use{}", move_spans.describe()),
842-
"moved",
843-
);
845+
move_spans.var_subdiag(None, &mut err, None, |kind, var_span| {
846+
use crate::session_diagnostics::CaptureVarCause::*;
847+
match kind {
848+
Some(_) => MoveUseInGenerator { var_span },
849+
None => MoveUseInClosure { var_span },
850+
}
851+
});
844852

845853
self.explain_why_borrow_contains_point(location, borrow, None)
846854
.add_explanation_to_diagnostic(
@@ -877,13 +885,15 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
877885
borrow_span,
878886
&self.describe_any_place(borrow.borrowed_place.as_ref()),
879887
);
880-
borrow_spans.var_subdiag(&mut err, Some(borrow.kind), |kind, var_span| {
888+
borrow_spans.var_subdiag(None, &mut err, Some(borrow.kind), |kind, var_span| {
881889
use crate::session_diagnostics::CaptureVarCause::*;
882890
let place = &borrow.borrowed_place;
883891
let desc_place = self.describe_any_place(place.as_ref());
884892
match kind {
885-
Some(_) => BorrowUsePlaceGenerator { place: desc_place, var_span },
886-
None => BorrowUsePlaceClosure { place: desc_place, var_span },
893+
Some(_) => {
894+
BorrowUsePlaceGenerator { place: desc_place, var_span, is_single_var: true }
895+
}
896+
None => BorrowUsePlaceClosure { place: desc_place, var_span, is_single_var: true },
887897
}
888898
});
889899

@@ -991,16 +1001,26 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
9911001
immutable_section_description,
9921002
"mutably borrow",
9931003
);
994-
borrow_spans.var_span_label(
1004+
borrow_spans.var_subdiag(
1005+
None,
9951006
&mut err,
996-
format!(
997-
"borrow occurs due to use of {}{}",
998-
desc_place,
999-
borrow_spans.describe(),
1000-
),
1001-
"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+
},
10021023
);
1003-
10041024
return err;
10051025
} else {
10061026
first_borrow_desc = "immutable ";
@@ -1073,32 +1093,48 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
10731093
};
10741094

10751095
if issued_spans == borrow_spans {
1076-
borrow_spans.var_span_label(
1077-
&mut err,
1078-
format!("borrows occur due to use of {}{}", desc_place, borrow_spans.describe(),),
1079-
gen_borrow_kind.describe_mutability(),
1080-
);
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+
});
10811109
} else {
1082-
let borrow_place = &issued_borrow.borrowed_place;
1083-
let borrow_place_desc = self.describe_any_place(borrow_place.as_ref());
1084-
issued_spans.var_span_label(
1110+
issued_spans.var_subdiag(
1111+
Some(&self.infcx.tcx.sess.parse_sess.span_diagnostic),
10851112
&mut err,
1086-
format!(
1087-
"first borrow occurs due to use of {}{}",
1088-
borrow_place_desc,
1089-
issued_spans.describe(),
1090-
),
1091-
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+
},
10921125
);
10931126

1094-
borrow_spans.var_span_label(
1127+
borrow_spans.var_subdiag(
1128+
Some(&self.infcx.tcx.sess.parse_sess.span_diagnostic),
10951129
&mut err,
1096-
format!(
1097-
"second borrow occurs due to use of {}{}",
1098-
desc_place,
1099-
borrow_spans.describe(),
1100-
),
1101-
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+
},
11021138
);
11031139
}
11041140

@@ -1572,9 +1608,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
15721608
err.span_label(borrow_span, "borrowed value does not live long enough");
15731609
err.span_label(drop_span, format!("`{}` dropped here while still borrowed", name));
15741610

1575-
let within = if borrow_spans.for_generator() { " by generator" } else { "" };
1576-
1577-
borrow_spans.args_span_label(&mut err, format!("value captured here{}", within));
1611+
borrow_spans.args_subdiag(&mut err, |args_span| {
1612+
crate::session_diagnostics::CaptureArgLabel::Capture {
1613+
is_within: borrow_spans.for_generator(),
1614+
args_span,
1615+
}
1616+
});
15781617

15791618
explanation.add_explanation_to_diagnostic(
15801619
self.infcx.tcx,
@@ -1788,9 +1827,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
17881827
None,
17891828
);
17901829

1791-
let within = if borrow_spans.for_generator() { " by generator" } else { "" };
1792-
1793-
borrow_spans.args_span_label(&mut err, format!("value captured here{}", within));
1830+
borrow_spans.args_subdiag(&mut err, |args_span| {
1831+
crate::session_diagnostics::CaptureArgLabel::Capture {
1832+
is_within: borrow_spans.for_generator(),
1833+
args_span,
1834+
}
1835+
});
17941836

17951837
err
17961838
}
@@ -2214,11 +2256,14 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
22142256
section,
22152257
"assign",
22162258
);
2217-
loan_spans.var_span_label(
2218-
&mut err,
2219-
format!("borrow occurs due to use{}", loan_spans.describe()),
2220-
loan.kind.describe_mutability(),
2221-
);
2259+
2260+
loan_spans.var_subdiag(None, &mut err, Some(loan.kind), |kind, var_span| {
2261+
use crate::session_diagnostics::CaptureVarCause::*;
2262+
match kind {
2263+
Some(_) => BorrowUseInGenerator { var_span },
2264+
None => BorrowUseInClosure { var_span },
2265+
}
2266+
});
22222267

22232268
self.buffer_error(err);
22242269

@@ -2228,11 +2273,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
22282273

22292274
let mut err = self.cannot_assign_to_borrowed(span, loan_span, &descr_place);
22302275

2231-
loan_spans.var_span_label(
2232-
&mut err,
2233-
format!("borrow occurs due to use{}", loan_spans.describe()),
2234-
loan.kind.describe_mutability(),
2235-
);
2276+
loan_spans.var_subdiag(None, &mut err, Some(loan.kind), |kind, var_span| {
2277+
use crate::session_diagnostics::CaptureVarCause::*;
2278+
match kind {
2279+
Some(_) => BorrowUseInGenerator { var_span },
2280+
None => BorrowUseInClosure { var_span },
2281+
}
2282+
});
22362283

22372284
self.explain_why_borrow_contains_point(location, loan, None).add_explanation_to_diagnostic(
22382285
self.infcx.tcx,

0 commit comments

Comments
 (0)