]>
git.proxmox.com Git - rustc.git/blob - src/librustc_mir/borrow_check/nll/region_infer/error_reporting/var_name.rs
1 use crate::borrow_check
::nll
::region_infer
::RegionInferenceContext
;
2 use crate::borrow_check
::nll
::ToRegionVid
;
3 use crate::borrow_check
::Upvar
;
4 use rustc
::mir
::{Local, Body}
;
5 use rustc
::ty
::{RegionVid, TyCtxt}
;
6 use rustc_index
::vec
::Idx
;
7 use syntax
::source_map
::Span
;
8 use syntax_pos
::symbol
::Symbol
;
10 impl<'tcx
> RegionInferenceContext
<'tcx
> {
11 crate fn get_var_name_and_span_for_region(
17 ) -> Option
<(Option
<Symbol
>, Span
)> {
18 debug
!("get_var_name_and_span_for_region(fr={:?})", fr
);
19 assert
!(self.universal_regions
.is_universal_region(fr
));
21 debug
!("get_var_name_and_span_for_region: attempting upvar");
22 self.get_upvar_index_for_region(tcx
, fr
)
25 self.get_upvar_name_and_span_for_region(tcx
, upvars
, index
);
29 debug
!("get_var_name_and_span_for_region: attempting argument");
30 self.get_argument_index_for_region(tcx
, fr
)
31 .map(|index
| self.get_argument_name_and_span_for_region(body
, index
))
35 /// Search the upvars (if any) to find one that references fr. Return its index.
36 crate fn get_upvar_index_for_region(&self, tcx
: TyCtxt
<'tcx
>, fr
: RegionVid
) -> Option
<usize> {
37 let upvar_index
= self
41 .position(|upvar_ty
| {
42 debug
!("get_upvar_index_for_region: upvar_ty={:?}", upvar_ty
);
43 tcx
.any_free_region_meets(&upvar_ty
, |r
| {
44 let r
= r
.to_region_vid();
45 debug
!("get_upvar_index_for_region: r={:?} fr={:?}", r
, fr
);
57 "get_upvar_index_for_region: found {:?} in upvar {} which has type {:?}",
58 fr
, upvar_index
, upvar_ty
,
64 /// Given the index of an upvar, finds its name and the span from where it was
66 crate fn get_upvar_name_and_span_for_region(
72 let upvar_hir_id
= upvars
[upvar_index
].var_hir_id
;
73 debug
!("get_upvar_name_and_span_for_region: upvar_hir_id={:?}", upvar_hir_id
);
75 let upvar_name
= tcx
.hir().name(upvar_hir_id
);
76 let upvar_span
= tcx
.hir().span(upvar_hir_id
);
77 debug
!("get_upvar_name_and_span_for_region: upvar_name={:?} upvar_span={:?}",
78 upvar_name
, upvar_span
);
80 (upvar_name
, upvar_span
)
83 /// Search the argument types for one that references fr (which should be a free region).
84 /// Returns Some(_) with the index of the input if one is found.
86 /// N.B., in the case of a closure, the index is indexing into the signature as seen by the
87 /// user - in particular, index 0 is not the implicit self parameter.
88 crate fn get_argument_index_for_region(
93 let implicit_inputs
= self.universal_regions
.defining_ty
.implicit_inputs();
94 let argument_index
= self
96 .unnormalized_input_tys
98 .skip(implicit_inputs
)
101 "get_argument_index_for_region: arg_ty = {:?}",
104 tcx
.any_free_region_meets(arg_ty
, |r
| r
.to_region_vid() == fr
)
108 "get_argument_index_for_region: found {:?} in argument {} which has type {:?}",
109 fr
, argument_index
, self.universal_regions
.unnormalized_input_tys
[argument_index
],
115 /// Given the index of an argument, finds its name (if any) and the span from where it was
117 crate fn get_argument_name_and_span_for_region(
120 argument_index
: usize,
121 ) -> (Option
<Symbol
>, Span
) {
122 let implicit_inputs
= self.universal_regions
.defining_ty
.implicit_inputs();
123 let argument_local
= Local
::new(implicit_inputs
+ argument_index
+ 1);
124 debug
!("get_argument_name_and_span_for_region: argument_local={:?}", argument_local
);
126 let argument_name
= body
.local_decls
[argument_local
].name
;
127 let argument_span
= body
.local_decls
[argument_local
].source_info
.span
;
128 debug
!("get_argument_name_and_span_for_region: argument_name={:?} argument_span={:?}",
129 argument_name
, argument_span
);
131 (argument_name
, argument_span
)