@@ -29,7 +29,7 @@ use crate::{
2929 HoverAction , HoverConfig , HoverResult , Markup , MemoryLayoutHoverConfig ,
3030 MemoryLayoutHoverRenderKind ,
3131 doc_links:: { remove_links, rewrite_links} ,
32- hover:: { SubstTyLen , notable_traits, walk_and_push_ty} ,
32+ hover:: { SubstTyLen , TyOrConst , notable_traits, walk_and_push_ty} ,
3333 interpret:: render_const_eval_error,
3434} ;
3535
@@ -477,7 +477,7 @@ pub(super) fn definition(
477477 db : & RootDatabase ,
478478 def : Definition ,
479479 famous_defs : Option < & FamousDefs < ' _ , ' _ > > ,
480- notable_traits : & [ ( Trait , Vec < ( Option < Type < ' _ > > , Name ) > ) ] ,
480+ notable_traits : & [ ( Trait , Vec < ( Option < TyOrConst < ' _ > > , Name ) > ) ] ,
481481 macro_arm : Option < u32 > ,
482482 render_extras : bool ,
483483 subst_types : Option < & Vec < ( Symbol , Type < ' _ > ) > > ,
@@ -553,65 +553,15 @@ pub(super) fn definition(
553553 Definition :: Const ( it) => {
554554 let body = it. eval ( db) ;
555555 Some ( match body {
556- Ok ( it) => match it. render_debug ( db) {
557- Ok ( it) => it,
558- Err ( err) => {
559- let it = it. render ( db, display_target) ;
560- if env:: var_os ( "RA_DEV" ) . is_some ( ) {
561- format ! (
562- "{it}\n {}" ,
563- render_const_eval_error( db, err. into( ) , display_target)
564- )
565- } else {
566- it
567- }
568- }
569- } ,
570- Err ( err) => {
571- let source = it. source ( db) ?;
572- let mut body = source. value . body ( ) ?. syntax ( ) . clone ( ) ;
573- if let Some ( macro_file) = source. file_id . macro_file ( ) {
574- let span_map = db. expansion_span_map ( macro_file) ;
575- body = prettify_macro_expansion ( db, body, & span_map, it. krate ( db) . into ( ) ) ;
576- }
577- if env:: var_os ( "RA_DEV" ) . is_some ( ) {
578- format ! ( "{body}\n {}" , render_const_eval_error( db, err, display_target) )
579- } else {
580- body. to_string ( )
581- }
582- }
556+ Ok ( it) => const_value ( & it, db, display_target) ,
557+ Err ( err) => source_value ( & it, |it| it. body ( ) , err, db, display_target) ?,
583558 } )
584559 }
585560 Definition :: Static ( it) => {
586561 let body = it. eval ( db) ;
587562 Some ( match body {
588- Ok ( it) => match it. render_debug ( db) {
589- Ok ( it) => it,
590- Err ( err) => {
591- let it = it. render ( db, display_target) ;
592- if env:: var_os ( "RA_DEV" ) . is_some ( ) {
593- format ! (
594- "{it}\n {}" ,
595- render_const_eval_error( db, err. into( ) , display_target)
596- )
597- } else {
598- it
599- }
600- }
601- } ,
602- Err ( err) => {
603- let source = it. source ( db) ?;
604- let mut body = source. value . body ( ) ?. syntax ( ) . clone ( ) ;
605- if let Some ( macro_file) = source. file_id . macro_file ( ) {
606- let span_map = db. expansion_span_map ( macro_file) ;
607- body = prettify_macro_expansion ( db, body, & span_map, it. krate ( db) . into ( ) ) ;
608- }
609- if env:: var_os ( "RA_DEV" ) . is_some ( ) {
610- format ! ( "{body}\n {}" , render_const_eval_error( db, err, display_target) )
611- } else {
612- body. to_string ( )
613- }
614- }
563+ Ok ( it) => const_value ( & it, db, display_target) ,
564+ Err ( err) => source_value ( & it, |it| it. body ( ) , err, db, display_target) ?,
615565 } )
616566 }
617567 _ => None ,
@@ -939,7 +889,7 @@ pub(super) fn literal(
939889
940890fn render_notable_trait (
941891 db : & RootDatabase ,
942- notable_traits : & [ ( Trait , Vec < ( Option < Type < ' _ > > , Name ) > ) ] ,
892+ notable_traits : & [ ( Trait , Vec < ( Option < TyOrConst < ' _ > > , Name ) > ) ] ,
943893 edition : Edition ,
944894 display_target : DisplayTarget ,
945895) -> Option < String > {
@@ -961,7 +911,16 @@ fn render_notable_trait(
961911 f( & name. display( db, edition) ) ?;
962912 f( & " = " ) ?;
963913 match ty {
964- Some ( ty) => f( & ty. display( db, display_target) ) ,
914+ Some ( TyOrConst :: Type ( ty) ) => f( & ty. display( db, display_target) ) ,
915+ Some ( TyOrConst :: Const ( it) ) => match it. eval( db) {
916+ Ok ( value) => f( & const_value( & value, db, display_target) ) ,
917+ Err ( err) => {
918+ match source_value( it, |it| it. body( ) , err, db, display_target) {
919+ Some ( s) => f( & s) ,
920+ None => f( & "?" ) ,
921+ }
922+ }
923+ } ,
965924 None => f( & "?" ) ,
966925 }
967926 } )
@@ -1105,6 +1064,44 @@ fn closure_ty(
11051064 Some ( res)
11061065}
11071066
1067+ fn const_value (
1068+ evaluated : & hir:: EvaluatedConst < ' _ > ,
1069+ db : & RootDatabase ,
1070+ display_target : DisplayTarget ,
1071+ ) -> String {
1072+ match evaluated. render_debug ( db) {
1073+ Ok ( it) => it,
1074+ Err ( err) => {
1075+ let it = evaluated. render ( db, display_target) ;
1076+ if env:: var_os ( "RA_DEV" ) . is_some ( ) {
1077+ format ! ( "{it}\n {}" , render_const_eval_error( db, err. into( ) , display_target) )
1078+ } else {
1079+ it
1080+ }
1081+ }
1082+ }
1083+ }
1084+
1085+ fn source_value < T : HasCrate + HasSource + Copy > (
1086+ it : & T ,
1087+ expr : fn ( & <T as HasSource >:: Ast ) -> Option < ast:: Expr > ,
1088+ err : hir:: ConstEvalError < ' _ > ,
1089+ db : & RootDatabase ,
1090+ display_target : DisplayTarget ,
1091+ ) -> Option < String > {
1092+ let source = it. source ( db) ?;
1093+ let mut body = expr ( & source. value ) ?. syntax ( ) . clone ( ) ;
1094+ if let Some ( macro_file) = source. file_id . macro_file ( ) {
1095+ let span_map = db. expansion_span_map ( macro_file) ;
1096+ body = prettify_macro_expansion ( db, body, & span_map, it. krate ( db) . into ( ) ) ;
1097+ }
1098+ Some ( if env:: var_os ( "RA_DEV" ) . is_some ( ) {
1099+ format ! ( "{body}\n {}" , render_const_eval_error( db, err, display_target) )
1100+ } else {
1101+ body. to_string ( )
1102+ } )
1103+ }
1104+
11081105fn definition_path ( db : & RootDatabase , & def: & Definition , edition : Edition ) -> Option < String > {
11091106 if matches ! (
11101107 def,
0 commit comments