@@ -3,8 +3,8 @@ use std::fmt::Display;
3
3
4
4
use either:: Either ;
5
5
use hir:: {
6
- Adt , AsAssocItem , AttributeTemplate , CaptureKind , HasAttrs , HasSource , HirDisplay , Semantics ,
7
- TypeInfo ,
6
+ db :: HirDatabase , Adt , AsAssocItem , AttributeTemplate , CaptureKind , HasAttrs , HasCrate ,
7
+ HasSource , HirDisplay , Layout , Semantics , TypeInfo ,
8
8
} ;
9
9
use ide_db:: {
10
10
base_db:: SourceDatabase ,
@@ -404,8 +404,9 @@ pub(super) fn definition(
404
404
. map ( |layout| format ! ( ", offset = {:#X}" , layout. fields. offset( id) . bytes( ) ) ) ,
405
405
_ => None ,
406
406
} ;
407
+ let niches = niches ( db, it, & layout) . unwrap_or_default ( ) ;
407
408
Some ( format ! (
408
- "size = {:#X}, align = {:#X}{}" ,
409
+ "size = {:#X}, align = {:#X}{}{niches} " ,
409
410
layout. size. bytes( ) ,
410
411
layout. align. abi. bytes( ) ,
411
412
offset. as_deref( ) . unwrap_or_default( )
@@ -415,8 +416,9 @@ pub(super) fn definition(
415
416
Definition :: Function ( it) => label_and_docs ( db, it) ,
416
417
Definition :: Adt ( it) => label_and_layout_info_and_docs ( db, it, config, |& it| {
417
418
let layout = it. layout ( db) . ok ( ) ?;
419
+ let niches = niches ( db, it, & layout) . unwrap_or_default ( ) ;
418
420
Some ( format ! (
419
- "size = {:#X}, align = {:#X}" ,
421
+ "size = {:#X}, align = {:#X}{niches} " ,
420
422
layout. size. bytes( ) ,
421
423
layout. align. abi. bytes( )
422
424
) )
@@ -437,14 +439,15 @@ pub(super) fn definition(
437
439
None
438
440
}
439
441
} ,
440
- |it| {
442
+ |& it| {
441
443
let ( layout, tag_size) = it. layout ( db) . ok ( ) ?;
442
444
let size = layout. size . bytes_usize ( ) - tag_size;
443
445
if size == 0 {
444
446
// There is no value in showing layout info for fieldless variants
445
447
return None ;
446
448
}
447
- Some ( format ! ( "size = {:#X}" , layout. size. bytes( ) ) )
449
+ let niches = niches ( db, it, & layout) . unwrap_or_default ( ) ;
450
+ Some ( format ! ( "size = {:#X}{niches}" , layout. size. bytes( ) ) )
448
451
} ,
449
452
) ,
450
453
Definition :: Const ( it) => label_value_and_docs ( db, it, |it| {
@@ -473,10 +476,11 @@ pub(super) fn definition(
473
476
Definition :: TraitAlias ( it) => label_and_docs ( db, it) ,
474
477
Definition :: TypeAlias ( it) => label_and_layout_info_and_docs ( db, it, config, |& it| {
475
478
let layout = it. ty ( db) . layout ( db) . ok ( ) ?;
479
+ let niches = niches ( db, it, & layout) . unwrap_or_default ( ) ;
476
480
Some ( format ! (
477
- "size = {:#X}, align = {:#X}" ,
481
+ "size = {:#X}, align = {:#X}{niches} " ,
478
482
layout. size. bytes( ) ,
479
- layout. align. abi. bytes( )
483
+ layout. align. abi. bytes( ) ,
480
484
) )
481
485
} ) ,
482
486
Definition :: BuiltinType ( it) => {
@@ -513,6 +517,13 @@ pub(super) fn definition(
513
517
markup ( docs, label, mod_path)
514
518
}
515
519
520
+ fn niches ( db : & RootDatabase , it : impl HasCrate , layout : & Layout ) -> Option < String > {
521
+ Some ( format ! (
522
+ ", niches = {}" ,
523
+ layout. largest_niche?. available( & * db. target_data_layout( it. krate( db) . into( ) ) ?)
524
+ ) )
525
+ }
526
+
516
527
fn type_info (
517
528
sema : & Semantics < ' _ , RootDatabase > ,
518
529
config : & HoverConfig ,
0 commit comments