@@ -166,16 +166,16 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> {
166
166
. clone ( )
167
167
}
168
168
169
- // This method calculates two things: Lifetime constraints of the form 'a: 'b,
170
- // and region constraints of the form ReVar : 'a
171
- //
172
- // This is essentially a simplified version of lexical_region_resolve. However,
173
- // handle_lifetimes determines what *needs be* true in order for an impl to hold.
174
- // lexical_region_resolve, along with much of the rest of the compiler, is concerned
175
- // with determining if a given set up constraints/predicates *are* met, given some
176
- // starting conditions (e.g., user-provided code). For this reason, it's easier
177
- // to perform the calculations we need on our own, rather than trying to make
178
- // existing inference/solver code do what we want.
169
+ /// This method calculates two things: Lifetime constraints of the form ` 'a: 'b` ,
170
+ /// and region constraints of the form `RegionVid : 'a`
171
+ ///
172
+ /// This is essentially a simplified version of lexical_region_resolve. However,
173
+ /// handle_lifetimes determines what *needs be* true in order for an impl to hold.
174
+ /// lexical_region_resolve, along with much of the rest of the compiler, is concerned
175
+ /// with determining if a given set up constraints/predicates *are* met, given some
176
+ /// starting conditions (e.g., user-provided code). For this reason, it's easier
177
+ /// to perform the calculations we need on our own, rather than trying to make
178
+ /// existing inference/solver code do what we want.
179
179
fn handle_lifetimes < ' cx > (
180
180
regions : & RegionConstraintData < ' cx > ,
181
181
names_map : & FxHashMap < Symbol , Lifetime > ,
@@ -410,15 +410,15 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> {
410
410
. collect ( )
411
411
}
412
412
413
- // Converts the calculated ParamEnv and lifetime information to a clean::Generics, suitable for
414
- // display on the docs page. Cleaning the Predicates produces sub-optimal `WherePredicate`s,
415
- // so we fix them up:
416
- //
417
- // * Multiple bounds for the same type are coalesced into one: e.g., ' T: Copy', ' T: Debug'
418
- // becomes ' T: Copy + Debug'
419
- // * Fn bounds are handled specially - instead of leaving it as ' T: Fn(), <T as Fn::Output> =
420
- // K' , we use the dedicated syntax ' T: Fn() -> K'
421
- // * We explicitly add a ' ?Sized' bound if we didn't find any ' Sized' predicates for a type
413
+ /// Converts the calculated ` ParamEnv` and lifetime information to a [` clean::Generics`](Generics) , suitable for
414
+ /// display on the docs page. Cleaning the ` Predicates` produces sub-optimal [ `WherePredicate`] s,
415
+ /// so we fix them up:
416
+ ///
417
+ /// * Multiple bounds for the same type are coalesced into one: e.g., ` T: Copy`, ` T: Debug`
418
+ /// becomes ` T: Copy + Debug`
419
+ /// * `Fn` bounds are handled specially - instead of leaving it as ` T: Fn(), <T as Fn::Output> =
420
+ /// K` , we use the dedicated syntax ` T: Fn() -> K`
421
+ /// * We explicitly add a ` ?Sized` bound if we didn't find any ` Sized` predicates for a type
422
422
fn param_env_to_generics (
423
423
& mut self ,
424
424
item_def_id : DefId ,
@@ -632,11 +632,11 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> {
632
632
Generics { params : generic_params, where_predicates : existing_predicates }
633
633
}
634
634
635
- // Ensure that the predicates are in a consistent order. The precise
636
- // ordering doesn't actually matter, but it's important that
637
- // a given set of predicates always appears in the same order -
638
- // both for visual consistency between 'rustdoc' runs, and to
639
- // make writing tests much easier
635
+ /// Ensure that the predicates are in a consistent order. The precise
636
+ /// ordering doesn't actually matter, but it's important that
637
+ /// a given set of predicates always appears in the same order -
638
+ /// both for visual consistency between 'rustdoc' runs, and to
639
+ /// make writing tests much easier
640
640
#[ inline]
641
641
fn sort_where_predicates ( & self , mut predicates : & mut Vec < WherePredicate > ) {
642
642
// We should never have identical bounds - and if we do,
@@ -645,11 +645,11 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> {
645
645
self . unstable_debug_sort ( & mut predicates) ;
646
646
}
647
647
648
- // Ensure that the bounds are in a consistent order. The precise
649
- // ordering doesn't actually matter, but it's important that
650
- // a given set of bounds always appears in the same order -
651
- // both for visual consistency between 'rustdoc' runs, and to
652
- // make writing tests much easier
648
+ /// Ensure that the bounds are in a consistent order. The precise
649
+ /// ordering doesn't actually matter, but it's important that
650
+ /// a given set of bounds always appears in the same order -
651
+ /// both for visual consistency between 'rustdoc' runs, and to
652
+ /// make writing tests much easier
653
653
#[ inline]
654
654
fn sort_where_bounds ( & self , mut bounds : & mut Vec < GenericBound > ) {
655
655
// We should never have identical bounds - and if we do,
@@ -658,33 +658,33 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> {
658
658
self . unstable_debug_sort ( & mut bounds) ;
659
659
}
660
660
661
- // This might look horrendously hacky, but it's actually not that bad.
662
- //
663
- // For performance reasons, we use several different FxHashMaps
664
- // in the process of computing the final set of where predicates.
665
- // However, the iteration order of a HashMap is completely unspecified.
666
- // In fact, the iteration of an FxHashMap can even vary between platforms,
667
- // since FxHasher has different behavior for 32-bit and 64-bit platforms.
668
- //
669
- // Obviously, it's extremely undesirable for documentation rendering
670
- // to be dependent on the platform it's run on. Apart from being confusing
671
- // to end users, it makes writing tests much more difficult, as predicates
672
- // can appear in any order in the final result.
673
- //
674
- // To solve this problem, we sort WherePredicates and GenericBounds
675
- // by their Debug string. The thing to keep in mind is that we don't really
676
- // care what the final order is - we're synthesizing an impl or bound
677
- // ourselves, so any order can be considered equally valid. By sorting the
678
- // predicates and bounds, however, we ensure that for a given codebase, all
679
- // auto-trait impls always render in exactly the same way.
680
- //
681
- // Using the Debug implementation for sorting prevents us from needing to
682
- // write quite a bit of almost entirely useless code (e.g., how should two
683
- // Types be sorted relative to each other). It also allows us to solve the
684
- // problem for both WherePredicates and GenericBounds at the same time. This
685
- // approach is probably somewhat slower, but the small number of items
686
- // involved (impls rarely have more than a few bounds) means that it
687
- // shouldn't matter in practice.
661
+ /// This might look horrendously hacky, but it's actually not that bad.
662
+ ///
663
+ /// For performance reasons, we use several different FxHashMaps
664
+ /// in the process of computing the final set of where predicates.
665
+ /// However, the iteration order of a HashMap is completely unspecified.
666
+ /// In fact, the iteration of an FxHashMap can even vary between platforms,
667
+ /// since FxHasher has different behavior for 32-bit and 64-bit platforms.
668
+ ///
669
+ /// Obviously, it's extremely undesirable for documentation rendering
670
+ /// to be dependent on the platform it's run on. Apart from being confusing
671
+ /// to end users, it makes writing tests much more difficult, as predicates
672
+ /// can appear in any order in the final result.
673
+ ///
674
+ /// To solve this problem, we sort WherePredicates and GenericBounds
675
+ /// by their Debug string. The thing to keep in mind is that we don't really
676
+ /// care what the final order is - we're synthesizing an impl or bound
677
+ /// ourselves, so any order can be considered equally valid. By sorting the
678
+ /// predicates and bounds, however, we ensure that for a given codebase, all
679
+ /// auto-trait impls always render in exactly the same way.
680
+ ///
681
+ /// Using the Debug implementation for sorting prevents us from needing to
682
+ /// write quite a bit of almost entirely useless code (e.g., how should two
683
+ /// Types be sorted relative to each other). It also allows us to solve the
684
+ /// problem for both WherePredicates and GenericBounds at the same time. This
685
+ /// approach is probably somewhat slower, but the small number of items
686
+ /// involved (impls rarely have more than a few bounds) means that it
687
+ /// shouldn't matter in practice.
688
688
fn unstable_debug_sort < T : Debug > ( & self , vec : & mut Vec < T > ) {
689
689
vec. sort_by_cached_key ( |x| format ! ( "{:?}" , x) )
690
690
}
@@ -705,7 +705,7 @@ fn region_name(region: Region<'_>) -> Option<Symbol> {
705
705
}
706
706
}
707
707
708
- // Replaces all ReVars in a type with ty::Region' s, using the provided map
708
+ /// Replaces all [`ty::RegionVid`]s in a type with [` ty::Region`] s, using the provided map.
709
709
struct RegionReplacer < ' a , ' tcx > {
710
710
vid_to_region : & ' a FxHashMap < ty:: RegionVid , ty:: Region < ' tcx > > ,
711
711
tcx : TyCtxt < ' tcx > ,
0 commit comments