@@ -23,11 +23,9 @@ pub fn render(
2323 index : & Index ,
2424 config : & Config ,
2525) -> Result < TokenStream > {
26- let mut out = TokenStream :: new ( ) ;
2726 let name = util:: name_of ( register, config. ignore_groups ) ;
2827 let span = Span :: call_site ( ) ;
2928 let name_constant_case = name. to_constant_case_ident ( span) ;
30- let name_constant_case_spec = format ! ( "{name}_SPEC" ) . to_constant_case_ident ( span) ;
3129 let name_snake_case = name. to_snake_case_ident ( span) ;
3230 let description = util:: escape_brackets (
3331 util:: respace ( & register. description . clone ( ) . unwrap_or_else ( || {
@@ -44,44 +42,67 @@ pub fn render(
4442 util:: block_path_to_ty ( & dpath. block , span)
4543 } ;
4644 let dname = util:: name_of ( index. registers . get ( dpath) . unwrap ( ) , config. ignore_groups ) ;
45+ let mut mod_derived = derived. clone ( ) ;
4746 derived
4847 . path
4948 . segments
5049 . push ( path_segment ( dname. to_constant_case_ident ( span) ) ) ;
50+ mod_derived
51+ . path
52+ . segments
53+ . push ( path_segment ( dname. to_snake_case_ident ( span) ) ) ;
5154
52- out. extend ( quote ! {
53- #[ doc = #description]
55+ Ok ( quote ! {
5456 pub use #derived as #name_constant_case;
55- } ) ;
57+ pub use #mod_derived as #name_snake_case;
58+ } )
5659 } else {
57- let alias_doc =
58- format ! ( "{name} register accessor: an alias for `Reg<{name_constant_case_spec}>`" ) ;
60+ let name_constant_case_spec = format ! ( "{name}_SPEC" ) . to_constant_case_ident ( span) ;
61+ let access = util:: access_of ( & register. properties , register. fields . as_deref ( ) ) ;
62+ let accs = if access. can_read ( ) && access. can_write ( ) {
63+ "rw"
64+ } else if access. can_write ( ) {
65+ "w"
66+ } else if access. can_read ( ) {
67+ "r"
68+ } else {
69+ return Err ( anyhow ! ( "Incorrect access of register {}" , register. name) ) ;
70+ } ;
71+ let alias_doc = format ! (
72+ "{name} ({accs}) register accessor: an alias for `Reg<{name_constant_case_spec}>`"
73+ ) ;
74+ let mut out = TokenStream :: new ( ) ;
5975 out. extend ( quote ! {
6076 #[ doc = #alias_doc]
6177 pub type #name_constant_case = crate :: Reg <#name_snake_case:: #name_constant_case_spec>;
6278 } ) ;
63- let mod_items =
64- render_register_mod ( register, & path. new_register ( & register. name ) , index, config) ?;
79+ let mod_items = render_register_mod (
80+ register,
81+ access,
82+ & path. new_register ( & register. name ) ,
83+ index,
84+ config,
85+ ) ?;
6586
6687 out. extend ( quote ! {
6788 #[ doc = #description]
6889 pub mod #name_snake_case {
6990 #mod_items
7091 }
7192 } ) ;
72- } ;
7393
74- Ok ( out)
94+ Ok ( out)
95+ }
7596}
7697
7798pub fn render_register_mod (
7899 register : & Register ,
100+ access : Access ,
79101 path : & RegisterPath ,
80102 index : & Index ,
81103 config : & Config ,
82104) -> Result < TokenStream > {
83105 let properties = & register. properties ;
84- let access = util:: access_of ( properties, register. fields . as_deref ( ) ) ;
85106 let name = util:: name_of ( register, config. ignore_groups ) ;
86107 let span = Span :: call_site ( ) ;
87108 let name_constant_case_spec = format ! ( "{name}_SPEC" ) . to_constant_case_ident ( span) ;
0 commit comments