@@ -497,7 +497,7 @@ fn render_notable_trait_comment(
497497 let mut needs_impl_header = true ;
498498 for ( trait_, assoc_types) in notable_traits {
499499 desc. push_str ( if mem:: take ( & mut needs_impl_header) {
500- " // notable traits implemented : "
500+ " // Implements notable traits: "
501501 } else {
502502 ", "
503503 } ) ;
@@ -530,6 +530,7 @@ fn type_info(
530530 if let Some ( res) = closure_ty ( sema, config, & ty) {
531531 return Some ( res) ;
532532 } ;
533+ let db = sema. db ;
533534 let TypeInfo { original, adjusted } = ty;
534535 let mut res = HoverResult :: default ( ) ;
535536 let mut targets: Vec < hir:: ModuleDef > = Vec :: new ( ) ;
@@ -538,29 +539,64 @@ fn type_info(
538539 targets. push ( item) ;
539540 }
540541 } ;
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 ( ) ;
551582 let static_text_diff_len = "Coerced to: " . len ( ) - "Type: " . len ( ) ;
552583 format ! (
553- "```text\n Type: {:>apad$}\n Coerced to: {:>opad$}\n ```\n " ,
584+ "```text\n Type: {:>apad$}\n Coerced to: {:>opad$}\n {notable} ```\n " ,
554585 original,
555586 adjusted,
556587 apad = static_text_diff_len + adjusted. len( ) . max( original. len( ) ) ,
557588 opad = original. len( ) ,
558589 )
590+ . into ( )
559591 } 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)
561598 } ;
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) {
564600 res. actions . push ( actions) ;
565601 }
566602 Some ( res)
0 commit comments