From 735d1bd5e685a53df8d6b58ed5fd8637896465ba Mon Sep 17 00:00:00 2001 From: "Zack M. Davis" Date: Sat, 2 Jun 2018 18:50:40 -0700 Subject: [PATCH] use HirId in middle::mem_categorization::cmt_, and consequences of that For the HirIdification initiative #50928. --- src/librustc/middle/expr_use_visitor.rs | 10 +-- src/librustc/middle/mem_categorization.rs | 87 +++++++++---------- src/librustc/middle/region.rs | 10 +-- src/librustc_borrowck/borrowck/check_loans.rs | 8 +- .../borrowck/gather_loans/mod.rs | 2 +- .../borrowck/gather_loans/move_error.rs | 6 +- src/librustc_borrowck/borrowck/mod.rs | 12 ++- src/librustc_typeck/check/regionck.rs | 2 +- 8 files changed, 71 insertions(+), 66 deletions(-) diff --git a/src/librustc/middle/expr_use_visitor.rs b/src/librustc/middle/expr_use_visitor.rs index 718445bd356..6ccf09f4dfc 100644 --- a/src/librustc/middle/expr_use_visitor.rs +++ b/src/librustc/middle/expr_use_visitor.rs @@ -319,7 +319,7 @@ pub fn consume_body(&mut self, body: &hir::Body) { let fn_body_scope_r = self.tcx().mk_region(ty::ReScope(region::Scope::Node(body.value.hir_id.local_id))); let arg_cmt = Rc::new(self.mc.cat_rvalue( - arg.id, + arg.hir_id, arg.pat.span, fn_body_scope_r, // Args live only as long as the fn body. arg_ty)); @@ -860,7 +860,7 @@ fn walk_pat(&mut self, cmt_discr: mc::cmt<'tcx>, pat: &hir::Pat, match_mode: Mat // Each match binding is effectively an assignment to the // binding being produced. let def = Def::Local(canonical_id); - if let Ok(ref binding_cmt) = mc.cat_def(pat.id, pat.span, pat_ty, def) { + if let Ok(ref binding_cmt) = mc.cat_def(pat.hir_id, pat.span, pat_ty, def) { delegate.mutate(pat.id, pat.span, binding_cmt, MutateMode::Init); } @@ -923,7 +923,7 @@ fn walk_captures(&mut self, closure_expr: &hir::Expr, fn_decl_span: Span) { closure_expr_id: closure_def_id.to_local(), }; let upvar_capture = self.mc.tables.upvar_capture(upvar_id); - let cmt_var = return_if_err!(self.cat_captured_var(closure_expr.id, + let cmt_var = return_if_err!(self.cat_captured_var(closure_expr.hir_id, fn_decl_span, freevar)); match upvar_capture { @@ -948,7 +948,7 @@ fn walk_captures(&mut self, closure_expr: &hir::Expr, fn_decl_span: Span) { } fn cat_captured_var(&mut self, - closure_id: ast::NodeId, + closure_hir_id: hir::HirId, closure_span: Span, upvar: &hir::Freevar) -> mc::McResult> { @@ -956,7 +956,7 @@ fn cat_captured_var(&mut self, // caller's perspective let var_hir_id = self.tcx().hir.node_to_hir_id(upvar.var_id()); let var_ty = self.mc.node_ty(var_hir_id)?; - self.mc.cat_def(closure_id, closure_span, var_ty, upvar.def) + self.mc.cat_def(closure_hir_id, closure_span, var_ty, upvar.def) } } diff --git a/src/librustc/middle/mem_categorization.rs b/src/librustc/middle/mem_categorization.rs index 6d4e9a1b767..7e8a81457c9 100644 --- a/src/librustc/middle/mem_categorization.rs +++ b/src/librustc/middle/mem_categorization.rs @@ -189,7 +189,7 @@ pub enum Note { // fashion. For more details, see the method `cat_pattern` #[derive(Clone, Debug, PartialEq)] pub struct cmt_<'tcx> { - pub id: ast::NodeId, // id of expr/pat producing this value + pub hir_id: hir::HirId, // HIR id of expr/pat producing this value pub span: Span, // span of same expr/pat pub cat: Categorization<'tcx>, // categorization of expr pub mutbl: MutabilityCategory, // mutability of expr as place @@ -271,18 +271,18 @@ pub fn immutability_blame(&self) -> Option> { } } -pub trait ast_node { - fn id(&self) -> ast::NodeId; +pub trait HirNode { + fn hir_id(&self) -> hir::HirId; fn span(&self) -> Span; } -impl ast_node for hir::Expr { - fn id(&self) -> ast::NodeId { self.id } +impl HirNode for hir::Expr { + fn hir_id(&self) -> hir::HirId { self.hir_id } fn span(&self) -> Span { self.span } } -impl ast_node for hir::Pat { - fn id(&self) -> ast::NodeId { self.id } +impl HirNode for hir::Pat { + fn hir_id(&self) -> hir::HirId { self.hir_id } fn span(&self) -> Span { self.span } } @@ -610,7 +610,7 @@ fn cat_expr_adjusted_with(&self, expr: &hir::Expr, ty: target, mutbl: deref.mutbl, }); - self.cat_rvalue_node(expr.id, expr.span, ref_ty) + self.cat_rvalue_node(expr.hir_id, expr.span, ref_ty) } else { previous()? }); @@ -625,7 +625,7 @@ fn cat_expr_adjusted_with(&self, expr: &hir::Expr, adjustment::Adjust::Borrow(_) | adjustment::Adjust::Unsize => { // Result is an rvalue. - Ok(self.cat_rvalue_node(expr.id, expr.span, target)) + Ok(self.cat_rvalue_node(expr.hir_id, expr.span, target)) } } } @@ -669,8 +669,8 @@ pub fn cat_expr_unadjusted(&self, expr: &hir::Expr) -> McResult> { } hir::ExprPath(ref qpath) => { - let def = self.tables.qpath_def(qpath, expr.hir_id); - self.cat_def(expr.id, expr.span, expr_ty, def) + let def = self.tables.qpath_def(qpath, expr.hir_id); + self.cat_def(expr.hir_id, expr.span, expr_ty, def) } hir::ExprType(ref e, _) => { @@ -688,35 +688,35 @@ pub fn cat_expr_unadjusted(&self, expr: &hir::Expr) -> McResult> { hir::ExprLit(..) | hir::ExprBreak(..) | hir::ExprContinue(..) | hir::ExprStruct(..) | hir::ExprRepeat(..) | hir::ExprInlineAsm(..) | hir::ExprBox(..) => { - Ok(self.cat_rvalue_node(expr.id(), expr.span(), expr_ty)) + Ok(self.cat_rvalue_node(expr.hir_id, expr.span, expr_ty)) } } } pub fn cat_def(&self, - id: ast::NodeId, + hir_id: hir::HirId, span: Span, expr_ty: Ty<'tcx>, def: Def) -> McResult> { - debug!("cat_def: id={} expr={:?} def={:?}", - id, expr_ty, def); + debug!("cat_def: id={:?} expr={:?} def={:?}", + hir_id, expr_ty, def); match def { Def::StructCtor(..) | Def::VariantCtor(..) | Def::Const(..) | Def::AssociatedConst(..) | Def::Fn(..) | Def::Method(..) => { - Ok(self.cat_rvalue_node(id, span, expr_ty)) + Ok(self.cat_rvalue_node(hir_id, span, expr_ty)) } Def::Static(def_id, mutbl) => { // `#[thread_local]` statics may not outlive the current function. for attr in &self.tcx.get_attrs(def_id)[..] { if attr.check_name("thread_local") { - return Ok(self.cat_rvalue_node(id, span, expr_ty)); + return Ok(self.cat_rvalue_node(hir_id, span, expr_ty)); } } Ok(cmt_ { - id:id, + hir_id, span:span, cat:Categorization::StaticItem, mutbl: if mutbl { McDeclared } else { McImmutable}, @@ -726,12 +726,12 @@ pub fn cat_def(&self, } Def::Upvar(var_id, _, fn_node_id) => { - self.cat_upvar(id, span, var_id, fn_node_id) + self.cat_upvar(hir_id, span, var_id, fn_node_id) } Def::Local(vid) => { Ok(cmt_ { - id, + hir_id, span, cat: Categorization::Local(vid), mutbl: MutabilityCategory::from_local(self.tcx, self.tables, vid), @@ -747,7 +747,7 @@ pub fn cat_def(&self, // Categorize an upvar, complete with invisible derefs of closure // environment and upvar reference as appropriate. fn cat_upvar(&self, - id: ast::NodeId, + hir_id: hir::HirId, span: Span, var_id: ast::NodeId, fn_node_id: ast::NodeId) @@ -814,7 +814,7 @@ fn cat_upvar(&self, // from the environment (perhaps we should eventually desugar // this field further, but it will do for now). let cmt_result = cmt_ { - id, + hir_id, span, cat: Categorization::Upvar(Upvar {id: upvar_id, kind: kind}), mutbl: var_mutbl, @@ -830,10 +830,10 @@ fn cat_upvar(&self, cmt_result } ty::ClosureKind::FnMut => { - self.env_deref(id, span, upvar_id, var_mutbl, ty::MutBorrow, cmt_result) + self.env_deref(hir_id, span, upvar_id, var_mutbl, ty::MutBorrow, cmt_result) } ty::ClosureKind::Fn => { - self.env_deref(id, span, upvar_id, var_mutbl, ty::ImmBorrow, cmt_result) + self.env_deref(hir_id, span, upvar_id, var_mutbl, ty::ImmBorrow, cmt_result) } }; @@ -848,7 +848,7 @@ fn cat_upvar(&self, ty::UpvarCapture::ByRef(upvar_borrow) => { let ptr = BorrowedPtr(upvar_borrow.kind, upvar_borrow.region); cmt_ { - id, + hir_id, span, cat: Categorization::Deref(Rc::new(cmt_result), ptr), mutbl: MutabilityCategory::from_borrow_kind(upvar_borrow.kind), @@ -864,7 +864,7 @@ fn cat_upvar(&self, } fn env_deref(&self, - id: ast::NodeId, + hir_id: hir::HirId, span: Span, upvar_id: ty::UpvarId, upvar_mutbl: MutabilityCategory, @@ -908,7 +908,7 @@ fn env_deref(&self, } let ret = cmt_ { - id, + hir_id, span, cat: Categorization::Deref(Rc::new(cmt_result), env_ptr), mutbl: deref_mutbl, @@ -932,17 +932,16 @@ pub fn temporary_scope(&self, id: hir::ItemLocalId) -> ty::Region<'tcx> { } pub fn cat_rvalue_node(&self, - id: ast::NodeId, + hir_id: hir::HirId, span: Span, expr_ty: Ty<'tcx>) -> cmt_<'tcx> { debug!( "cat_rvalue_node(id={:?}, span={:?}, expr_ty={:?})", - id, + hir_id, span, expr_ty, ); - let hir_id = self.tcx.hir.node_to_hir_id(id); let promotable = self.rvalue_promotable_map.as_ref().map(|m| m.contains(&hir_id.local_id)) .unwrap_or(false); @@ -970,18 +969,18 @@ pub fn cat_rvalue_node(&self, } else { self.temporary_scope(hir_id.local_id) }; - let ret = self.cat_rvalue(id, span, re, expr_ty); + let ret = self.cat_rvalue(hir_id, span, re, expr_ty); debug!("cat_rvalue_node ret {:?}", ret); ret } pub fn cat_rvalue(&self, - cmt_id: ast::NodeId, + cmt_hir_id: hir::HirId, span: Span, temp_scope: ty::Region<'tcx>, expr_ty: Ty<'tcx>) -> cmt_<'tcx> { let ret = cmt_ { - id:cmt_id, + hir_id: cmt_hir_id, span:span, cat:Categorization::Rvalue(temp_scope), mutbl:McDeclared, @@ -992,7 +991,7 @@ pub fn cat_rvalue(&self, ret } - pub fn cat_field(&self, + pub fn cat_field(&self, node: &N, base_cmt: cmt<'tcx>, f_index: usize, @@ -1000,7 +999,7 @@ pub fn cat_field(&self, f_ty: Ty<'tcx>) -> cmt_<'tcx> { let ret = cmt_ { - id: node.id(), + hir_id: node.hir_id(), span: node.span(), mutbl: base_cmt.mutbl.inherit(), cat: Categorization::Interior(base_cmt, @@ -1042,13 +1041,13 @@ fn cat_overloaded_place( mutbl, }); - let base_cmt = Rc::new(self.cat_rvalue_node(expr.id, expr.span, ref_ty)); + let base_cmt = Rc::new(self.cat_rvalue_node(expr.hir_id, expr.span, ref_ty)); self.cat_deref(expr, base_cmt, note) } pub fn cat_deref( &self, - node: &impl ast_node, + node: &impl HirNode, base_cmt: cmt<'tcx>, note: Note, ) -> McResult> { @@ -1074,7 +1073,7 @@ pub fn cat_deref( ref ty => bug!("unexpected type in cat_deref: {:?}", ty) }; let ret = cmt_ { - id: node.id(), + hir_id: node.hir_id(), span: node.span(), // For unique ptrs, we inherit mutability from the owning reference. mutbl: MutabilityCategory::from_pointer_kind(base_cmt.mutbl, ptr), @@ -1086,7 +1085,7 @@ pub fn cat_deref( Ok(ret) } - fn cat_index(&self, + fn cat_index(&self, elt: &N, base_cmt: cmt<'tcx>, element_ty: Ty<'tcx>, @@ -1106,7 +1105,7 @@ fn cat_index(&self, //! presuming that `base_cmt` is not of fixed-length type. //! //! # Parameters - //! - `elt`: the AST node being indexed + //! - `elt`: the HIR node being indexed //! - `base_cmt`: the cmt of `elt` let interior_elem = InteriorElement(context); @@ -1115,14 +1114,14 @@ fn cat_index(&self, return Ok(ret); } - pub fn cat_imm_interior(&self, + pub fn cat_imm_interior(&self, node: &N, base_cmt: cmt<'tcx>, interior_ty: Ty<'tcx>, interior: InteriorKind) -> cmt_<'tcx> { let ret = cmt_ { - id: node.id(), + hir_id: node.hir_id(), span: node.span(), mutbl: base_cmt.mutbl.inherit(), cat: Categorization::Interior(base_cmt, interior), @@ -1133,7 +1132,7 @@ pub fn cat_imm_interior(&self, ret } - pub fn cat_downcast_if_needed(&self, + pub fn cat_downcast_if_needed(&self, node: &N, base_cmt: cmt<'tcx>, variant_did: DefId) @@ -1143,7 +1142,7 @@ pub fn cat_downcast_if_needed(&self, if self.tcx.adt_def(base_did).variants.len() != 1 { let base_ty = base_cmt.ty; let ret = Rc::new(cmt_ { - id: node.id(), + hir_id: node.hir_id(), span: node.span(), mutbl: base_cmt.mutbl.inherit(), cat: Categorization::Downcast(base_cmt, variant_did), diff --git a/src/librustc/middle/region.rs b/src/librustc/middle/region.rs index c7249c0aa20..a11c8f5dc04 100644 --- a/src/librustc/middle/region.rs +++ b/src/librustc/middle/region.rs @@ -459,7 +459,7 @@ struct RegionResolutionVisitor<'a, 'tcx: 'a> { } struct ExprLocatorVisitor { - id: ast::NodeId, + hir_id: hir::HirId, result: Option, expr_and_pat_count: usize, } @@ -476,7 +476,7 @@ fn visit_pat(&mut self, pat: &'tcx Pat) { self.expr_and_pat_count += 1; - if pat.id == self.id { + if pat.hir_id == self.hir_id { self.result = Some(self.expr_and_pat_count); } } @@ -494,7 +494,7 @@ fn visit_expr(&mut self, expr: &'tcx Expr) { self.expr_and_pat_count, expr); - if expr.id == self.id { + if expr.hir_id == self.hir_id { self.result = Some(self.expr_and_pat_count); } } @@ -778,11 +778,11 @@ pub fn yield_in_scope(&self, scope: Scope) -> Option<(Span, usize)> { /// `scope` must be inside the body. pub fn yield_in_scope_for_expr(&self, scope: Scope, - expr: ast::NodeId, + expr_hir_id: hir::HirId, body: &'tcx hir::Body) -> Option { self.yield_in_scope(scope).and_then(|(span, count)| { let mut visitor = ExprLocatorVisitor { - id: expr, + hir_id: expr_hir_id, result: None, expr_and_pat_count: 0, }; diff --git a/src/librustc_borrowck/borrowck/check_loans.rs b/src/librustc_borrowck/borrowck/check_loans.rs index 79baf0ec151..046318b3619 100644 --- a/src/librustc_borrowck/borrowck/check_loans.rs +++ b/src/librustc_borrowck/borrowck/check_loans.rs @@ -168,8 +168,7 @@ fn mutate(&mut self, // have to be *FULLY* initialized, but we still // must be careful lest it contains derefs of // pointers. - let hir_id = self.tcx().hir.node_to_hir_id(assignee_cmt.id); - self.check_if_assigned_path_is_moved(hir_id.local_id, + self.check_if_assigned_path_is_moved(assignee_cmt.hir_id.local_id, assignment_span, MovedInUse, &lp); @@ -178,8 +177,7 @@ fn mutate(&mut self, // In a case like `path += 1`, then path must be // fully initialized, since we will read it before // we write it. - let hir_id = self.tcx().hir.node_to_hir_id(assignee_cmt.id); - self.check_if_path_is_moved(hir_id.local_id, + self.check_if_path_is_moved(assignee_cmt.hir_id.local_id, assignment_span, MovedInUse, &lp); @@ -448,7 +446,7 @@ pub fn borrow_of_local_data<'tcx>(cmt: &mc::cmt_<'tcx>) -> bool { if let Some(yield_span) = self.bccx .region_scope_tree .yield_in_scope_for_expr(scope, - cmt.id, + cmt.hir_id, self.bccx.body) { self.bccx.cannot_borrow_across_generator_yield(borrow_span, yield_span, diff --git a/src/librustc_borrowck/borrowck/gather_loans/mod.rs b/src/librustc_borrowck/borrowck/gather_loans/mod.rs index a74eba39955..d0881413871 100644 --- a/src/librustc_borrowck/borrowck/gather_loans/mod.rs +++ b/src/librustc_borrowck/borrowck/gather_loans/mod.rs @@ -283,7 +283,7 @@ fn guarantee_assignment_valid(&mut self, .local_id, assignment_span, lp, - self.bccx.tcx.hir.node_to_hir_id(cmt.id).local_id, + cmt.hir_id.local_id, mode); } None => { diff --git a/src/librustc_borrowck/borrowck/gather_loans/move_error.rs b/src/librustc_borrowck/borrowck/gather_loans/move_error.rs index 84931907964..f221565c7f3 100644 --- a/src/librustc_borrowck/borrowck/gather_loans/move_error.rs +++ b/src/librustc_borrowck/borrowck/gather_loans/move_error.rs @@ -112,15 +112,15 @@ fn group_errors_with_same_origin<'tcx>(errors: &Vec>) fn append_to_grouped_errors<'tcx>(grouped_errors: &mut Vec>, error: &MoveError<'tcx>) { - let move_from_id = error.move_from.id; - debug!("append_to_grouped_errors(move_from_id={})", move_from_id); + let move_from_id = error.move_from.hir_id; + debug!("append_to_grouped_errors(move_from_id={:?})", move_from_id); let move_to = if error.move_to.is_some() { vec![error.move_to.clone().unwrap()] } else { Vec::new() }; for ge in &mut *grouped_errors { - if move_from_id == ge.move_from.id && error.move_to.is_some() { + if move_from_id == ge.move_from.hir_id && error.move_to.is_some() { debug!("appending move_to to list"); ge.move_to_places.extend(move_to); return diff --git a/src/librustc_borrowck/borrowck/mod.rs b/src/librustc_borrowck/borrowck/mod.rs index 500903c1c3b..4bd8e6afa76 100644 --- a/src/librustc_borrowck/borrowck/mod.rs +++ b/src/librustc_borrowck/borrowck/mod.rs @@ -899,7 +899,11 @@ fn report_bckerr(&self, err: &BckError<'a, 'tcx>) { }; self.note_and_explain_mutbl_error(&mut db, &err, &error_span); - self.note_immutability_blame(&mut db, err.cmt.immutability_blame(), err.cmt.id); + self.note_immutability_blame( + &mut db, + err.cmt.immutability_blame(), + self.tcx.hir.hir_to_node_id(err.cmt.hir_id) + ); db.emit(); } err_out_of_scope(super_scope, sub_scope, cause) => { @@ -1105,7 +1109,11 @@ pub fn report_aliasability_violation(&self, Origin::Ast) } }; - self.note_immutability_blame(&mut err, blame, cmt.id); + self.note_immutability_blame( + &mut err, + blame, + self.tcx.hir.hir_to_node_id(cmt.hir_id) + ); if is_closure { err.help("closures behind references must be called via `&mut`"); diff --git a/src/librustc_typeck/check/regionck.rs b/src/librustc_typeck/check/regionck.rs index f6fcf2fcd48..e489c4d4a46 100644 --- a/src/librustc_typeck/check/regionck.rs +++ b/src/librustc_typeck/check/regionck.rs @@ -1018,7 +1018,7 @@ fn link_fn_args(&self, body_scope: region::Scope, args: &[hir::Arg]) { let arg_ty = self.node_ty(arg.hir_id); let re_scope = self.tcx.mk_region(ty::ReScope(body_scope)); let arg_cmt = self.with_mc(|mc| { - Rc::new(mc.cat_rvalue(arg.id, arg.pat.span, re_scope, arg_ty)) + Rc::new(mc.cat_rvalue(arg.hir_id, arg.pat.span, re_scope, arg_ty)) }); debug!("arg_ty={:?} arg_cmt={:?} arg={:?}", arg_ty, -- 2.44.0