@@ -11,7 +11,7 @@ use proc_macro2::Ident;
1111use proc_macro2:: TokenStream ;
1212use proc_macro_error2:: abort;
1313use quote:: { format_ident, quote} ;
14- use syn:: { parse_quote, Field , Generics , ItemStruct , Lifetime , Type , Visibility } ;
14+ use syn:: { parse_quote, Attribute , Field , Generics , ItemStruct , Lifetime , Type , Visibility } ;
1515
1616#[ allow( non_snake_case) ]
1717macro_rules! UnsizedStructContext {
@@ -120,6 +120,7 @@ pub struct UnsizedStructContext {
120120 sized_field_types : Vec < Type > ,
121121 unsized_field_idents : Vec < Ident > ,
122122 unsized_field_types : Vec < Type > ,
123+ with_sized_docs : Vec < Vec < Attribute > > ,
123124 with_sized_idents : Vec < Ident > ,
124125 with_sized_types : Vec < Type > ,
125126 with_sized_vis : Vec < Visibility > ,
@@ -212,14 +213,29 @@ impl UnsizedStructContext {
212213
213214 let sized_field_ident = sized_ident
214215 . as_ref ( )
215- . map ( |_| new_ident ( "__sized " , get_field_idents ( & all_fields) , true ) ) ;
216+ . map ( |_| new_ident ( "_sized " , get_field_idents ( & all_fields) , true ) ) ;
216217
217218 let sized_field_idents = get_field_idents ( & sized_fields) . cloned ( ) . collect_vec ( ) ;
218219 let sized_field_types = get_field_types ( & sized_fields) . cloned ( ) . collect_vec ( ) ;
219220 let unsized_field_idents = get_field_idents ( & unsized_fields) . cloned ( ) . collect_vec ( ) ;
220221 let unsized_field_types = get_field_types ( & unsized_fields) . cloned ( ) . collect_vec ( ) ;
221222 let unsized_field_vis = get_field_vis ( & unsized_fields) . cloned ( ) . collect_vec ( ) ;
222223
224+ let with_sized_docs = sized_field_ident
225+ . as_ref ( )
226+ . map ( |_ident| {
227+ vec ! [ parse_quote! {
228+ #[ doc = "Sized portion of the Unsized Type" ]
229+ } ]
230+ } )
231+ . into_iter ( )
232+ . chain (
233+ unsized_fields
234+ . iter ( )
235+ . map ( |field| get_doc_attributes ( & field. attrs ) ) ,
236+ )
237+ . collect_vec ( ) ;
238+
223239 let with_sized_idents = sized_field_ident
224240 . iter ( )
225241 . chain ( unsized_field_idents. iter ( ) )
@@ -267,6 +283,7 @@ impl UnsizedStructContext {
267283 sized_field_types,
268284 unsized_field_idents,
269285 unsized_field_types,
286+ with_sized_docs,
270287 with_sized_idents,
271288 with_sized_types,
272289 with_sized_vis,
@@ -308,15 +325,19 @@ impl UnsizedStructContext {
308325
309326 fn ref_struct ( & self ) -> TokenStream {
310327 Paths ! ( prelude) ;
311- UnsizedStructContext ! ( self => vis, ref_ident, with_sized_vis, with_sized_idents, with_sized_types, top_lt) ;
328+ UnsizedStructContext ! ( self => vis, ref_ident, with_sized_vis, with_sized_idents, with_sized_types, top_lt, with_sized_docs ) ;
312329 let ( generics, wc) = self . split_for_declaration ( true ) ;
313330 let transparent = ( with_sized_idents. len ( ) == 1 ) . then ( || quote ! ( #[ repr( transparent) ] ) ) ;
331+
332+ let doc = format ! ( "Ref type for [`{}`]" , self . struct_ident) ;
314333 quote ! {
334+ #[ doc = #doc]
315335 #[ derive( #prelude:: DeriveWhere ) ]
316336 #[ derive_where( Debug ; #( <#with_sized_types as #prelude:: UnsizedType >:: Ref <#top_lt>, ) * ) ]
317337 #transparent
318338 #vis struct #ref_ident #generics #wc {
319339 #(
340+ #( #with_sized_docs) *
320341 #with_sized_vis #with_sized_idents: <#with_sized_types as #prelude:: UnsizedType >:: Ref <#top_lt>,
321342 ) *
322343 }
@@ -325,16 +346,19 @@ impl UnsizedStructContext {
325346
326347 fn mut_struct ( & self ) -> TokenStream {
327348 Paths ! ( prelude) ;
328- UnsizedStructContext ! ( self => vis, mut_ident, top_lt, with_sized_vis, with_sized_idents, with_sized_types) ;
349+ UnsizedStructContext ! ( self => vis, mut_ident, top_lt, with_sized_vis, with_sized_idents, with_sized_types, with_sized_docs ) ;
329350 let ( generics, wc) = self . split_for_declaration ( true ) ;
330351 let transparent = ( with_sized_idents. len ( ) == 1 ) . then ( || quote ! ( #[ repr( transparent) ] ) ) ;
331352
353+ let doc = format ! ( "Mut type for [`{}`]" , self . struct_ident) ;
332354 quote ! {
355+ #[ doc = #doc]
333356 #[ derive( #prelude:: DeriveWhere ) ]
334357 #[ derive_where( Debug ; #( <#with_sized_types as #prelude:: UnsizedType >:: Mut <#top_lt>, ) * ) ]
335358 #transparent
336359 #vis struct #mut_ident #generics #wc {
337360 #(
361+ #( #with_sized_docs) *
338362 #with_sized_vis #with_sized_idents: <#with_sized_types as #prelude:: UnsizedType >:: Mut <#top_lt>,
339363 ) *
340364 }
@@ -351,8 +375,10 @@ impl UnsizedStructContext {
351375 let owned_types = get_field_types ( owned_fields) . collect_vec ( ) ;
352376 let lt = new_lifetime ( & self . generics , None ) ;
353377
378+ let doc = format ! ( "Owned type for [`{}`]" , self . struct_ident) ;
354379 quote ! {
355380 #( #[ #additional_attributes] ) *
381+ #[ doc = #doc]
356382 #[ derive( #prelude:: DeriveWhere ) ]
357383 #[ derive_where( Debug , Copy , Clone , Default , Eq , Hash , Ord , PartialEq , PartialOrd ; #( for <#lt> #owned_types, ) * ) ]
358384 #vis struct #owned_ident #gen #where_clause {
@@ -388,8 +414,10 @@ impl UnsizedStructContext {
388414 #program_account
389415 )
390416 } ) ;
417+ let doc = format ! ( "Sized portion of [`{}`]" , self . struct_ident) ;
391418 let sized_struct = quote ! {
392419 #( #[ #additional_attributes] ) *
420+ #[ doc = #doc]
393421 #[ derive( #prelude:: Align1 , #sized_bytemuck_derives) ]
394422 #sized_attributes
395423 #[ repr( C , packed) ]
0 commit comments