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`]).
4
7
5
8
mod bounds;
6
9
mod errors;
@@ -69,6 +72,9 @@ pub enum PredicateFilter {
69
72
SelfAndAssociatedTypeBounds ,
70
73
}
71
74
75
+ /// A context which can lower type-system entities from [HIR][hir] to [`rustc_middle::ty`] representation.
76
+ ///
77
+ /// This used to be called `AstConv`.
72
78
pub trait HirTyLowerer < ' tcx > {
73
79
fn tcx ( & self ) -> TyCtxt < ' tcx > ;
74
80
@@ -127,6 +133,7 @@ pub trait HirTyLowerer<'tcx> {
127
133
) -> Ty < ' tcx > ;
128
134
129
135
/// Returns `AdtDef` if `ty` is an ADT.
136
+ ///
130
137
/// Note that `ty` might be a projection type that needs normalization.
131
138
/// This used to get the enum variants in scope of the type.
132
139
/// For example, `Self::A` could refer to an associated type
@@ -214,6 +221,7 @@ pub struct GenericArgCountResult {
214
221
pub correct : Result < ( ) , GenericArgCountMismatch > ,
215
222
}
216
223
224
+ /// A context which can lower HIR's [`GenericArg`] to `rustc_middle`'s [`ty::GenericArg`].
217
225
pub trait GenericArgsLowerer < ' a , ' tcx > {
218
226
fn args_for_def_id ( & mut self , def_id : DefId ) -> ( Option < & ' a GenericArgs < ' tcx > > , bool ) ;
219
227
@@ -309,7 +317,6 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
309
317
if let Some ( b) = item_segment. args ( ) . bindings . first ( ) {
310
318
prohibit_assoc_ty_binding ( self . tcx ( ) , b. span , Some ( ( item_segment, span) ) ) ;
311
319
}
312
-
313
320
args
314
321
}
315
322
@@ -593,7 +600,7 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
593
600
& self ,
594
601
generic_args : & ' a hir:: GenericArgs < ' tcx > ,
595
602
) -> Vec < LoweredBinding < ' a , ' tcx > > {
596
- // Convert associated-type bindings or constraints into a separate vector.
603
+ // Lower associated-type bindings or constraints into a separate vector.
597
604
// Example: Given this:
598
605
//
599
606
// T: Iterator<Item = u32>
@@ -655,11 +662,9 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
655
662
None ,
656
663
ty:: BoundConstness :: NotConst ,
657
664
) ;
658
-
659
665
if let Some ( b) = item_segment. args ( ) . bindings . first ( ) {
660
666
prohibit_assoc_ty_binding ( self . tcx ( ) , b. span , Some ( ( item_segment, span) ) ) ;
661
667
}
662
-
663
668
args
664
669
}
665
670
@@ -786,7 +791,7 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
786
791
self_ty : Ty < ' tcx > ,
787
792
trait_segment : & hir:: PathSegment < ' tcx > ,
788
793
is_impl : bool ,
789
- // FIXME(effects) move all host param things in astconv to hir lowering
794
+ // FIXME(effects): Move all host param things in HIR/ty lowering to AST lowering.
790
795
constness : ty:: BoundConstness ,
791
796
) -> ty:: TraitRef < ' tcx > {
792
797
let ( generic_args, _) = self . lower_args_for_trait_ref (
@@ -973,10 +978,11 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
973
978
reported
974
979
}
975
980
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.
981
+ /// Search for a bound on a type parameter which includes the associated item given by `assoc_name`.
982
+ ///
983
+ /// `ty_param_def_id` is the `DefId` of the type parameter.
984
+ /// This function will fail if there are no suitable bounds or there is any ambiguity.
985
+ #[ instrument( level = "debug" , skip( self ) , ret) ]
980
986
fn find_bound_for_assoc_item (
981
987
& self ,
982
988
ty_param_def_id : LocalDefId ,
@@ -1015,8 +1021,8 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
1015
1021
)
1016
1022
}
1017
1023
1018
- // Checks that `bounds` contains exactly one element and reports appropriate
1019
- // errors otherwise.
1024
+ // FIXME(fmease): This also *resolves* the bound. Update docs!
1025
+ /// Checks that `bounds` contains exactly one element and reports appropriate errors otherwise.
1020
1026
#[ instrument( level = "debug" , skip( self , all_candidates, ty_param_name, binding) , ret) ]
1021
1027
fn one_bound_for_assoc_item < I > (
1022
1028
& self ,
@@ -1133,12 +1139,14 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
1133
1139
Ok ( bound)
1134
1140
}
1135
1141
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`.
1142
+ /// Create a type from a path to an associated type or to an enum variant.
1143
+ ///
1144
+ /// For a path `A::B::C::D`, `qself_ty` and `qself` are the type and def for `A::B::C`
1145
+ /// and item_segment is the path segment for `D`. We return a type and a def for
1146
+ /// the whole path.
1147
+ ///
1148
+ /// Will fail except for `T::A` and `Self::A`; i.e., if `qself_ty`/`qself` are not a type
1149
+ /// parameter or `Self`.
1142
1150
// NOTE: When this function starts resolving `Trait::AssocTy` successfully
1143
1151
// it should also start reporting the `BARE_TRAIT_OBJECTS` lint.
1144
1152
#[ instrument( level = "debug" , skip( self , hir_ref_id, span, qself, assoc_segment) , fields( assoc_ident=?assoc_segment. ident) , ret) ]
@@ -1436,8 +1444,9 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
1436
1444
// Don't attempt to look up inherent associated types when the feature is not enabled.
1437
1445
// Theoretically it'd be fine to do so since we feature-gate their definition site.
1438
1446
// 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).
1447
+ // selection during HIR/ty lowering instead of in the trait solver), IATs can lead to cycle
1448
+ // errors (#108491, #110106) which mask the feature-gate error, needlessly confusing users
1449
+ // who use IATs by accident (#113265).
1441
1450
if !tcx. features ( ) . inherent_associated_types {
1442
1451
return Ok ( None ) ;
1443
1452
}
@@ -2014,7 +2023,7 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
2014
2023
path_segs
2015
2024
}
2016
2025
2017
- /// Check a type `Path` and convert it to a `Ty`.
2026
+ /// Check a type `Path` and lower it to a `Ty`.
2018
2027
pub fn lower_res_to_ty (
2019
2028
& self ,
2020
2029
opt_self_ty : Option < Ty < ' tcx > > ,
@@ -2054,7 +2063,7 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
2054
2063
self . lower_path_to_ty ( span, did, path. segments . last ( ) . unwrap ( ) )
2055
2064
}
2056
2065
Res :: Def ( kind @ DefKind :: Variant , def_id) if permit_variants => {
2057
- // Convert "variant type" as if it were a real type.
2066
+ // Lower "variant type" as if it were a real type.
2058
2067
// The resulting `Ty` is type of the variant's enum for now.
2059
2068
assert_eq ! ( opt_self_ty, None ) ;
2060
2069
@@ -2255,8 +2264,8 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
2255
2264
}
2256
2265
}
2257
2266
2258
- // Converts a hir id corresponding to a type parameter to
2259
- // a early-bound `ty::Param` or late-bound `ty::Bound`.
2267
+ /// Lower a `HirId` corresponding to a type parameter to an early-bound
2268
+ /// [ `ty::Param`] or late-bound [ `ty::Bound`] .
2260
2269
pub ( crate ) fn lower_ty_param ( & self , hir_id : hir:: HirId ) -> Ty < ' tcx > {
2261
2270
let tcx = self . tcx ( ) ;
2262
2271
match tcx. named_bound_var ( hir_id) {
@@ -2280,8 +2289,8 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
2280
2289
}
2281
2290
}
2282
2291
2283
- // Converts a hir id corresponding to a const parameter to
2284
- // a early-bound ` ConstKind::Param` or late-bound ` ConstKind::Bound`.
2292
+ /// Lower a `HirId` corresponding to a const parameter to an early-bound
2293
+ /// [`ty:: ConstKind::Param`] or late-bound [`ty:: ConstKind::Bound`] .
2285
2294
pub ( crate ) fn lower_const_param ( & self , hir_id : hir:: HirId , param_ty : Ty < ' tcx > ) -> Const < ' tcx > {
2286
2295
let tcx = self . tcx ( ) ;
2287
2296
match tcx. named_bound_var ( hir_id) {
@@ -2422,8 +2431,10 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
2422
2431
}
2423
2432
}
2424
2433
2425
- /// Turns a `hir::Ty` into a `Ty`. For diagnostics' purposes we keep track of whether trait
2426
- /// objects are borrowed like `&dyn Trait` to avoid emitting redundant errors.
2434
+ /// Lowers a [`hir::Ty`] to a [`Ty`].
2435
+ ///
2436
+ /// For diagnostics' purposes we keep track of whether trait objects are
2437
+ /// borrowed like `&dyn Trait` to avoid emitting redundant errors.
2427
2438
#[ instrument( level = "debug" , skip( self ) , ret) ]
2428
2439
fn lower_ty_inner ( & self , ast_ty : & hir:: Ty < ' tcx > , borrowed : bool , in_path : bool ) -> Ty < ' tcx > {
2429
2440
let tcx = self . tcx ( ) ;
@@ -2812,7 +2823,9 @@ impl<'o, 'tcx> dyn HirTyLowerer<'tcx> + 'o {
2812
2823
}
2813
2824
2814
2825
/// Given the bounds on an object, determines what single region bound (if any) we can
2815
- /// use to summarize this type. The basic idea is that we will use the bound the user
2826
+ /// use to summarize this type.
2827
+ ///
2828
+ /// The basic idea is that we will use the bound the user
2816
2829
/// provided, if they provided one, and otherwise search the supertypes of trait bounds
2817
2830
/// for region bounds. It may be that we can derive no bound at all, in which case
2818
2831
/// we return `None`.
0 commit comments