Skip to content

Commit a6605d3

Browse files
committed
Fix cluster type name generation
Cluster type names were being generated without considering their full path. Include the full type path in their instance type names. Also consolidate `name_to_ty` into a helper function.
1 parent 855c1a2 commit a6605d3

File tree

1 file changed

+25
-31
lines changed

1 file changed

+25
-31
lines changed

src/generate/peripheral.rs

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,7 @@ fn expand(
564564
for erc in ercs {
565565
ercs_expanded.extend(match &erc {
566566
RegisterCluster::Register(register) => expand_register(register, defs, name)?,
567-
RegisterCluster::Cluster(cluster) => expand_cluster(cluster, defs)?,
567+
RegisterCluster::Cluster(cluster) => expand_cluster(cluster, defs, name)?,
568568
});
569569
}
570570

@@ -599,7 +599,7 @@ fn cluster_size_in_bits(info: &ClusterInfo, defs: &RegisterProperties) -> Result
599599
}
600600

601601
/// Render a given cluster (and any children) into `RegisterBlockField`s
602-
fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties) -> Result<Vec<RegisterBlockField>> {
602+
fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties, name: Option<&str>) -> Result<Vec<RegisterBlockField>> {
603603
let mut cluster_expanded = vec![];
604604

605605
let defs = cluster.default_register_properties.derive_from(defs);
@@ -635,7 +635,7 @@ fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties) -> Result<Vec<Re
635635
size: cluster_size * array_info.dim,
636636
});
637637
} else {
638-
for (field_num, field) in expand_svd_cluster(cluster)?.iter().enumerate() {
638+
for (field_num, field) in expand_svd_cluster(cluster, name)?.iter().enumerate() {
639639
cluster_expanded.push(RegisterBlockField {
640640
field: field.clone(),
641641
description: info.description.as_ref().unwrap_or(&info.name).into(),
@@ -770,21 +770,6 @@ fn expand_svd_register(
770770
register: &Register,
771771
name: Option<&str>,
772772
) -> Result<Vec<syn::Field>, syn::Error> {
773-
let name_to_ty = |name: &String, ns: Option<&str>| -> Result<syn::Type, syn::Error> {
774-
let ident = if let Some(ns) = ns {
775-
Cow::Owned(
776-
String::from("self::")
777-
+ &ns.to_sanitized_snake_case()
778-
+ "::"
779-
+ &name.to_sanitized_upper_case(),
780-
)
781-
} else {
782-
name.to_sanitized_upper_case()
783-
};
784-
785-
Ok(syn::Type::Path(parse_str::<syn::TypePath>(&ident)?))
786-
};
787-
788773
let mut out = vec![];
789774

790775
match register {
@@ -818,7 +803,7 @@ fn expand_svd_register(
818803

819804
/// Convert a parsed `Register` into its `Field` equivalent
820805
fn convert_svd_register(register: &Register, name: Option<&str>) -> Result<syn::Field, syn::Error> {
821-
let name_to_ty = |name: &String, ns: Option<&str>| -> String {
806+
let name_to_ty_str = |name: &String, ns: Option<&str>| -> String {
822807
if let Some(ns) = ns {
823808
String::from("self::")
824809
+ &ns.to_sanitized_snake_case()
@@ -832,14 +817,14 @@ fn convert_svd_register(register: &Register, name: Option<&str>) -> Result<syn::
832817
Ok(match register {
833818
Register::Single(info) => new_syn_field(
834819
&info.name.to_sanitized_snake_case(),
835-
syn::Type::Path(parse_str::<syn::TypePath>(&name_to_ty(&info.name, name))?),
820+
name_to_ty(&info.name, name)?,
836821
),
837822
Register::Array(info, array_info) => {
838823
let nb_name = util::replace_suffix(&info.name, "");
839824

840825
let ty = syn::Type::Array(parse_str::<syn::TypeArray>(&format!(
841826
"[{};{}]",
842-
name_to_ty(&nb_name, name),
827+
name_to_ty_str(&nb_name, name),
843828
u64::from(array_info.dim)
844829
))?);
845830

@@ -850,13 +835,7 @@ fn convert_svd_register(register: &Register, name: Option<&str>) -> Result<syn::
850835

851836
/// Takes a svd::Cluster which may contain a register array, and turn in into
852837
/// a list of syn::Field where the register arrays have been expanded.
853-
fn expand_svd_cluster(cluster: &Cluster) -> Result<Vec<syn::Field>, syn::Error> {
854-
let name_to_ty = |name: &String| -> Result<syn::Type, syn::Error> {
855-
Ok(syn::Type::Path(parse_str::<syn::TypePath>(
856-
&name.to_sanitized_upper_case(),
857-
)?))
858-
};
859-
838+
fn expand_svd_cluster(cluster: &Cluster, name: Option<&str>) -> Result<Vec<syn::Field>, syn::Error> {
860839
let mut out = vec![];
861840

862841
match &cluster {
@@ -877,11 +856,11 @@ fn expand_svd_cluster(cluster: &Cluster) -> Result<Vec<syn::Field>, syn::Error>
877856
let ty_name = util::replace_suffix(&info.name, "");
878857

879858
for (idx, _i) in indices.iter().zip(0..) {
880-
let name = util::replace_suffix(&info.name, idx);
859+
let nb_name = util::replace_suffix(&info.name, idx);
881860

882-
let ty = name_to_ty(&ty_name)?;
861+
let ty = name_to_ty(&ty_name, name)?;
883862

884-
out.push(new_syn_field(&name.to_sanitized_snake_case(), ty));
863+
out.push(new_syn_field(&nb_name.to_sanitized_snake_case(), ty));
885864
}
886865
}
887866
}
@@ -923,3 +902,18 @@ fn new_syn_field(ident: &str, ty: syn::Type) -> syn::Field {
923902
ty,
924903
}
925904
}
905+
906+
fn name_to_ty(name: &String, ns: Option<&str>) -> Result<syn::Type, syn::Error> {
907+
let ident = if let Some(ns) = ns {
908+
Cow::Owned(
909+
String::from("self::")
910+
+ &ns.to_sanitized_snake_case()
911+
+ "::"
912+
+ &name.to_sanitized_upper_case(),
913+
)
914+
} else {
915+
name.to_sanitized_upper_case()
916+
};
917+
918+
Ok(syn::Type::Path(parse_str::<syn::TypePath>(&ident)?))
919+
}

0 commit comments

Comments
 (0)