@@ -12,7 +12,8 @@ use quote::{quote, ToTokens};
1212use syn:: { parse_str, Token } ;
1313
1414use 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 ,
1617} ;
1718use anyhow:: { anyhow, bail, Context , Result } ;
1819
@@ -194,14 +195,13 @@ pub fn render(
194195
195196 // Push all register related information into the peripheral module
196197 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+ } ;
205205 }
206206
207207 let description =
@@ -454,7 +454,8 @@ fn register_or_cluster_block(
454454 let mut accessors = TokenStream :: new ( ) ;
455455 let mut have_accessors = false ;
456456
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" ) ?;
458459
459460 // Locate conflicting regions; we'll need to use unions to represent them.
460461 let mut regions = FieldRegions :: default ( ) ;
@@ -596,10 +597,30 @@ fn expand(
596597 let mut ercs_expanded = vec ! [ ] ;
597598
598599 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+ } ;
603624 }
604625
605626 ercs_expanded. sort_by_key ( |x| x. offset ) ;
@@ -740,7 +761,8 @@ fn expand_register(
740761
741762 match register {
742763 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" ) ?,
744766 description : info. description . clone ( ) . unwrap_or_default ( ) ,
745767 offset : info. address_offset ,
746768 size : register_size,
@@ -815,14 +837,17 @@ fn cluster_block(
815837 // Generate definition for each of the registers.
816838 let registers = util:: only_registers ( & c. children ) ;
817839 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+ } ;
826851 }
827852
828853 // Generate the sub-cluster blocks.
@@ -848,7 +873,7 @@ fn expand_svd_register(
848873 register : & Register ,
849874 name : Option < & str > ,
850875 ignore_group : bool ,
851- ) -> Result < Vec < syn:: Field > , syn :: Error > {
876+ ) -> Result < Vec < syn:: Field > > {
852877 let mut out = vec ! [ ] ;
853878
854879 match register {
@@ -885,13 +910,14 @@ fn convert_svd_register(
885910 register : & Register ,
886911 name : Option < & str > ,
887912 ignore_group : bool ,
888- ) -> Result < syn:: Field , syn :: Error > {
913+ ) -> Result < syn:: Field > {
889914 Ok ( match register {
890915 Register :: Single ( info) => {
891916 let info_name = info. fullname ( ignore_group) ;
892917 new_syn_field (
893918 & 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) ) ?,
895921 )
896922 }
897923 Register :: Array ( info, array_info) => {
@@ -1038,7 +1064,16 @@ fn name_to_wrapped_ty_str(name: &str, ns: Option<&str>) -> String {
10381064 }
10391065}
10401066
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 > {
10421068 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+ }
10441079}
0 commit comments