@@ -1477,42 +1477,55 @@ pub(crate) fn notable_traits_button<'a, 'tcx>(
1477
1477
return None ;
1478
1478
}
1479
1479
1480
- let did = ty. def_id ( cx. cache ( ) ) ?;
1481
-
1482
- // Box has pass-through impls for Read, Write, Iterator, and Future when the
1483
- // boxed type implements one of those. We don't want to treat every Box return
1484
- // as being notably an Iterator (etc), though, so we exempt it. Pin has the same
1485
- // issue, with a pass-through impl for Future.
1486
- if Some ( did) == cx. tcx ( ) . lang_items ( ) . owned_box ( )
1487
- || Some ( did) == cx. tcx ( ) . lang_items ( ) . pin_type ( )
1488
- {
1489
- return None ;
1480
+ let has_notable_trait = || {
1481
+ let Some ( did) = ty. def_id ( cx. cache ( ) ) else {
1482
+ return false ;
1483
+ } ;
1484
+
1485
+ // Box has pass-through impls for Read, Write, Iterator, and Future when the
1486
+ // boxed type implements one of those. We don't want to treat every Box return
1487
+ // as being notably an Iterator (etc), though, so we exempt it. Pin has the same
1488
+ // issue, with a pass-through impl for Future.
1489
+ if Some ( did) == cx. tcx ( ) . lang_items ( ) . owned_box ( )
1490
+ || Some ( did) == cx. tcx ( ) . lang_items ( ) . pin_type ( )
1491
+ {
1492
+ return false ;
1493
+ }
1494
+
1495
+ let Some ( impls) = cx. cache ( ) . impls . get ( & did) else {
1496
+ return false ;
1497
+ } ;
1498
+
1499
+ impls
1500
+ . iter ( )
1501
+ . map ( Impl :: inner_impl)
1502
+ . filter ( |impl_| {
1503
+ impl_. polarity == ty:: ImplPolarity :: Positive
1504
+ // Two different types might have the same did,
1505
+ // without actually being the same.
1506
+ && ty. is_doc_subtype_of ( & impl_. for_ , cx. cache ( ) )
1507
+ } )
1508
+ . filter_map ( |impl_| impl_. trait_ . as_ref ( ) )
1509
+ . filter_map ( |trait_| cx. cache ( ) . traits . get ( & trait_. def_id ( ) ) )
1510
+ . any ( |t| t. is_notable_trait ( cx. tcx ( ) ) )
1511
+ } ;
1512
+
1513
+ let mut types_with_notable_traits = cx. types_with_notable_traits . borrow_mut ( ) ;
1514
+ if !types_with_notable_traits. contains ( ty) {
1515
+ if has_notable_trait ( ) {
1516
+ types_with_notable_traits. insert ( ty. clone ( ) ) ;
1517
+ } else {
1518
+ return None ;
1519
+ }
1490
1520
}
1491
1521
1492
- let impls = cx. cache ( ) . impls . get ( & did) ?;
1493
- let has_notable_trait = impls
1494
- . iter ( )
1495
- . map ( Impl :: inner_impl)
1496
- . filter ( |impl_| {
1497
- impl_. polarity == ty:: ImplPolarity :: Positive
1498
- // Two different types might have the same did,
1499
- // without actually being the same.
1500
- && ty. is_doc_subtype_of ( & impl_. for_ , cx. cache ( ) )
1501
- } )
1502
- . filter_map ( |impl_| impl_. trait_ . as_ref ( ) )
1503
- . filter_map ( |trait_| cx. cache ( ) . traits . get ( & trait_. def_id ( ) ) )
1504
- . any ( |t| t. is_notable_trait ( cx. tcx ( ) ) ) ;
1505
-
1506
- has_notable_trait. then ( || {
1507
- cx. types_with_notable_traits . borrow_mut ( ) . insert ( ty. clone ( ) ) ;
1508
- fmt:: from_fn ( |f| {
1509
- write ! (
1510
- f,
1511
- " <a href=\" #\" class=\" tooltip\" data-notable-ty=\" {ty}\" >ⓘ</a>" ,
1512
- ty = Escape ( & format!( "{:#}" , ty. print( cx) ) ) ,
1513
- )
1514
- } )
1515
- } )
1522
+ Some ( fmt:: from_fn ( |f| {
1523
+ write ! (
1524
+ f,
1525
+ " <a href=\" #\" class=\" tooltip\" data-notable-ty=\" {ty}\" >ⓘ</a>" ,
1526
+ ty = Escape ( & format!( "{:#}" , ty. print( cx) ) ) ,
1527
+ )
1528
+ } ) )
1516
1529
}
1517
1530
1518
1531
fn notable_traits_decl ( ty : & clean:: Type , cx : & Context < ' _ > ) -> ( String , String ) {
0 commit comments