@@ -401,11 +401,11 @@ pub(super) fn definition(
401401 hir:: VariantDef :: Struct ( s) => Adt :: from ( s)
402402 . layout ( db)
403403 . ok ( )
404- . map ( |layout| format ! ( ", offset = {}" , layout. fields. offset( id) . bytes( ) ) ) ,
404+ . map ( |layout| format ! ( ", offset = {:#X }" , layout. fields. offset( id) . bytes( ) ) ) ,
405405 _ => None ,
406406 } ;
407407 Some ( format ! (
408- "size = {}, align = {}{}" ,
408+ "size = {:#X }, align = {:#X }{}" ,
409409 layout. size. bytes( ) ,
410410 layout. align. abi. bytes( ) ,
411411 offset. as_deref( ) . unwrap_or_default( )
@@ -415,28 +415,38 @@ pub(super) fn definition(
415415 Definition :: Function ( it) => label_and_docs ( db, it) ,
416416 Definition :: Adt ( it) => label_and_layout_info_and_docs ( db, it, config, |& it| {
417417 let layout = it. layout ( db) . ok ( ) ?;
418- Some ( format ! ( "size = {}, align = {}" , layout. size. bytes( ) , layout. align. abi. bytes( ) ) )
418+ Some ( format ! (
419+ "size = {:#X}, align = {:#X}" ,
420+ layout. size. bytes( ) ,
421+ layout. align. abi. bytes( )
422+ ) )
419423 } ) ,
420- Definition :: Variant ( it) => label_value_and_layout_info_and_docs ( db, it, config, |& it| {
421- let layout = ( || {
424+ Definition :: Variant ( it) => label_value_and_layout_info_and_docs (
425+ db,
426+ it,
427+ config,
428+ |& it| {
429+ if !it. parent_enum ( db) . is_data_carrying ( db) {
430+ match it. eval ( db) {
431+ Ok ( x) => {
432+ Some ( if x >= 10 { format ! ( "{x} ({x:#X})" ) } else { format ! ( "{x}" ) } )
433+ }
434+ Err ( _) => it. value ( db) . map ( |x| format ! ( "{x:?}" ) ) ,
435+ }
436+ } else {
437+ None
438+ }
439+ } ,
440+ |it| {
422441 let ( layout, tag_size) = it. layout ( db) . ok ( ) ?;
423442 let size = layout. size . bytes_usize ( ) - tag_size;
424443 if size == 0 {
425444 // There is no value in showing layout info for fieldless variants
426445 return None ;
427446 }
428- Some ( format ! ( "size = {}" , layout. size. bytes( ) ) )
429- } ) ( ) ;
430- let value = if !it. parent_enum ( db) . is_data_carrying ( db) {
431- match it. eval ( db) {
432- Ok ( x) => Some ( if x >= 10 { format ! ( "{x} ({x:#X})" ) } else { format ! ( "{x}" ) } ) ,
433- Err ( _) => it. value ( db) . map ( |x| format ! ( "{x:?}" ) ) ,
434- }
435- } else {
436- None
437- } ;
438- ( value, layout)
439- } ) ,
447+ Some ( format ! ( "size = {:#X}" , layout. size. bytes( ) ) )
448+ } ,
449+ ) ,
440450 Definition :: Const ( it) => label_value_and_docs ( db, it, |it| {
441451 let body = it. render_eval ( db) ;
442452 match body {
@@ -463,7 +473,11 @@ pub(super) fn definition(
463473 Definition :: TraitAlias ( it) => label_and_docs ( db, it) ,
464474 Definition :: TypeAlias ( it) => label_and_layout_info_and_docs ( db, it, config, |& it| {
465475 let layout = it. ty ( db) . layout ( db) . ok ( ) ?;
466- Some ( format ! ( "size = {}, align = {}" , layout. size. bytes( ) , layout. align. abi. bytes( ) ) )
476+ Some ( format ! (
477+ "size = {:#X}, align = {:#X}" ,
478+ layout. size. bytes( ) ,
479+ layout. align. abi. bytes( )
480+ ) )
467481 } ) ,
468482 Definition :: BuiltinType ( it) => {
469483 return famous_defs
@@ -634,41 +648,42 @@ fn label_and_layout_info_and_docs<D, E, V>(
634648 db : & RootDatabase ,
635649 def : D ,
636650 config : & HoverConfig ,
637- value_extractor : E ,
651+ layout_extractor : E ,
638652) -> ( String , Option < hir:: Documentation > )
639653where
640654 D : HasAttrs + HirDisplay ,
641655 E : Fn ( & D ) -> Option < V > ,
642656 V : Display ,
643657{
644- let label = match value_extractor ( & def) {
645- Some ( value ) if config . memory_layout => format ! ( "{} // {value }" , def. display( db) ) ,
658+ let label = match config . memory_layout . then ( || layout_extractor ( & def) ) . flatten ( ) {
659+ Some ( layout ) => format ! ( "{} // {layout }" , def. display( db) ) ,
646660 _ => def. display ( db) . to_string ( ) ,
647661 } ;
648662 let docs = def. attrs ( db) . docs ( ) ;
649663 ( label, docs)
650664}
651665
652- fn label_value_and_layout_info_and_docs < D , E , V , L > (
666+ fn label_value_and_layout_info_and_docs < D , E , E2 , V , L > (
653667 db : & RootDatabase ,
654668 def : D ,
655669 config : & HoverConfig ,
656670 value_extractor : E ,
671+ layout_extractor : E2 ,
657672) -> ( String , Option < hir:: Documentation > )
658673where
659674 D : HasAttrs + HirDisplay ,
660- E : Fn ( & D ) -> ( Option < V > , Option < L > ) ,
675+ E : Fn ( & D ) -> Option < V > ,
676+ E2 : Fn ( & D ) -> Option < L > ,
661677 V : Display ,
662678 L : Display ,
663679{
664- let ( value, layout) = value_extractor ( & def) ;
665- let label = if let Some ( value) = value {
666- format ! ( "{} = {value}" , def. display( db) )
667- } else {
668- def. display ( db) . to_string ( )
680+ let value = value_extractor ( & def) ;
681+ let label = match value {
682+ Some ( value) => format ! ( "{} = {value}" , def. display( db) ) ,
683+ None => def. display ( db) . to_string ( ) ,
669684 } ;
670- let label = match layout {
671- Some ( layout) if config . memory_layout => format ! ( "{} // {layout}" , label) ,
685+ let label = match config . memory_layout . then ( || layout_extractor ( & def ) ) . flatten ( ) {
686+ Some ( layout) => format ! ( "{} // {layout}" , label) ,
672687 _ => label,
673688 } ;
674689 let docs = def. attrs ( db) . docs ( ) ;
0 commit comments