@@ -3,8 +3,8 @@ use std::fmt::Display;
33
44use either:: Either ;
55use 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 ,
88} ;
99use ide_db:: {
1010 base_db:: SourceDatabase ,
@@ -404,8 +404,9 @@ pub(super) fn definition(
404404 . map ( |layout| format ! ( ", offset = {:#X}" , layout. fields. offset( id) . bytes( ) ) ) ,
405405 _ => None ,
406406 } ;
407+ let niches = niches ( db, it, & layout) . unwrap_or_default ( ) ;
407408 Some ( format ! (
408- "size = {:#X}, align = {:#X}{}" ,
409+ "size = {:#X}, align = {:#X}{}{niches} " ,
409410 layout. size. bytes( ) ,
410411 layout. align. abi. bytes( ) ,
411412 offset. as_deref( ) . unwrap_or_default( )
@@ -415,8 +416,9 @@ pub(super) fn definition(
415416 Definition :: Function ( it) => label_and_docs ( db, it) ,
416417 Definition :: Adt ( it) => label_and_layout_info_and_docs ( db, it, config, |& it| {
417418 let layout = it. layout ( db) . ok ( ) ?;
419+ let niches = niches ( db, it, & layout) . unwrap_or_default ( ) ;
418420 Some ( format ! (
419- "size = {:#X}, align = {:#X}" ,
421+ "size = {:#X}, align = {:#X}{niches} " ,
420422 layout. size. bytes( ) ,
421423 layout. align. abi. bytes( )
422424 ) )
@@ -437,14 +439,15 @@ pub(super) fn definition(
437439 None
438440 }
439441 } ,
440- |it| {
442+ |& it| {
441443 let ( layout, tag_size) = it. layout ( db) . ok ( ) ?;
442444 let size = layout. size . bytes_usize ( ) - tag_size;
443445 if size == 0 {
444446 // There is no value in showing layout info for fieldless variants
445447 return None ;
446448 }
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( ) ) )
448451 } ,
449452 ) ,
450453 Definition :: Const ( it) => label_value_and_docs ( db, it, |it| {
@@ -473,10 +476,11 @@ pub(super) fn definition(
473476 Definition :: TraitAlias ( it) => label_and_docs ( db, it) ,
474477 Definition :: TypeAlias ( it) => label_and_layout_info_and_docs ( db, it, config, |& it| {
475478 let layout = it. ty ( db) . layout ( db) . ok ( ) ?;
479+ let niches = niches ( db, it, & layout) . unwrap_or_default ( ) ;
476480 Some ( format ! (
477- "size = {:#X}, align = {:#X}" ,
481+ "size = {:#X}, align = {:#X}{niches} " ,
478482 layout. size. bytes( ) ,
479- layout. align. abi. bytes( )
483+ layout. align. abi. bytes( ) ,
480484 ) )
481485 } ) ,
482486 Definition :: BuiltinType ( it) => {
@@ -513,6 +517,13 @@ pub(super) fn definition(
513517 markup ( docs, label, mod_path)
514518}
515519
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+
516527fn type_info (
517528 sema : & Semantics < ' _ , RootDatabase > ,
518529 config : & HoverConfig ,
0 commit comments