Closure capture borrow diagnostics for disjoint captures
This commit is contained in:
parent
6e2a34474b
commit
08c4fbcea7
56 changed files with 532 additions and 152 deletions
|
@ -683,6 +683,15 @@ impl BorrowKind {
|
|||
BorrowKind::Mut { allow_two_phase_borrow } => allow_two_phase_borrow,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn describe_mutability(&self) -> String {
|
||||
match *self {
|
||||
BorrowKind::Shared | BorrowKind::Shallow | BorrowKind::Unique => {
|
||||
"immutable".to_string()
|
||||
}
|
||||
BorrowKind::Mut { .. } => "mutable".to_string(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
@ -2369,6 +2378,7 @@ impl<'tcx> Debug for Rvalue<'tcx> {
|
|||
};
|
||||
let mut struct_fmt = fmt.debug_struct(&name);
|
||||
|
||||
// FIXME: This should be a list of capture names/places
|
||||
if let Some(upvars) = tcx.upvars_mentioned(def_id) {
|
||||
for (&var_id, place) in iter::zip(upvars.keys(), places) {
|
||||
let var_name = tcx.hir().name(var_id);
|
||||
|
@ -2388,6 +2398,7 @@ impl<'tcx> Debug for Rvalue<'tcx> {
|
|||
let name = format!("[generator@{:?}]", tcx.hir().span(hir_id));
|
||||
let mut struct_fmt = fmt.debug_struct(&name);
|
||||
|
||||
// FIXME: This should be a list of capture names/places
|
||||
if let Some(upvars) = tcx.upvars_mentioned(def_id) {
|
||||
for (&var_id, place) in iter::zip(upvars.keys(), places) {
|
||||
let var_name = tcx.hir().name(var_id);
|
||||
|
|
|
@ -151,6 +151,10 @@ pub struct CapturedPlace<'tcx> {
|
|||
}
|
||||
|
||||
impl CapturedPlace<'tcx> {
|
||||
pub fn to_string(&self, tcx: TyCtxt<'tcx>) -> String {
|
||||
place_to_string_for_capture(tcx, &self.place)
|
||||
}
|
||||
|
||||
/// Returns the hir-id of the root variable for the captured place.
|
||||
/// e.g., if `a.b.c` was captured, would return the hir-id for `a`.
|
||||
pub fn get_root_variable(&self) -> hir::HirId {
|
||||
|
@ -168,6 +172,22 @@ impl CapturedPlace<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
/// Return span pointing to use that resulted in selecting the captured path
|
||||
pub fn get_path_span(&self, tcx: TyCtxt<'tcx>) -> Span {
|
||||
if let Some(path_expr_id) = self.info.path_expr_id {
|
||||
tcx.hir().span(path_expr_id)
|
||||
} else if let Some(capture_kind_expr_id) = self.info.capture_kind_expr_id {
|
||||
tcx.hir().span(capture_kind_expr_id)
|
||||
} else {
|
||||
// Fallback on upvars mentioned if neither path or capture expr id is captured
|
||||
|
||||
// Safe to unwrap since we know this place is captured by the closure, therefore the closure must have upvars.
|
||||
tcx.upvars_mentioned(self.get_closure_local_def_id()).unwrap()
|
||||
[&self.get_root_variable()]
|
||||
.span
|
||||
}
|
||||
}
|
||||
|
||||
/// Return span pointing to use that resulted in selecting the current capture kind
|
||||
pub fn get_capture_kind_span(&self, tcx: TyCtxt<'tcx>) -> Span {
|
||||
if let Some(capture_kind_expr_id) = self.info.capture_kind_expr_id {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue