@@ -497,7 +497,7 @@ fn render_notable_trait_comment(
497
497
let mut needs_impl_header = true ;
498
498
for ( trait_, assoc_types) in notable_traits {
499
499
desc. push_str ( if mem:: take ( & mut needs_impl_header) {
500
- " // notable traits implemented : "
500
+ " // Implements notable traits: "
501
501
} else {
502
502
", "
503
503
} ) ;
@@ -530,6 +530,7 @@ fn type_info(
530
530
if let Some ( res) = closure_ty ( sema, config, & ty) {
531
531
return Some ( res) ;
532
532
} ;
533
+ let db = sema. db ;
533
534
let TypeInfo { original, adjusted } = ty;
534
535
let mut res = HoverResult :: default ( ) ;
535
536
let mut targets: Vec < hir:: ModuleDef > = Vec :: new ( ) ;
@@ -538,29 +539,64 @@ fn type_info(
538
539
targets. push ( item) ;
539
540
}
540
541
} ;
541
- walk_and_push_ty ( sema. db , & original, & mut push_new_def) ;
542
- let mut desc = match render_notable_trait_comment ( sema. db , & notable_traits ( sema. db , & original) )
543
- {
544
- Some ( desc) => desc + "\n " ,
545
- None => String :: new ( ) ,
546
- } ;
547
- desc += & if let Some ( adjusted_ty) = adjusted {
548
- walk_and_push_ty ( sema. db , & adjusted_ty, & mut push_new_def) ;
549
- let original = original. display ( sema. db ) . to_string ( ) ;
550
- let adjusted = adjusted_ty. display ( sema. db ) . to_string ( ) ;
542
+ walk_and_push_ty ( db, & original, & mut push_new_def) ;
543
+
544
+ res. markup = if let Some ( adjusted_ty) = adjusted {
545
+ walk_and_push_ty ( db, & adjusted_ty, & mut push_new_def) ;
546
+
547
+ let notable = {
548
+ let mut desc = String :: new ( ) ;
549
+ let mut needs_impl_header = true ;
550
+ for ( trait_, assoc_types) in notable_traits ( db, & original) {
551
+ desc. push_str ( if mem:: take ( & mut needs_impl_header) {
552
+ "Implements Notable Traits: "
553
+ } else {
554
+ ", "
555
+ } ) ;
556
+ format_to ! ( desc, "{}" , trait_. name( db) . display( db) , ) ;
557
+ if !assoc_types. is_empty ( ) {
558
+ desc. push ( '<' ) ;
559
+ format_to ! (
560
+ desc,
561
+ "{}" ,
562
+ assoc_types. into_iter( ) . format_with( ", " , |( ty, name) , f| {
563
+ f( & name. display( db) ) ?;
564
+ f( & " = " ) ?;
565
+ match ty {
566
+ Some ( ty) => f( & ty. display( db) ) ,
567
+ None => f( & "?" ) ,
568
+ }
569
+ } )
570
+ ) ;
571
+ desc. push ( '>' ) ;
572
+ }
573
+ }
574
+ if !desc. is_empty ( ) {
575
+ desc. push ( '\n' ) ;
576
+ }
577
+ desc
578
+ } ;
579
+
580
+ let original = original. display ( db) . to_string ( ) ;
581
+ let adjusted = adjusted_ty. display ( db) . to_string ( ) ;
551
582
let static_text_diff_len = "Coerced to: " . len ( ) - "Type: " . len ( ) ;
552
583
format ! (
553
- "```text\n Type: {:>apad$}\n Coerced to: {:>opad$}\n ```\n " ,
584
+ "```text\n Type: {:>apad$}\n Coerced to: {:>opad$}\n {notable} ```\n " ,
554
585
original,
555
586
adjusted,
556
587
apad = static_text_diff_len + adjusted. len( ) . max( original. len( ) ) ,
557
588
opad = original. len( ) ,
558
589
)
590
+ . into ( )
559
591
} else {
560
- Markup :: fenced_block ( & original. display ( sema. db ) ) . into ( )
592
+ let mut desc = match render_notable_trait_comment ( db, & notable_traits ( db, & original) ) {
593
+ Some ( desc) => desc + "\n " ,
594
+ None => String :: new ( ) ,
595
+ } ;
596
+ format_to ! ( desc, "{}" , original. display( db) ) ;
597
+ Markup :: fenced_block ( & desc)
561
598
} ;
562
- res. markup = desc. into ( ) ;
563
- if let Some ( actions) = HoverAction :: goto_type_from_targets ( sema. db , targets) {
599
+ if let Some ( actions) = HoverAction :: goto_type_from_targets ( db, targets) {
564
600
res. actions . push ( actions) ;
565
601
}
566
602
Some ( res)
0 commit comments