1 use rustc_hir as hir; 2 use rustc_middle::ty::{self, CanonicalUserType, TyCtxt, UserType}; 3 4 crate trait UserAnnotatedTyHelpers<'tcx> { tcx(&self) -> TyCtxt<'tcx>5 fn tcx(&self) -> TyCtxt<'tcx>; 6 typeck_results(&self) -> &ty::TypeckResults<'tcx>7 fn typeck_results(&self) -> &ty::TypeckResults<'tcx>; 8 9 /// Looks up the type associated with this hir-id and applies the 10 /// user-given substitutions; the hir-id must map to a suitable 11 /// type. user_substs_applied_to_ty_of_hir_id( &self, hir_id: hir::HirId, ) -> Option<CanonicalUserType<'tcx>>12 fn user_substs_applied_to_ty_of_hir_id( 13 &self, 14 hir_id: hir::HirId, 15 ) -> Option<CanonicalUserType<'tcx>> { 16 let user_provided_types = self.typeck_results().user_provided_types(); 17 let mut user_ty = *user_provided_types.get(hir_id)?; 18 debug!("user_subts_applied_to_ty_of_hir_id: user_ty={:?}", user_ty); 19 let ty = self.typeck_results().node_type(hir_id); 20 match ty.kind() { 21 ty::Adt(adt_def, ..) => { 22 if let UserType::TypeOf(ref mut did, _) = &mut user_ty.value { 23 *did = adt_def.did; 24 } 25 Some(user_ty) 26 } 27 ty::FnDef(..) => Some(user_ty), 28 _ => bug!("ty: {:?} should not have user provided type {:?} recorded ", ty, user_ty), 29 } 30 } 31 } 32