@@ -612,7 +612,14 @@ pub fn fields(
612612 lookup_results. push ( ( ev, epath) ) ;
613613 }
614614
615- let mut evs_r = None ;
615+ let read_enum = lookup_filter ( & lookup_results, Usage :: Read ) ;
616+ let write_enum = lookup_filter ( & lookup_results, Usage :: Write ) ;
617+
618+ // does the read and the write value has the same name? If we have the same,
619+ // we can reuse read value type other than generating a new one.
620+ let writer_reader_different_enum = !( can_read
621+ && can_write
622+ && matches ! ( ( read_enum, write_enum) , ( Some ( e1) , Some ( e2) ) if e1. 0 == e2. 0 ) ) ;
616623
617624 let brief_suffix = if let Field :: Array ( _, de) = & f {
618625 if let Some ( range) = de. indexes_as_range ( ) {
@@ -652,14 +659,13 @@ pub fn fields(
652659
653660 // get the type of value structure. It can be generated from either name field
654661 // in enumeratedValues if it's an enumeration, or from field name directly if it's not.
655- let value_read_ty = if let Some ( ( evs, _) ) = lookup_filter ( & lookup_results, Usage :: Read )
656- {
657- ident (
658- evs. name . as_deref ( ) . unwrap_or ( & name) ,
659- config,
660- "enum_name" ,
661- span,
662- )
662+ let value_read_ty = if let Some ( ( evs, _) ) = read_enum {
663+ let fmt = if writer_reader_different_enum {
664+ "enum_read_name"
665+ } else {
666+ "enum_name"
667+ } ;
668+ ident ( evs. name . as_deref ( ) . unwrap_or ( & name) , config, fmt, span)
663669 } else {
664670 // raw_field_value_read_ty
665671 fty. clone ( )
@@ -674,10 +680,7 @@ pub fn fields(
674680 // information in enumeratedValues;
675681 // if it's not enumeratedValues, always derive the read proxy as we do not need to re-export
676682 // it again from BitReader or FieldReader.
677- let should_derive_reader = matches ! (
678- lookup_filter( & lookup_results, Usage :: Read ) ,
679- Some ( ( _, None ) ) | None
680- ) ;
683+ let should_derive_reader = matches ! ( read_enum, Some ( ( _, None ) ) | None ) ;
681684
682685 // derive the read proxy structure if necessary.
683686 if should_derive_reader {
@@ -712,11 +715,7 @@ pub fn fields(
712715
713716 // if this is an enumeratedValues not derived from base, generate the enum structure
714717 // and implement functions for each value in enumeration.
715- if let Some ( ( evs, None ) ) = lookup_filter ( & lookup_results, Usage :: Read ) {
716- // we have enumeration for read, record this. If the enumeration for write operation
717- // later on is the same as the read enumeration, we reuse and do not generate again.
718- evs_r = Some ( evs) ;
719-
718+ if let Some ( ( evs, None ) ) = read_enum {
720719 // parse enum variants from enumeratedValues svd record
721720 let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
722721
@@ -856,9 +855,7 @@ pub fn fields(
856855
857856 // if this value is derived from a base, generate `pub use` code for each read proxy and value
858857 // if necessary.
859- if let Some ( ( evs, Some ( base) ) ) = lookup_filter ( & lookup_results, Usage :: Read ) {
860- // preserve value; if read type equals write type, writer would not generate value type again
861- evs_r = Some ( evs) ;
858+ if let Some ( ( _, Some ( base) ) ) = read_enum {
862859 // generate pub use field_1 reader as field_2 reader
863860 let base_field = util:: replace_suffix ( & base. field . name , "" ) ;
864861 let base_r = ident ( & base_field, config, "field_reader" , span) ;
@@ -969,19 +966,17 @@ pub fn fields(
969966 // gets a brief of write proxy
970967 let field_writer_brief = format ! ( "Field `{name}{brief_suffix}` writer - {description}" ) ;
971968
972- let value_write_ty =
973- if let Some ( ( evs, _) ) = lookup_filter ( & lookup_results, Usage :: Write ) {
974- let writer_reader_different_enum = evs_r != Some ( evs) ;
975- let fmt = if writer_reader_different_enum {
976- "enum_write_name"
977- } else {
978- "enum_name"
979- } ;
980- ident ( evs. name . as_deref ( ) . unwrap_or ( & name) , config, fmt, span)
969+ let value_write_ty = if let Some ( ( evs, _) ) = write_enum {
970+ let fmt = if writer_reader_different_enum {
971+ "enum_write_name"
981972 } else {
982- // raw_field_value_write_ty
983- fty. clone ( )
973+ "enum_name"
984974 } ;
975+ ident ( evs. name . as_deref ( ) . unwrap_or ( & name) , config, fmt, span)
976+ } else {
977+ // raw_field_value_write_ty
978+ fty. clone ( )
979+ } ;
985980
986981 // name of write proxy type
987982 let writer_ty = ident ( & name, config, "field_writer" , span) ;
@@ -990,7 +985,7 @@ pub fn fields(
990985 let mut unsafety = unsafety ( f. write_constraint . as_ref ( ) , width) ;
991986
992987 // if we writes to enumeratedValues, generate its structure if it differs from read structure.
993- if let Some ( ( evs, None ) ) = lookup_filter ( & lookup_results , Usage :: Write ) {
988+ if let Some ( ( evs, None ) ) = write_enum {
994989 // parse variants from enumeratedValues svd record
995990 let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
996991 let map = enums_to_map ( evs) ;
@@ -1011,10 +1006,6 @@ pub fn fields(
10111006 unsafety = false ;
10121007 }
10131008
1014- // does the read and the write value has the same name? If we have the same,
1015- // we can reuse read value type other than generating a new one.
1016- let writer_reader_different_enum = evs_r != Some ( evs) ;
1017-
10181009 // generate write value structure and From conversation if we can't reuse read value structure.
10191010 if writer_reader_different_enum {
10201011 if variants. is_empty ( ) {
@@ -1056,10 +1047,7 @@ pub fn fields(
10561047
10571048 // derive writer. We derive writer if the write proxy is in current register module,
10581049 // or writer in different register have different _SPEC structures
1059- let should_derive_writer = matches ! (
1060- lookup_filter( & lookup_results, Usage :: Write ) ,
1061- Some ( ( _, None ) ) | None
1062- ) ;
1050+ let should_derive_writer = matches ! ( write_enum, Some ( ( _, None ) ) | None ) ;
10631051
10641052 // derive writer structure by type alias to generic write proxy structure.
10651053 if should_derive_writer {
@@ -1128,7 +1116,7 @@ pub fn fields(
11281116 } ) ;
11291117 }
11301118
1131- if let Some ( ( evs , Some ( base) ) ) = lookup_filter ( & lookup_results , Usage :: Write ) {
1119+ if let Some ( ( _ , Some ( base) ) ) = write_enum {
11321120 // if base.register == None, derive write from the same module. This is allowed because both
11331121 // the generated and source write proxy are in the same module.
11341122 // we never reuse writer for writer in different module does not have the same _SPEC strcuture,
@@ -1147,7 +1135,6 @@ pub fn fields(
11471135 }
11481136 // if base.register == None, it emits pub use structure from same module.
11491137 if base. register ( ) != fpath. register ( ) {
1150- let writer_reader_different_enum = evs_r != Some ( evs) ;
11511138 if writer_reader_different_enum {
11521139 // use the same enum structure name
11531140 if !writer_enum_derives. contains ( & value_write_ty) {
0 commit comments