@@ -401,11 +401,11 @@ pub(super) fn definition(
401
401
hir:: VariantDef :: Struct ( s) => Adt :: from ( s)
402
402
. layout ( db)
403
403
. ok ( )
404
- . map ( |layout| format ! ( ", offset = {}" , layout. fields. offset( id) . bytes( ) ) ) ,
404
+ . map ( |layout| format ! ( ", offset = {:#X }" , layout. fields. offset( id) . bytes( ) ) ) ,
405
405
_ => None ,
406
406
} ;
407
407
Some ( format ! (
408
- "size = {}, align = {}{}" ,
408
+ "size = {:#X }, align = {:#X }{}" ,
409
409
layout. size. bytes( ) ,
410
410
layout. align. abi. bytes( ) ,
411
411
offset. as_deref( ) . unwrap_or_default( )
@@ -415,28 +415,38 @@ pub(super) fn definition(
415
415
Definition :: Function ( it) => label_and_docs ( db, it) ,
416
416
Definition :: Adt ( it) => label_and_layout_info_and_docs ( db, it, config, |& it| {
417
417
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
+ ) )
419
423
} ) ,
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| {
422
441
let ( layout, tag_size) = it. layout ( db) . ok ( ) ?;
423
442
let size = layout. size . bytes_usize ( ) - tag_size;
424
443
if size == 0 {
425
444
// There is no value in showing layout info for fieldless variants
426
445
return None ;
427
446
}
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
+ ) ,
440
450
Definition :: Const ( it) => label_value_and_docs ( db, it, |it| {
441
451
let body = it. render_eval ( db) ;
442
452
match body {
@@ -463,7 +473,11 @@ pub(super) fn definition(
463
473
Definition :: TraitAlias ( it) => label_and_docs ( db, it) ,
464
474
Definition :: TypeAlias ( it) => label_and_layout_info_and_docs ( db, it, config, |& it| {
465
475
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
+ ) )
467
481
} ) ,
468
482
Definition :: BuiltinType ( it) => {
469
483
return famous_defs
@@ -634,41 +648,42 @@ fn label_and_layout_info_and_docs<D, E, V>(
634
648
db : & RootDatabase ,
635
649
def : D ,
636
650
config : & HoverConfig ,
637
- value_extractor : E ,
651
+ layout_extractor : E ,
638
652
) -> ( String , Option < hir:: Documentation > )
639
653
where
640
654
D : HasAttrs + HirDisplay ,
641
655
E : Fn ( & D ) -> Option < V > ,
642
656
V : Display ,
643
657
{
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) ) ,
646
660
_ => def. display ( db) . to_string ( ) ,
647
661
} ;
648
662
let docs = def. attrs ( db) . docs ( ) ;
649
663
( label, docs)
650
664
}
651
665
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 > (
653
667
db : & RootDatabase ,
654
668
def : D ,
655
669
config : & HoverConfig ,
656
670
value_extractor : E ,
671
+ layout_extractor : E2 ,
657
672
) -> ( String , Option < hir:: Documentation > )
658
673
where
659
674
D : HasAttrs + HirDisplay ,
660
- E : Fn ( & D ) -> ( Option < V > , Option < L > ) ,
675
+ E : Fn ( & D ) -> Option < V > ,
676
+ E2 : Fn ( & D ) -> Option < L > ,
661
677
V : Display ,
662
678
L : Display ,
663
679
{
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 ( ) ,
669
684
} ;
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) ,
672
687
_ => label,
673
688
} ;
674
689
let docs = def. attrs ( db) . docs ( ) ;
0 commit comments