]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_mir_build/src/thir/util.rs
Rollup merge of #76227 - CDirkx:const-poll, r=KodrAus
[rust.git] / compiler / rustc_mir_build / src / thir / util.rs
1 use rustc_hir as hir;
2 use rustc_middle::ty::{self, CanonicalUserType, TyCtxt, UserType};
3
4 crate trait UserAnnotatedTyHelpers<'tcx> {
5     fn tcx(&self) -> TyCtxt<'tcx>;
6
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.
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 }