1
+ use crate :: modules:: Module ;
1
2
use std:: borrow:: Cow ;
2
3
use std:: cmp:: Ordering ;
3
4
use std:: collections:: HashMap ;
@@ -20,9 +21,7 @@ pub fn render(
20
21
all_peripherals : & [ Peripheral ] ,
21
22
defaults : & RegisterProperties ,
22
23
nightly : bool ,
23
- ) -> Result < TokenStream > {
24
- let mut out = TokenStream :: new ( ) ;
25
-
24
+ ) -> Result < Module > {
26
25
let p_derivedfrom = p_original
27
26
. derived_from
28
27
. as_ref ( )
@@ -31,13 +30,19 @@ pub fn render(
31
30
let p_merged = p_derivedfrom. map ( |ancestor| p_original. derive_from ( ancestor) ) ;
32
31
let p = p_merged. as_ref ( ) . unwrap_or ( p_original) ;
33
32
33
+ let name_sc = p. name . to_sanitized_snake_case ( ) ;
34
+ let description =
35
+ util:: escape_brackets ( util:: respace ( p. description . as_ref ( ) . unwrap_or ( & p. name ) ) . as_ref ( ) ) ;
36
+
37
+ let mut module = Module :: new ( & name_sc, & description) ;
38
+
34
39
if p_original. derived_from . is_some ( ) && p_derivedfrom. is_none ( ) {
35
40
eprintln ! (
36
41
"Couldn't find derivedFrom original: {} for {}, skipping" ,
37
42
p_original. derived_from. as_ref( ) . unwrap( ) ,
38
43
p_original. name
39
44
) ;
40
- return Ok ( out ) ;
45
+ return Ok ( module ) ;
41
46
}
42
47
43
48
let span = Span :: call_site ( ) ;
@@ -46,15 +51,14 @@ pub fn render(
46
51
let description = util:: respace ( p. description . as_ref ( ) . unwrap_or ( & p. name ) ) ;
47
52
let derive_regs = p_derivedfrom. is_some ( ) && p_original. registers . is_none ( ) ;
48
53
49
- let name_sc = Ident :: new ( & p. name . to_sanitized_snake_case ( ) , span) ;
50
54
let base = if derive_regs {
51
55
Ident :: new ( & p_derivedfrom. unwrap ( ) . name . to_sanitized_snake_case ( ) , span)
52
56
} else {
53
- name_sc . clone ( )
57
+ Ident :: new ( & name_sc , span )
54
58
} ;
55
59
56
60
// Insert the peripheral structure
57
- out. extend ( quote ! {
61
+ module . out . extend ( quote ! {
58
62
#[ doc = #description]
59
63
pub struct #name_pc { _marker: PhantomData <* const ( ) > }
60
64
@@ -81,7 +85,7 @@ pub fn render(
81
85
// Derived peripherals may not require re-implementation, and will instead
82
86
// use a single definition of the non-derived version.
83
87
if derive_regs {
84
- return Ok ( out ) ;
88
+ return Ok ( module ) ;
85
89
}
86
90
87
91
// erc: *E*ither *R*egister or *C*luster
@@ -143,23 +147,22 @@ pub fn render(
143
147
// No `struct RegisterBlock` can be generated
144
148
if registers. is_empty ( ) && clusters. is_empty ( ) {
145
149
// Drop the definition of the peripheral
146
- return Ok ( TokenStream :: new ( ) ) ;
150
+ return Ok ( Module :: new ( & name_sc , & description ) ) ;
147
151
}
148
152
149
153
let defaults = p. default_register_properties . derive_from ( defaults) ;
150
154
151
155
// Push any register or cluster blocks into the output
152
- let mut mod_items = TokenStream :: new ( ) ;
153
- mod_items. extend ( register_or_cluster_block ( ercs, & defaults, None , nightly) ?) ;
156
+ module. extend ( register_or_cluster_block ( ercs, & defaults, None , nightly) ?) ;
154
157
155
158
// Push all cluster related information into the peripheral module
156
159
for c in & clusters {
157
- mod_items . extend ( cluster_block ( c, & defaults, p, all_peripherals, nightly) ?) ;
160
+ module . push_module ( cluster_block ( c, & defaults, p, all_peripherals, nightly) ?) ;
158
161
}
159
162
160
163
// Push all regsiter realted information into the peripheral module
161
164
for reg in registers {
162
- mod_items . extend ( register:: render (
165
+ module . push_module ( register:: render (
163
166
reg,
164
167
registers,
165
168
p,
@@ -168,22 +171,7 @@ pub fn render(
168
171
) ?) ;
169
172
}
170
173
171
- let description =
172
- util:: escape_brackets ( util:: respace ( p. description . as_ref ( ) . unwrap_or ( & p. name ) ) . as_ref ( ) ) ;
173
-
174
- let open = Punct :: new ( '{' , Spacing :: Alone ) ;
175
- let close = Punct :: new ( '}' , Spacing :: Alone ) ;
176
-
177
- out. extend ( quote ! {
178
- #[ doc = #description]
179
- pub mod #name_sc #open
180
- } ) ;
181
-
182
- out. extend ( mod_items) ;
183
-
184
- close. to_tokens ( & mut out) ;
185
-
186
- Ok ( out)
174
+ Ok ( module)
187
175
}
188
176
189
177
#[ derive( Clone , Debug ) ]
@@ -716,9 +704,7 @@ fn cluster_block(
716
704
p : & Peripheral ,
717
705
all_peripherals : & [ Peripheral ] ,
718
706
nightly : bool ,
719
- ) -> Result < TokenStream > {
720
- let mut mod_items = TokenStream :: new ( ) ;
721
-
707
+ ) -> Result < Module > {
722
708
// name_sc needs to take into account array type.
723
709
let description =
724
710
util:: escape_brackets ( util:: respace ( c. description . as_ref ( ) . unwrap_or ( & c. name ) ) . as_ref ( ) ) ;
@@ -731,16 +717,25 @@ fn cluster_block(
731
717
} ,
732
718
"" ,
733
719
) ;
734
- let name_sc = Ident :: new ( & mod_name. to_sanitized_snake_case ( ) , Span :: call_site ( ) ) ;
720
+
721
+ let mut module = Module :: new (
722
+ & mod_name. to_sanitized_snake_case ( ) ,
723
+ & ( "Register block\n " . to_string ( ) + & description) ,
724
+ ) ;
735
725
736
726
let defaults = c. default_register_properties . derive_from ( defaults) ;
737
727
738
- let reg_block = register_or_cluster_block ( & c. children , & defaults, Some ( & mod_name) , nightly) ?;
728
+ module. out . extend ( register_or_cluster_block (
729
+ & c. children ,
730
+ & defaults,
731
+ Some ( & mod_name) ,
732
+ nightly,
733
+ ) ?) ;
739
734
740
735
// Generate definition for each of the registers.
741
736
let registers = util:: only_registers ( & c. children ) ;
742
737
for reg in & registers {
743
- mod_items . extend ( register:: render (
738
+ module . push_module ( register:: render (
744
739
reg,
745
740
& registers,
746
741
p,
@@ -752,18 +747,9 @@ fn cluster_block(
752
747
// Generate the sub-cluster blocks.
753
748
let clusters = util:: only_clusters ( & c. children ) ;
754
749
for c in & clusters {
755
- mod_items . extend ( cluster_block ( c, & defaults, p, all_peripherals, nightly) ?) ;
750
+ module . push_module ( cluster_block ( c, & defaults, p, all_peripherals, nightly) ?) ;
756
751
}
757
-
758
- Ok ( quote ! {
759
- #reg_block
760
-
761
- ///Register block
762
- #[ doc = #description]
763
- pub mod #name_sc {
764
- #mod_items
765
- }
766
- } )
752
+ Ok ( module)
767
753
}
768
754
769
755
/// Takes a svd::Register which may be a register array, and turn in into
0 commit comments