Skip to content

Commit 139cadc

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 139cadc

File tree

1 file changed

+32
-31
lines changed

1 file changed

+32
-31
lines changed

src/generate/peripheral.rs

Lines changed: 32 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,11 @@ 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(
603+
cluster: &Cluster,
604+
defs: &RegisterProperties,
605+
name: Option<&str>,
606+
) -> Result<Vec<RegisterBlockField>> {
603607
let mut cluster_expanded = vec![];
604608

605609
let defs = cluster.default_register_properties.derive_from(defs);
@@ -635,7 +639,7 @@ fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties) -> Result<Vec<Re
635639
size: cluster_size * array_info.dim,
636640
});
637641
} else {
638-
for (field_num, field) in expand_svd_cluster(cluster)?.iter().enumerate() {
642+
for (field_num, field) in expand_svd_cluster(cluster, name)?.iter().enumerate() {
639643
cluster_expanded.push(RegisterBlockField {
640644
field: field.clone(),
641645
description: info.description.as_ref().unwrap_or(&info.name).into(),
@@ -770,21 +774,6 @@ fn expand_svd_register(
770774
register: &Register,
771775
name: Option<&str>,
772776
) -> 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-
788777
let mut out = vec![];
789778

790779
match register {
@@ -818,7 +807,7 @@ fn expand_svd_register(
818807

819808
/// Convert a parsed `Register` into its `Field` equivalent
820809
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 {
810+
let name_to_ty_str = |name: &String, ns: Option<&str>| -> String {
822811
if let Some(ns) = ns {
823812
String::from("self::")
824813
+ &ns.to_sanitized_snake_case()
@@ -832,14 +821,14 @@ fn convert_svd_register(register: &Register, name: Option<&str>) -> Result<syn::
832821
Ok(match register {
833822
Register::Single(info) => new_syn_field(
834823
&info.name.to_sanitized_snake_case(),
835-
syn::Type::Path(parse_str::<syn::TypePath>(&name_to_ty(&info.name, name))?),
824+
name_to_ty(&info.name, name)?,
836825
),
837826
Register::Array(info, array_info) => {
838827
let nb_name = util::replace_suffix(&info.name, "");
839828

840829
let ty = syn::Type::Array(parse_str::<syn::TypeArray>(&format!(
841830
"[{};{}]",
842-
name_to_ty(&nb_name, name),
831+
name_to_ty_str(&nb_name, name),
843832
u64::from(array_info.dim)
844833
))?);
845834

@@ -850,13 +839,10 @@ fn convert_svd_register(register: &Register, name: Option<&str>) -> Result<syn::
850839

851840
/// Takes a svd::Cluster which may contain a register array, and turn in into
852841
/// 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-
842+
fn expand_svd_cluster(
843+
cluster: &Cluster,
844+
name: Option<&str>,
845+
) -> Result<Vec<syn::Field>, syn::Error> {
860846
let mut out = vec![];
861847

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

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

882-
let ty = name_to_ty(&ty_name)?;
868+
let ty = name_to_ty(&ty_name, name)?;
883869

884-
out.push(new_syn_field(&name.to_sanitized_snake_case(), ty));
870+
out.push(new_syn_field(&nb_name.to_sanitized_snake_case(), ty));
885871
}
886872
}
887873
}
@@ -923,3 +909,18 @@ fn new_syn_field(ident: &str, ty: syn::Type) -> syn::Field {
923909
ty,
924910
}
925911
}
912+
913+
fn name_to_ty(name: &String, ns: Option<&str>) -> Result<syn::Type, syn::Error> {
914+
let ident = if let Some(ns) = ns {
915+
Cow::Owned(
916+
String::from("self::")
917+
+ &ns.to_sanitized_snake_case()
918+
+ "::"
919+
+ &name.to_sanitized_upper_case(),
920+
)
921+
} else {
922+
name.to_sanitized_upper_case()
923+
};
924+
925+
Ok(syn::Type::Path(parse_str::<syn::TypePath>(&ident)?))
926+
}

0 commit comments

Comments
 (0)