@@ -23,11 +23,9 @@ pub fn render(
23
23
index : & Index ,
24
24
config : & Config ,
25
25
) -> Result < TokenStream > {
26
- let mut out = TokenStream :: new ( ) ;
27
26
let name = util:: name_of ( register, config. ignore_groups ) ;
28
27
let span = Span :: call_site ( ) ;
29
28
let name_constant_case = name. to_constant_case_ident ( span) ;
30
- let name_constant_case_spec = format ! ( "{name}_SPEC" ) . to_constant_case_ident ( span) ;
31
29
let name_snake_case = name. to_snake_case_ident ( span) ;
32
30
let description = util:: escape_brackets (
33
31
util:: respace ( & register. description . clone ( ) . unwrap_or_else ( || {
@@ -44,44 +42,67 @@ pub fn render(
44
42
util:: block_path_to_ty ( & dpath. block , span)
45
43
} ;
46
44
let dname = util:: name_of ( index. registers . get ( dpath) . unwrap ( ) , config. ignore_groups ) ;
45
+ let mut mod_derived = derived. clone ( ) ;
47
46
derived
48
47
. path
49
48
. segments
50
49
. 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) ) ) ;
51
54
52
- out. extend ( quote ! {
53
- #[ doc = #description]
55
+ Ok ( quote ! {
54
56
pub use #derived as #name_constant_case;
55
- } ) ;
57
+ pub use #mod_derived as #name_snake_case;
58
+ } )
56
59
} 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 ( ) ;
59
75
out. extend ( quote ! {
60
76
#[ doc = #alias_doc]
61
77
pub type #name_constant_case = crate :: Reg <#name_snake_case:: #name_constant_case_spec>;
62
78
} ) ;
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
+ ) ?;
65
86
66
87
out. extend ( quote ! {
67
88
#[ doc = #description]
68
89
pub mod #name_snake_case {
69
90
#mod_items
70
91
}
71
92
} ) ;
72
- } ;
73
93
74
- Ok ( out)
94
+ Ok ( out)
95
+ }
75
96
}
76
97
77
98
pub fn render_register_mod (
78
99
register : & Register ,
100
+ access : Access ,
79
101
path : & RegisterPath ,
80
102
index : & Index ,
81
103
config : & Config ,
82
104
) -> Result < TokenStream > {
83
105
let properties = & register. properties ;
84
- let access = util:: access_of ( properties, register. fields . as_deref ( ) ) ;
85
106
let name = util:: name_of ( register, config. ignore_groups ) ;
86
107
let span = Span :: call_site ( ) ;
87
108
let name_constant_case_spec = format ! ( "{name}_SPEC" ) . to_constant_case_ident ( span) ;
0 commit comments