Skip to content

Commit e28300a

Browse files
committed
Resolve name conflicts when deriving
1 parent b1cb6b3 commit e28300a

File tree

2 files changed

+46
-26
lines changed

2 files changed

+46
-26
lines changed

src/generate/peripheral.rs

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,15 +1084,15 @@ fn expand_register(
10841084
let description = register.description.clone().unwrap_or_default();
10851085

10861086
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() {
10881088
info_name.to_string()
10891089
} else {
10901090
util::replace_suffix(&info_name, "")
10911091
};
1092-
let ty = name_to_ty(&ty_name);
10931092

10941093
match register {
10951094
Register::Single(info) => {
1095+
let ty = name_to_ty(&ty_name);
10961096
let syn_field = new_syn_field(ty_name.to_snake_case_ident(Span::call_site()), ty);
10971097
register_expanded.push(RegisterBlockField {
10981098
syn_field,
@@ -1114,20 +1114,36 @@ fn expand_register(
11141114
false => true,
11151115
};
11161116

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()
11201126
} 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,
11221143
};
1144+
let ty = name_to_ty(&ty_name);
11231145

11241146
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-
11311147
let accessors = if sequential_indexes_from0 {
11321148
Vec::new()
11331149
} else {
@@ -1213,16 +1229,6 @@ fn render_ercs(
12131229
let mut rpath = None;
12141230
let before_name = reg.name.to_string();
12151231
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-
}
12261232
rpath = Some(rp.clone());
12271233
} else {
12281234
let dpath = reg.derived_from.take();

src/generate/register.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
use crate::svd::{
2-
Access, BitRange, EnumeratedValues, Field, ModifiedWriteValues, ReadAction, Register,
3-
RegisterProperties, Usage, WriteConstraint,
2+
Access, BitRange, EnumeratedValues, Field, MaybeArray, ModifiedWriteValues, ReadAction,
3+
Register, RegisterProperties, Usage, WriteConstraint,
44
};
55
use core::u64;
66
use log::warn;
77
use proc_macro2::{Ident, Punct, Spacing, Span, TokenStream};
88
use quote::{quote, ToTokens};
9+
use std::borrow::Cow;
910
use std::collections::HashSet;
1011
use svd_parser::expand::{
1112
derive_enumerated_values, derive_field, BlockPath, EnumPath, FieldPath, Index, RegisterPath,
1213
};
1314

14-
use crate::util::{self, ident_to_path, path_segment, type_path, Config, ToSanitizedCase, U32Ext};
15+
use crate::util::{
16+
self, ident_to_path, path_segment, replace_suffix, type_path, Config, FullName,
17+
ToSanitizedCase, U32Ext,
18+
};
1519
use anyhow::{anyhow, Result};
1620
use syn::punctuated::Punctuated;
1721

@@ -22,7 +26,17 @@ pub fn render(
2226
index: &Index,
2327
config: &Config,
2428
) -> Result<TokenStream> {
25-
let name = util::name_of(register, config.ignore_groups);
29+
let mut name = util::name_of(register, config.ignore_groups);
30+
// Rename if this is a derived array
31+
if dpath.is_some() {
32+
if let MaybeArray::Array(info, array_info) = register {
33+
if let Some(dim_index) = &array_info.dim_index {
34+
let index: Cow<str> = dim_index.first().unwrap().into();
35+
name =
36+
replace_suffix(&info.fullname(config.ignore_groups), &index.to_string()).into()
37+
}
38+
}
39+
}
2640
let span = Span::call_site();
2741
let name_constant_case = name.to_constant_case_ident(span);
2842
let name_snake_case = name.to_snake_case_ident(span);

0 commit comments

Comments
 (0)