@@ -12,7 +12,8 @@ use quote::{quote, ToTokens};
12
12
use syn:: { parse_str, Token } ;
13
13
14
14
use crate :: util:: {
15
- self , Config , FullName , ToSanitizedSnakeCase , ToSanitizedUpperCase , BITS_PER_BYTE ,
15
+ self , handle_cluster_error, handle_reg_error, Config , FullName , ToSanitizedSnakeCase ,
16
+ ToSanitizedUpperCase , BITS_PER_BYTE ,
16
17
} ;
17
18
use anyhow:: { anyhow, bail, Context , Result } ;
18
19
@@ -194,14 +195,13 @@ pub fn render(
194
195
195
196
// Push all register related information into the peripheral module
196
197
for reg in registers {
197
- mod_items. extend ( register:: render (
198
- reg,
199
- registers,
200
- p,
201
- all_peripherals,
202
- & defaults,
203
- config,
204
- ) ?) ;
198
+ match register:: render ( reg, registers, p, all_peripherals, & defaults, config) {
199
+ Ok ( rendered_reg) => mod_items. extend ( rendered_reg) ,
200
+ Err ( e) => {
201
+ let res: Result < TokenStream > = Err ( e) ;
202
+ return handle_reg_error ( "Error rendering register" , * reg, res) ;
203
+ }
204
+ } ;
205
205
}
206
206
207
207
let description =
@@ -454,7 +454,8 @@ fn register_or_cluster_block(
454
454
let mut accessors = TokenStream :: new ( ) ;
455
455
let mut have_accessors = false ;
456
456
457
- let ercs_expanded = expand ( ercs, defs, name, config) ?;
457
+ let ercs_expanded = expand ( ercs, defs, name, config)
458
+ . with_context ( || "Could not expand register or cluster block" ) ?;
458
459
459
460
// Locate conflicting regions; we'll need to use unions to represent them.
460
461
let mut regions = FieldRegions :: default ( ) ;
@@ -596,10 +597,30 @@ fn expand(
596
597
let mut ercs_expanded = vec ! [ ] ;
597
598
598
599
for erc in ercs {
599
- ercs_expanded. extend ( match & erc {
600
- RegisterCluster :: Register ( register) => expand_register ( register, defs, name, config) ?,
601
- RegisterCluster :: Cluster ( cluster) => expand_cluster ( cluster, defs, name, config) ?,
602
- } ) ;
600
+ match & erc {
601
+ RegisterCluster :: Register ( register) => {
602
+ match expand_register ( register, defs, name, config) {
603
+ Ok ( expanded_reg) => ercs_expanded. extend ( expanded_reg) ,
604
+ Err ( e) => {
605
+ let res = Err ( e) ;
606
+ return handle_reg_error ( "Error expanding register" , register, res) ;
607
+ }
608
+ }
609
+ }
610
+ RegisterCluster :: Cluster ( cluster) => {
611
+ match expand_cluster ( cluster, defs, name, config) {
612
+ Ok ( expanded_cluster) => ercs_expanded. extend ( expanded_cluster) ,
613
+ Err ( e) => {
614
+ let res = Err ( e) ;
615
+ return handle_cluster_error (
616
+ "Error expanding register cluster" ,
617
+ cluster,
618
+ res,
619
+ ) ;
620
+ }
621
+ }
622
+ }
623
+ } ;
603
624
}
604
625
605
626
ercs_expanded. sort_by_key ( |x| x. offset ) ;
@@ -740,7 +761,8 @@ fn expand_register(
740
761
741
762
match register {
742
763
Register :: Single ( info) => register_expanded. push ( RegisterBlockField {
743
- field : convert_svd_register ( register, name, config. ignore_groups ) ?,
764
+ field : convert_svd_register ( register, name, config. ignore_groups )
765
+ . with_context ( || "syn error occured" ) ?,
744
766
description : info. description . clone ( ) . unwrap_or_default ( ) ,
745
767
offset : info. address_offset ,
746
768
size : register_size,
@@ -815,14 +837,17 @@ fn cluster_block(
815
837
// Generate definition for each of the registers.
816
838
let registers = util:: only_registers ( & c. children ) ;
817
839
for reg in & registers {
818
- mod_items. extend ( register:: render (
819
- reg,
820
- & registers,
821
- p,
822
- all_peripherals,
823
- & defaults,
824
- config,
825
- ) ?) ;
840
+ match register:: render ( reg, & registers, p, all_peripherals, & defaults, config) {
841
+ Ok ( rendered_reg) => mod_items. extend ( rendered_reg) ,
842
+ Err ( e) => {
843
+ let res: Result < TokenStream > = Err ( e) ;
844
+ return handle_reg_error (
845
+ "Error generating register definition for a register cluster" ,
846
+ * reg,
847
+ res,
848
+ ) ;
849
+ }
850
+ } ;
826
851
}
827
852
828
853
// Generate the sub-cluster blocks.
@@ -848,7 +873,7 @@ fn expand_svd_register(
848
873
register : & Register ,
849
874
name : Option < & str > ,
850
875
ignore_group : bool ,
851
- ) -> Result < Vec < syn:: Field > , syn :: Error > {
876
+ ) -> Result < Vec < syn:: Field > > {
852
877
let mut out = vec ! [ ] ;
853
878
854
879
match register {
@@ -885,13 +910,14 @@ fn convert_svd_register(
885
910
register : & Register ,
886
911
name : Option < & str > ,
887
912
ignore_group : bool ,
888
- ) -> Result < syn:: Field , syn :: Error > {
913
+ ) -> Result < syn:: Field > {
889
914
Ok ( match register {
890
915
Register :: Single ( info) => {
891
916
let info_name = info. fullname ( ignore_group) ;
892
917
new_syn_field (
893
918
& info_name. to_sanitized_snake_case ( ) ,
894
- name_to_wrapped_ty ( & info_name, name) ?,
919
+ name_to_wrapped_ty ( & info_name, name)
920
+ . with_context ( || format ! ( "Error converting info name {}" , info_name) ) ?,
895
921
)
896
922
}
897
923
Register :: Array ( info, array_info) => {
@@ -1038,7 +1064,16 @@ fn name_to_wrapped_ty_str(name: &str, ns: Option<&str>) -> String {
1038
1064
}
1039
1065
}
1040
1066
1041
- fn name_to_wrapped_ty ( name : & str , ns : Option < & str > ) -> Result < syn:: Type , syn :: Error > {
1067
+ fn name_to_wrapped_ty ( name : & str , ns : Option < & str > ) -> Result < syn:: Type > {
1042
1068
let ident = name_to_wrapped_ty_str ( name, ns) ;
1043
- Ok ( syn:: Type :: Path ( parse_str :: < syn:: TypePath > ( & ident) ?) )
1069
+ match parse_str :: < syn:: TypePath > ( & ident) {
1070
+ Ok ( path) => Ok ( syn:: Type :: Path ( path) ) ,
1071
+ Err ( e) => {
1072
+ let mut res = Err ( e. into ( ) ) ;
1073
+ res = res. with_context ( || {
1074
+ format ! ( "Determining syn::TypePath from ident \" {}\" failed" , ident)
1075
+ } ) ;
1076
+ res
1077
+ }
1078
+ }
1044
1079
}
0 commit comments