1- //! Conversion from AST representation of types to the `ty.rs` representation.
2- //! The main routine here is `ast_ty_to_ty()`; each use is parameterized by an
3- //! instance of `AstConv`.
1+ //! HIR ty lowering: Lowers type-system entities from HIR to `rustc_middle::ty` representation.
2+ //!
3+ //! Not to be confused with *AST lowering* which lowers AST constructs to HIR ones.
4+ //!
5+ //! The main routine here is `<dyn HirTyLowerer>::lower_ty()`. The other routines
6+ //! are defined on `dyn HirTyLowerer` (see [`HirTyLowerer`]).
7+ //!
8+ //! This module used to be called `astconv`.
49
510mod bounds;
611mod errors;
@@ -69,6 +74,9 @@ pub enum PredicateFilter {
6974 SelfAndAssociatedTypeBounds ,
7075}
7176
77+ /// A context which can lower type-system entities from [HIR][hir] to [`rustc_middle::ty`] representation.
78+ ///
79+ /// This trait used to be called `AstConv`.
7280pub trait HirTyLowerer < ' tcx > {
7381 fn tcx ( & self ) -> TyCtxt < ' tcx > ;
7482
@@ -127,6 +135,7 @@ pub trait HirTyLowerer<'tcx> {
127135 ) -> Ty < ' tcx > ;
128136
129137 /// Returns `AdtDef` if `ty` is an ADT.
138+ ///
130139 /// Note that `ty` might be a projection type that needs normalization.
131140 /// This used to get the enum variants in scope of the type.
132141 /// For example, `Self::A` could refer to an associated type
@@ -214,6 +223,7 @@ pub struct GenericArgCountResult {
214223 pub correct : Result < ( ) , GenericArgCountMismatch > ,
215224}
216225
226+ /// A context which can lower HIR's [`GenericArg`] to `rustc_middle`'s [`ty::GenericArg`].
217227pub trait GenericArgsLowerer < ' a , ' tcx > {
218228 fn args_for_def_id ( & mut self , def_id : DefId ) -> ( Option < & ' a GenericArgs < ' tcx > > , bool ) ;
219229
@@ -309,7 +319,6 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
309319 if let Some ( b) = item_segment. args ( ) . bindings . first ( ) {
310320 prohibit_assoc_ty_binding ( self . tcx ( ) , b. span , Some ( ( item_segment, span) ) ) ;
311321 }
312-
313322 args
314323 }
315324
@@ -593,7 +602,7 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
593602 & self ,
594603 generic_args : & ' a hir:: GenericArgs < ' tcx > ,
595604 ) -> Vec < LoweredBinding < ' a , ' tcx > > {
596- // Convert associated-type bindings or constraints into a separate vector.
605+ // Lower associated-type bindings or constraints into a separate vector.
597606 // Example: Given this:
598607 //
599608 // T: Iterator<Item = u32>
@@ -655,11 +664,9 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
655664 None ,
656665 ty:: BoundConstness :: NotConst ,
657666 ) ;
658-
659667 if let Some ( b) = item_segment. args ( ) . bindings . first ( ) {
660668 prohibit_assoc_ty_binding ( self . tcx ( ) , b. span , Some ( ( item_segment, span) ) ) ;
661669 }
662-
663670 args
664671 }
665672
@@ -786,7 +793,7 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
786793 self_ty : Ty < ' tcx > ,
787794 trait_segment : & hir:: PathSegment < ' tcx > ,
788795 is_impl : bool ,
789- // FIXME(effects) move all host param things in astconv to hir lowering
796+ // FIXME(effects): Move all host param things in HIR ty lowering to AST lowering.
790797 constness : ty:: BoundConstness ,
791798 ) -> ty:: TraitRef < ' tcx > {
792799 let ( generic_args, _) = self . lower_args_for_trait_ref (
@@ -973,10 +980,11 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
973980 reported
974981 }
975982
976- // Search for a bound on a type parameter which includes the associated item
977- // given by `assoc_name`. `ty_param_def_id` is the `DefId` of the type parameter
978- // This function will fail if there are no suitable bounds or there is
979- // any ambiguity.
983+ /// Search for a bound on a type parameter which includes the associated item given by `assoc_name`.
984+ ///
985+ /// `ty_param_def_id` is the `DefId` of the type parameter.
986+ /// This function will fail if there are no suitable bounds or there is any ambiguity.
987+ #[ instrument( level = "debug" , skip( self ) , ret) ]
980988 fn find_bound_for_assoc_item (
981989 & self ,
982990 ty_param_def_id : LocalDefId ,
@@ -1015,8 +1023,8 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
10151023 )
10161024 }
10171025
1018- // Checks that `bounds` contains exactly one element and reports appropriate
1019- // errors otherwise.
1026+ // FIXME(fmease): This also *resolves* the bound. Update docs!
1027+ /// Checks that `bounds` contains exactly one element and reports appropriate errors otherwise.
10201028 #[ instrument( level = "debug" , skip( self , all_candidates, ty_param_name, binding) , ret) ]
10211029 fn one_bound_for_assoc_item < I > (
10221030 & self ,
@@ -1133,12 +1141,14 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
11331141 Ok ( bound)
11341142 }
11351143
1136- // Create a type from a path to an associated type or to an enum variant.
1137- // For a path `A::B::C::D`, `qself_ty` and `qself_def` are the type and def for `A::B::C`
1138- // and item_segment is the path segment for `D`. We return a type and a def for
1139- // the whole path.
1140- // Will fail except for `T::A` and `Self::A`; i.e., if `qself_ty`/`qself_def` are not a type
1141- // parameter or `Self`.
1144+ /// Create a type from a path to an associated type or to an enum variant.
1145+ ///
1146+ /// For a path `A::B::C::D`, `qself_ty` and `qself` are the type and def for `A::B::C`
1147+ /// and item_segment is the path segment for `D`. We return a type and a def for
1148+ /// the whole path.
1149+ ///
1150+ /// Will fail except for `T::A` and `Self::A`; i.e., if `qself_ty`/`qself` are not a type
1151+ /// parameter or `Self`.
11421152 // NOTE: When this function starts resolving `Trait::AssocTy` successfully
11431153 // it should also start reporting the `BARE_TRAIT_OBJECTS` lint.
11441154 #[ instrument( level = "debug" , skip( self , hir_ref_id, span, qself, assoc_segment) , fields( assoc_ident=?assoc_segment. ident) , ret) ]
@@ -1436,8 +1446,9 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
14361446 // Don't attempt to look up inherent associated types when the feature is not enabled.
14371447 // Theoretically it'd be fine to do so since we feature-gate their definition site.
14381448 // However, due to current limitations of the implementation (caused by us performing
1439- // selection in AstConv), IATs can lead to cycle errors (#108491, #110106) which mask the
1440- // feature-gate error, needlessly confusing users that use IATs by accident (#113265).
1449+ // selection during HIR ty lowering instead of in the trait solver), IATs can lead to cycle
1450+ // errors (#108491, #110106) which mask the feature-gate error, needlessly confusing users
1451+ // who use IATs by accident (#113265).
14411452 if !tcx. features ( ) . inherent_associated_types {
14421453 return Ok ( None ) ;
14431454 }
@@ -2013,7 +2024,7 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
20132024 path_segs
20142025 }
20152026
2016- /// Check a type `Path` and convert it to a `Ty`.
2027+ /// Check a type `Path` and lower it to a `Ty`.
20172028 pub fn lower_res_to_ty (
20182029 & self ,
20192030 opt_self_ty : Option < Ty < ' tcx > > ,
@@ -2053,7 +2064,7 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
20532064 self . lower_path_to_ty ( span, did, path. segments . last ( ) . unwrap ( ) )
20542065 }
20552066 Res :: Def ( kind @ DefKind :: Variant , def_id) if permit_variants => {
2056- // Convert "variant type" as if it were a real type.
2067+ // Lower "variant type" as if it were a real type.
20572068 // The resulting `Ty` is type of the variant's enum for now.
20582069 assert_eq ! ( opt_self_ty, None ) ;
20592070
@@ -2254,8 +2265,8 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
22542265 }
22552266 }
22562267
2257- // Converts a hir id corresponding to a type parameter to
2258- // a early-bound `ty::Param` or late-bound `ty::Bound`.
2268+ /// Lower a `HirId` corresponding to a type parameter to an early-bound
2269+ /// [ `ty::Param`] or late-bound [ `ty::Bound`] .
22592270 pub ( crate ) fn lower_type_param ( & self , hir_id : hir:: HirId ) -> Ty < ' tcx > {
22602271 let tcx = self . tcx ( ) ;
22612272 match tcx. named_bound_var ( hir_id) {
@@ -2279,8 +2290,8 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
22792290 }
22802291 }
22812292
2282- // Converts a hir id corresponding to a const parameter to
2283- // a early-bound ` ConstKind::Param` or late-bound ` ConstKind::Bound`.
2293+ /// Lower a `HirId` corresponding to a const parameter to an early-bound
2294+ /// [`ty:: ConstKind::Param`] or late-bound [`ty:: ConstKind::Bound`] .
22842295 pub ( crate ) fn lower_const_param ( & self , hir_id : hir:: HirId , param_ty : Ty < ' tcx > ) -> Const < ' tcx > {
22852296 let tcx = self . tcx ( ) ;
22862297 match tcx. named_bound_var ( hir_id) {
@@ -2421,8 +2432,10 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
24212432 }
24222433 }
24232434
2424- /// Turns a `hir::Ty` into a `Ty`. For diagnostics' purposes we keep track of whether trait
2425- /// objects are borrowed like `&dyn Trait` to avoid emitting redundant errors.
2435+ /// Lowers a [`hir::Ty`] to a [`Ty`].
2436+ ///
2437+ /// For diagnostics' purposes we keep track of whether trait objects are
2438+ /// borrowed like `&dyn Trait` to avoid emitting redundant errors.
24262439 #[ instrument( level = "debug" , skip( self ) , ret) ]
24272440 fn lower_ty_inner ( & self , ast_ty : & hir:: Ty < ' tcx > , borrowed : bool , in_path : bool ) -> Ty < ' tcx > {
24282441 let tcx = self . tcx ( ) ;
@@ -2822,7 +2835,9 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
28222835 }
28232836
28242837 /// Given the bounds on an object, determines what single region bound (if any) we can
2825- /// use to summarize this type. The basic idea is that we will use the bound the user
2838+ /// use to summarize this type.
2839+ ///
2840+ /// The basic idea is that we will use the bound the user
28262841 /// provided, if they provided one, and otherwise search the supertypes of trait bounds
28272842 /// for region bounds. It may be that we can derive no bound at all, in which case
28282843 /// we return `None`.
0 commit comments