@@ -1084,15 +1084,15 @@ fn expand_register(
1084
1084
let description = register. description . clone ( ) . unwrap_or_default ( ) ;
1085
1085
1086
1086
let info_name = register. fullname ( config. ignore_groups ) ;
1087
- let ty_name = if register. is_single ( ) {
1087
+ let mut ty_name = if register. is_single ( ) {
1088
1088
info_name. to_string ( )
1089
1089
} else {
1090
1090
util:: replace_suffix ( & info_name, "" )
1091
1091
} ;
1092
- let ty = name_to_ty ( & ty_name) ;
1093
1092
1094
1093
match register {
1095
1094
Register :: Single ( info) => {
1095
+ let ty = name_to_ty ( & ty_name) ;
1096
1096
let syn_field = new_syn_field ( ty_name. to_snake_case_ident ( Span :: call_site ( ) ) , ty) ;
1097
1097
register_expanded. push ( RegisterBlockField {
1098
1098
syn_field,
@@ -1114,20 +1114,36 @@ fn expand_register(
1114
1114
false => true ,
1115
1115
} ;
1116
1116
1117
- // force expansion if we're implicitly deriving so we don't get name collisions
1118
- let array_convertible = if let DeriveInfo :: Implicit ( _) = derive_info {
1119
- false
1117
+ // if dimIndex exists, test if it is a sequence of numbers from 0 to dim
1118
+ let sequential_indexes_from0 = array_info
1119
+ . indexes_as_range ( )
1120
+ . filter ( |r| * r. start ( ) == 0 )
1121
+ . is_some ( ) ;
1122
+
1123
+ // force expansion and rename if we're deriving an array that doesnt start at 0 so we don't get name collisions
1124
+ let index: Cow < str > = if let Some ( dim_index) = & array_info. dim_index {
1125
+ dim_index. first ( ) . unwrap ( ) . into ( )
1120
1126
} else {
1121
- sequential_addresses && convert_list
1127
+ if sequential_indexes_from0 {
1128
+ "0" . into ( )
1129
+ } else {
1130
+ "" . into ( )
1131
+ }
1132
+ } ;
1133
+ let array_convertible = match derive_info {
1134
+ DeriveInfo :: Implicit ( _) => {
1135
+ ty_name = util:: replace_suffix ( & info_name, & index) ;
1136
+ sequential_addresses && convert_list && sequential_indexes_from0
1137
+ }
1138
+ DeriveInfo :: Explicit ( _) => {
1139
+ ty_name = util:: replace_suffix ( & info_name, & index) ;
1140
+ sequential_addresses && convert_list && sequential_indexes_from0
1141
+ }
1142
+ _ => sequential_addresses && convert_list,
1122
1143
} ;
1144
+ let ty = name_to_ty ( & ty_name) ;
1123
1145
1124
1146
if array_convertible {
1125
- // if dimIndex exists, test if it is a sequence of numbers from 0 to dim
1126
- let sequential_indexes_from0 = array_info
1127
- . indexes_as_range ( )
1128
- . filter ( |r| * r. start ( ) == 0 )
1129
- . is_some ( ) ;
1130
-
1131
1147
let accessors = if sequential_indexes_from0 {
1132
1148
Vec :: new ( )
1133
1149
} else {
@@ -1213,16 +1229,6 @@ fn render_ercs(
1213
1229
let mut rpath = None ;
1214
1230
let before_name = reg. name . to_string ( ) ;
1215
1231
if let DeriveInfo :: Implicit ( rp) = derive_info {
1216
- let mut idx_name = None ;
1217
- let info_name = reg. fullname ( config. ignore_groups ) . to_string ( ) ;
1218
- if let Register :: Array ( _, array_info) = reg {
1219
- for ( _, i) in array_info. indexes ( ) . enumerate ( ) {
1220
- idx_name = Some ( util:: replace_suffix ( & info_name, & i) . to_string ( ) ) ;
1221
- }
1222
- }
1223
- if let Some ( name) = idx_name {
1224
- reg. name = name;
1225
- }
1226
1232
rpath = Some ( rp. clone ( ) ) ;
1227
1233
} else {
1228
1234
let dpath = reg. derived_from . take ( ) ;
0 commit comments