@@ -612,7 +612,14 @@ pub fn fields(
612
612
lookup_results. push ( ( ev, epath) ) ;
613
613
}
614
614
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 ) ) ;
616
623
617
624
let brief_suffix = if let Field :: Array ( _, de) = & f {
618
625
if let Some ( range) = de. indexes_as_range ( ) {
@@ -652,14 +659,13 @@ pub fn fields(
652
659
653
660
// get the type of value structure. It can be generated from either name field
654
661
// 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)
663
669
} else {
664
670
// raw_field_value_read_ty
665
671
fty. clone ( )
@@ -674,10 +680,7 @@ pub fn fields(
674
680
// information in enumeratedValues;
675
681
// if it's not enumeratedValues, always derive the read proxy as we do not need to re-export
676
682
// 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 ) ;
681
684
682
685
// derive the read proxy structure if necessary.
683
686
if should_derive_reader {
@@ -712,11 +715,7 @@ pub fn fields(
712
715
713
716
// if this is an enumeratedValues not derived from base, generate the enum structure
714
717
// 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 {
720
719
// parse enum variants from enumeratedValues svd record
721
720
let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
722
721
@@ -856,9 +855,7 @@ pub fn fields(
856
855
857
856
// if this value is derived from a base, generate `pub use` code for each read proxy and value
858
857
// 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 {
862
859
// generate pub use field_1 reader as field_2 reader
863
860
let base_field = util:: replace_suffix ( & base. field . name , "" ) ;
864
861
let base_r = ident ( & base_field, config, "field_reader" , span) ;
@@ -969,19 +966,17 @@ pub fn fields(
969
966
// gets a brief of write proxy
970
967
let field_writer_brief = format ! ( "Field `{name}{brief_suffix}` writer - {description}" ) ;
971
968
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"
981
972
} else {
982
- // raw_field_value_write_ty
983
- fty. clone ( )
973
+ "enum_name"
984
974
} ;
975
+ ident ( evs. name . as_deref ( ) . unwrap_or ( & name) , config, fmt, span)
976
+ } else {
977
+ // raw_field_value_write_ty
978
+ fty. clone ( )
979
+ } ;
985
980
986
981
// name of write proxy type
987
982
let writer_ty = ident ( & name, config, "field_writer" , span) ;
@@ -990,7 +985,7 @@ pub fn fields(
990
985
let mut unsafety = unsafety ( f. write_constraint . as_ref ( ) , width) ;
991
986
992
987
// 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 {
994
989
// parse variants from enumeratedValues svd record
995
990
let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
996
991
let map = enums_to_map ( evs) ;
@@ -1011,10 +1006,6 @@ pub fn fields(
1011
1006
unsafety = false ;
1012
1007
}
1013
1008
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
-
1018
1009
// generate write value structure and From conversation if we can't reuse read value structure.
1019
1010
if writer_reader_different_enum {
1020
1011
if variants. is_empty ( ) {
@@ -1056,10 +1047,7 @@ pub fn fields(
1056
1047
1057
1048
// derive writer. We derive writer if the write proxy is in current register module,
1058
1049
// 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 ) ;
1063
1051
1064
1052
// derive writer structure by type alias to generic write proxy structure.
1065
1053
if should_derive_writer {
@@ -1128,7 +1116,7 @@ pub fn fields(
1128
1116
} ) ;
1129
1117
}
1130
1118
1131
- if let Some ( ( evs , Some ( base) ) ) = lookup_filter ( & lookup_results , Usage :: Write ) {
1119
+ if let Some ( ( _ , Some ( base) ) ) = write_enum {
1132
1120
// if base.register == None, derive write from the same module. This is allowed because both
1133
1121
// the generated and source write proxy are in the same module.
1134
1122
// we never reuse writer for writer in different module does not have the same _SPEC strcuture,
@@ -1147,7 +1135,6 @@ pub fn fields(
1147
1135
}
1148
1136
// if base.register == None, it emits pub use structure from same module.
1149
1137
if base. register ( ) != fpath. register ( ) {
1150
- let writer_reader_different_enum = evs_r != Some ( evs) ;
1151
1138
if writer_reader_different_enum {
1152
1139
// use the same enum structure name
1153
1140
if !writer_enum_derives. contains ( & value_write_ty) {
0 commit comments