@@ -620,8 +620,9 @@ pub fn fields(
620
620
621
621
// Hack for #625
622
622
let mut enum_derives = HashSet :: new ( ) ;
623
+ let mut read_enum_derives = HashSet :: new ( ) ;
624
+ let mut write_enum_derives = HashSet :: new ( ) ;
623
625
let mut reader_derives = HashSet :: new ( ) ;
624
- let mut writer_enum_derives = HashSet :: new ( ) ;
625
626
let mut writer_derives = HashSet :: new ( ) ;
626
627
627
628
// TODO enumeratedValues
@@ -737,32 +738,35 @@ pub fn fields(
737
738
738
739
// If this field can be read, generate read proxy structure and value structure.
739
740
if can_read {
740
- // get the type of value structure. It can be generated from either name field
741
- // in enumeratedValues if it's an enumeration, or from field name directly if it's not.
741
+ // collect information on items in enumeration to generate it later.
742
+ let mut enum_items = TokenStream :: new ( ) ;
743
+
744
+ // if this is an enumeratedValues not derived from base, generate the enum structure
745
+ // and implement functions for each value in enumeration.
742
746
let value_read_ty = if let Some ( ev) = rwenum. read_enum ( ) {
743
- let fmt = if rwenum. different_enums ( ) {
744
- "enum_read_name"
747
+ let derives;
748
+ let fmt;
749
+ if rwenum. different_enums ( ) {
750
+ derives = & mut read_enum_derives;
751
+ fmt = "enum_read_name" ;
745
752
} else {
746
- "enum_name"
753
+ derives = & mut enum_derives;
754
+ fmt = "enum_name" ;
747
755
} ;
748
- ident (
749
- ev. values ( ) . name . as_deref ( ) . unwrap_or ( & name) ,
756
+ // get the type of value structure. It can be generated from either name field
757
+ // in enumeratedValues if it's an enumeration, or from field name directly if it's not.
758
+ let value_read_ty = ident (
759
+ if config. field_names_for_enums {
760
+ & name
761
+ } else {
762
+ ev. values ( ) . name . as_deref ( ) . unwrap_or ( & name)
763
+ } ,
750
764
config,
751
765
fmt,
752
766
span,
753
- )
754
- } else {
755
- // raw_field_value_read_ty
756
- fty. clone ( )
757
- } ;
758
-
759
- // collect information on items in enumeration to generate it later.
760
- let mut enum_items = TokenStream :: new ( ) ;
767
+ ) ;
761
768
762
- if let Some ( ev) = rwenum. read_enum ( ) {
763
769
match ev {
764
- // if this is an enumeratedValues not derived from base, generate the enum structure
765
- // and implement functions for each value in enumeration.
766
770
EV :: New ( evs) => {
767
771
// parse enum variants from enumeratedValues svd record
768
772
let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
@@ -909,24 +913,31 @@ pub fn fields(
909
913
}
910
914
}
911
915
EV :: Derived ( _, base) => {
912
- // only pub use enum when derived from another register.
913
- // If field is in the same register it emits
914
- // pub use enum from same module which is not expected
915
- if base. register ( ) != fpath. register ( ) {
916
- // use the same enum structure name
917
- if !enum_derives. contains ( & value_read_ty) {
918
- let base_path =
919
- base_syn_path ( base, & fpath, & value_read_ty, config) ?;
920
- mod_items. extend ( quote ! {
921
- #[ doc = #description]
922
- pub use #base_path as #value_read_ty;
923
- } ) ;
924
- enum_derives. insert ( value_read_ty. clone ( ) ) ;
925
- }
916
+ let base_ident = if config. field_names_for_enums {
917
+ ident (
918
+ & util:: replace_suffix ( & base. field ( ) . name , "" ) ,
919
+ config,
920
+ fmt,
921
+ span,
922
+ )
923
+ } else {
924
+ ident ( & base. name , config, fmt, span)
925
+ } ;
926
+ if !derives. contains ( & value_read_ty) {
927
+ let base_path = base_syn_path ( base, & fpath, & base_ident, config) ?;
928
+ mod_items. extend ( quote ! {
929
+ #[ doc = #description]
930
+ pub use #base_path as #value_read_ty;
931
+ } ) ;
926
932
}
927
933
}
928
934
}
929
- }
935
+ derives. insert ( value_read_ty. clone ( ) ) ;
936
+ value_read_ty
937
+ } else {
938
+ // raw_field_value_read_ty
939
+ fty. clone ( )
940
+ } ;
930
941
931
942
// get a brief description for this field
932
943
// the suffix string from field name is removed in brief description.
@@ -1083,29 +1094,32 @@ pub fn fields(
1083
1094
// If this field can be written, generate write proxy. Generate write value if it differs from
1084
1095
// the read value, or else we reuse read value.
1085
1096
if can_write {
1097
+ let mut proxy_items = TokenStream :: new ( ) ;
1098
+ let mut unsafety = unsafety ( f. write_constraint . as_ref ( ) , width) ;
1099
+
1100
+ // if we writes to enumeratedValues, generate its structure if it differs from read structure.
1086
1101
let value_write_ty = if let Some ( ev) = rwenum. write_enum ( ) {
1087
- let fmt = if rwenum. different_enums ( ) {
1088
- "enum_write_name"
1102
+ let derives;
1103
+ let fmt;
1104
+ if rwenum. different_enums ( ) {
1105
+ derives = & mut write_enum_derives;
1106
+ fmt = "enum_write_name" ;
1089
1107
} else {
1090
- "enum_name"
1108
+ derives = & mut enum_derives;
1109
+ fmt = "enum_name" ;
1091
1110
} ;
1092
- ident (
1093
- ev. values ( ) . name . as_deref ( ) . unwrap_or ( & name) ,
1111
+ let value_write_ty = ident (
1112
+ if config. field_names_for_enums {
1113
+ & name
1114
+ } else {
1115
+ ev. values ( ) . name . as_deref ( ) . unwrap_or ( & name)
1116
+ } ,
1094
1117
config,
1095
1118
fmt,
1096
1119
span,
1097
- )
1098
- } else {
1099
- // raw_field_value_write_ty
1100
- fty. clone ( )
1101
- } ;
1120
+ ) ;
1102
1121
1103
- let mut proxy_items = TokenStream :: new ( ) ;
1104
- let mut unsafety = unsafety ( f. write_constraint . as_ref ( ) , width) ;
1105
-
1106
- if let Some ( ev) = rwenum. write_enum ( ) {
1107
1122
match ev {
1108
- // if we writes to enumeratedValues, generate its structure if it differs from read structure.
1109
1123
EV :: New ( evs) => {
1110
1124
// parse variants from enumeratedValues svd record
1111
1125
let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
@@ -1167,24 +1181,31 @@ pub fn fields(
1167
1181
}
1168
1182
}
1169
1183
EV :: Derived ( _, base) => {
1170
- // If field is in the same register it emits pub use structure from same module.
1171
- if base. register ( ) != fpath. register ( ) {
1172
- // use the same enum structure name
1173
- if rwenum. generate_write_enum ( )
1174
- && !writer_enum_derives. contains ( & value_write_ty)
1175
- {
1176
- let base_path =
1177
- base_syn_path ( base, & fpath, & value_write_ty, config) ?;
1178
- mod_items. extend ( quote ! {
1179
- #[ doc = #description]
1180
- pub use #base_path as #value_write_ty;
1181
- } ) ;
1182
- writer_enum_derives. insert ( value_write_ty. clone ( ) ) ;
1183
- }
1184
+ let base_ident = if config. field_names_for_enums {
1185
+ ident (
1186
+ & util:: replace_suffix ( & base. field ( ) . name , "" ) ,
1187
+ config,
1188
+ fmt,
1189
+ span,
1190
+ )
1191
+ } else {
1192
+ ident ( & base. name , config, fmt, span)
1193
+ } ;
1194
+ if rwenum. generate_write_enum ( ) && !derives. contains ( & value_write_ty) {
1195
+ let base_path = base_syn_path ( base, & fpath, & base_ident, config) ?;
1196
+ mod_items. extend ( quote ! {
1197
+ #[ doc = #description]
1198
+ pub use #base_path as #value_write_ty;
1199
+ } ) ;
1184
1200
}
1185
1201
}
1186
1202
}
1187
- }
1203
+ derives. insert ( value_write_ty. clone ( ) ) ;
1204
+ value_write_ty
1205
+ } else {
1206
+ // raw_field_value_write_ty
1207
+ fty. clone ( )
1208
+ } ;
1188
1209
1189
1210
let mwv = f. modified_write_values . or ( rmwv) . unwrap_or_default ( ) ;
1190
1211
@@ -1238,11 +1259,6 @@ pub fn fields(
1238
1259
} ) ;
1239
1260
}
1240
1261
Some ( EV :: Derived ( _, base) ) => {
1241
- // if base.register == None, derive write from the same module. This is allowed because both
1242
- // the generated and source write proxy are in the same module.
1243
- // we never reuse writer for writer in different module does not have the same _SPEC strcuture,
1244
- // thus we cannot write to current register using re-exported write proxy.
1245
-
1246
1262
// generate pub use field_1 writer as field_2 writer
1247
1263
let base_field = util:: replace_suffix ( & base. field . name , "" ) ;
1248
1264
let base_w = ident ( & base_field, config, "field_writer" , span) ;
0 commit comments