Skip to content

Commit f58762b

Browse files
bors[bot]burrbull
andauthored
Merge #644
644: yet more cleanups r=Emilgardis a=burrbull Co-authored-by: Andrey Zgarbul <[email protected]>
2 parents 4e6b948 + e7247ac commit f58762b

File tree

3 files changed

+65
-97
lines changed

3 files changed

+65
-97
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1111
- Move cluster struct inside mod
1212
- Support non-sequential field arrays
1313
- Use inlined variables in `format!` (Rust 1.58)
14-
- Refactor `periperal.rs` & `util.rs`
14+
- Refactor, clean `periperal.rs` & `util.rs`
1515
- use `svd_parser::expand::Index` for derive
1616
- Generated enum names now consider `name` field in `enumeratedValues`
1717
- Use constant case for structure names; internal rearrangements for

src/generate/peripheral.rs

Lines changed: 62 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ use std::borrow::Cow;
22
use std::cmp::Ordering;
33
use svd_parser::expand::{derive_cluster, derive_peripheral, derive_register, BlockPath, Index};
44

5-
use crate::svd::{
6-
array::names, Cluster, ClusterInfo, DimElement, Peripheral, Register, RegisterCluster,
7-
};
5+
use crate::svd::{array::names, Cluster, ClusterInfo, Peripheral, Register, RegisterCluster};
86
use log::{debug, trace, warn};
97
use proc_macro2::{Ident, Punct, Spacing, Span, TokenStream};
108
use quote::{quote, ToTokens};
@@ -533,13 +531,11 @@ fn register_or_cluster_block(
533531
last_end = region.end;
534532
}
535533

536-
let name = Ident::new(
537-
&match name {
538-
Some(name) => name.to_sanitized_constant_case(),
539-
None => "RegisterBlock".into(),
540-
},
541-
span,
542-
);
534+
let name = if let Some(name) = name {
535+
name.to_constant_case_ident(span)
536+
} else {
537+
Ident::new("RegisterBlock", span)
538+
};
543539

544540
let accessors = if !accessors.is_empty() {
545541
quote! {
@@ -654,14 +650,24 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
654650
.unwrap_or(&cluster.name)
655651
.to_string();
656652

653+
let ty_name = if cluster.is_single() {
654+
cluster.name.to_string()
655+
} else {
656+
util::replace_suffix(&cluster.name, "")
657+
};
658+
let ty = syn::Type::Path(name_to_ty(&ty_name));
659+
657660
match cluster {
658-
Cluster::Single(info) => cluster_expanded.push(RegisterBlockField {
659-
syn_field: cluster_to_syn_field(cluster)?,
660-
description,
661-
offset: info.address_offset,
662-
size: cluster_size,
663-
accessors: None,
664-
}),
661+
Cluster::Single(info) => {
662+
let syn_field = new_syn_field(info.name.to_snake_case_ident(Span::call_site()), ty);
663+
cluster_expanded.push(RegisterBlockField {
664+
syn_field,
665+
description,
666+
offset: info.address_offset,
667+
size: cluster_size,
668+
accessors: None,
669+
})
670+
}
665671
Cluster::Array(info, array_info) => {
666672
let sequential_addresses =
667673
(array_info.dim == 1) || (cluster_size == array_info.dim_increment * BITS_PER_BYTE);
@@ -688,9 +694,7 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
688694
} else {
689695
let span = Span::call_site();
690696
let mut accessors = TokenStream::new();
691-
let nb_name = util::replace_suffix(&info.name, "");
692-
let ty = name_to_ty(&nb_name);
693-
let nb_name_cs = nb_name.to_snake_case_ident(span);
697+
let nb_name_cs = ty_name.to_snake_case_ident(span);
694698
for (i, idx) in array_info.indexes().enumerate() {
695699
let idx_name =
696700
util::replace_suffix(&info.name, &idx).to_snake_case_ident(span);
@@ -710,8 +714,12 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
710714
}
711715
Some(accessors)
712716
};
717+
let array_ty = new_syn_array(ty, array_info.dim);
713718
cluster_expanded.push(RegisterBlockField {
714-
syn_field: cluster_to_syn_field(cluster)?,
719+
syn_field: new_syn_field(
720+
ty_name.to_snake_case_ident(Span::call_site()),
721+
array_ty,
722+
),
715723
description,
716724
offset: info.address_offset,
717725
size: cluster_size * array_info.dim,
@@ -720,11 +728,17 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
720728
} else if sequential_indexes_from0 && config.const_generic {
721729
// Include a ZST ArrayProxy giving indexed access to the
722730
// elements.
723-
cluster_expanded.push(array_proxy(info, array_info));
731+
let ap_path = array_proxy_type(ty, array_info);
732+
let syn_field =
733+
new_syn_field(ty_name.to_snake_case_ident(Span::call_site()), ap_path);
734+
cluster_expanded.push(RegisterBlockField {
735+
syn_field,
736+
description: info.description.as_ref().unwrap_or(&info.name).into(),
737+
offset: info.address_offset,
738+
size: 0,
739+
accessors: None,
740+
});
724741
} else {
725-
let ty_name = util::replace_suffix(&info.name, "");
726-
let ty = syn::Type::Path(name_to_ty(&ty_name));
727-
728742
for (field_num, idx) in array_info.indexes().enumerate() {
729743
let nb_name = util::replace_suffix(&info.name, &idx);
730744
let syn_field =
@@ -756,15 +770,25 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
756770
.ok_or_else(|| anyhow!("Register {} has no `size` field", register.name))?;
757771
let description = register.description.clone().unwrap_or_default();
758772

773+
let info_name = register.fullname(config.ignore_groups);
774+
let ty_name = if register.is_single() {
775+
info_name.to_string()
776+
} else {
777+
util::replace_suffix(&info_name, "")
778+
};
779+
let ty = name_to_wrapped_ty(&ty_name);
780+
759781
match register {
760-
Register::Single(info) => register_expanded.push(RegisterBlockField {
761-
syn_field: register_to_syn_field(register, config.ignore_groups)
762-
.with_context(|| "syn error occured")?,
763-
description,
764-
offset: info.address_offset,
765-
size: register_size,
766-
accessors: None,
767-
}),
782+
Register::Single(info) => {
783+
let syn_field = new_syn_field(ty_name.to_snake_case_ident(Span::call_site()), ty);
784+
register_expanded.push(RegisterBlockField {
785+
syn_field,
786+
description,
787+
offset: info.address_offset,
788+
size: register_size,
789+
accessors: None,
790+
})
791+
}
768792
Register::Array(info, array_info) => {
769793
let sequential_addresses = (array_info.dim == 1)
770794
|| (register_size == array_info.dim_increment * BITS_PER_BYTE);
@@ -791,10 +815,7 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
791815
} else {
792816
let span = Span::call_site();
793817
let mut accessors = TokenStream::new();
794-
let nb_name = util::replace_suffix(&info.fullname(config.ignore_groups), "");
795-
let ty = name_to_wrapped_ty(&nb_name);
796-
let nb_name_cs = nb_name.to_snake_case_ident(span);
797-
let info_name = info.fullname(config.ignore_groups);
818+
let nb_name_cs = ty_name.to_snake_case_ident(span);
798819
for (i, idx) in array_info.indexes().enumerate() {
799820
let idx_name =
800821
util::replace_suffix(&info_name, &idx).to_snake_case_ident(span);
@@ -814,18 +835,17 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
814835
}
815836
Some(accessors)
816837
};
838+
let array_ty = new_syn_array(ty, array_info.dim);
839+
let syn_field =
840+
new_syn_field(ty_name.to_snake_case_ident(Span::call_site()), array_ty);
817841
register_expanded.push(RegisterBlockField {
818-
syn_field: register_to_syn_field(register, config.ignore_groups)?,
842+
syn_field,
819843
description,
820844
offset: info.address_offset,
821845
size: register_size * array_info.dim,
822846
accessors,
823847
});
824848
} else {
825-
let info_name = info.fullname(config.ignore_groups);
826-
let ty_name = util::replace_suffix(&info_name, "");
827-
let ty = name_to_wrapped_ty(&ty_name);
828-
829849
for (field_num, idx) in array_info.indexes().enumerate() {
830850
let nb_name = util::replace_suffix(&info_name, &idx);
831851
let syn_field =
@@ -959,58 +979,6 @@ fn cluster_block(
959979
})
960980
}
961981

962-
/// Convert a parsed `Register` into its `Field` equivalent
963-
fn register_to_syn_field(register: &Register, ignore_group: bool) -> Result<syn::Field> {
964-
Ok(match register {
965-
Register::Single(info) => {
966-
let info_name = info.fullname(ignore_group);
967-
let ty = name_to_wrapped_ty(&info_name);
968-
new_syn_field(info_name.to_snake_case_ident(Span::call_site()), ty)
969-
}
970-
Register::Array(info, array_info) => {
971-
let info_name = info.fullname(ignore_group);
972-
let nb_name = util::replace_suffix(&info_name, "");
973-
let ty = name_to_wrapped_ty(&nb_name);
974-
let array_ty = new_syn_array(ty, array_info.dim);
975-
976-
new_syn_field(nb_name.to_snake_case_ident(Span::call_site()), array_ty)
977-
}
978-
})
979-
}
980-
981-
/// Return an syn::Type for an ArrayProxy.
982-
fn array_proxy(info: &ClusterInfo, array_info: &DimElement) -> RegisterBlockField {
983-
let ty_name = util::replace_suffix(&info.name, "");
984-
let ty = name_to_ty(&ty_name);
985-
986-
let ap_path = array_proxy_type(ty, array_info);
987-
988-
RegisterBlockField {
989-
syn_field: new_syn_field(ty_name.to_snake_case_ident(Span::call_site()), ap_path),
990-
description: info.description.as_ref().unwrap_or(&info.name).into(),
991-
offset: info.address_offset,
992-
size: 0,
993-
accessors: None,
994-
}
995-
}
996-
997-
/// Convert a parsed `Cluster` into its `Field` equivalent
998-
fn cluster_to_syn_field(cluster: &Cluster) -> Result<syn::Field, syn::Error> {
999-
Ok(match cluster {
1000-
Cluster::Single(info) => {
1001-
let ty = syn::Type::Path(name_to_ty(&info.name));
1002-
new_syn_field(info.name.to_snake_case_ident(Span::call_site()), ty)
1003-
}
1004-
Cluster::Array(info, array_info) => {
1005-
let ty_name = util::replace_suffix(&info.name, "");
1006-
let ty = syn::Type::Path(name_to_ty(&ty_name));
1007-
let array_ty = new_syn_array(ty, array_info.dim);
1008-
1009-
new_syn_field(ty_name.to_snake_case_ident(Span::call_site()), array_ty)
1010-
}
1011-
})
1012-
}
1013-
1014982
fn new_syn_field(ident: Ident, ty: syn::Type) -> syn::Field {
1015983
let span = Span::call_site();
1016984
syn::Field {

src/util.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,9 +341,9 @@ pub fn new_syn_u32(len: u32, span: Span) -> syn::Expr {
341341
})
342342
}
343343

344-
pub fn array_proxy_type(ty: TypePath, array_info: &DimElement) -> Type {
344+
pub fn array_proxy_type(ty: Type, array_info: &DimElement) -> Type {
345345
let span = Span::call_site();
346-
let inner_path = GenericArgument::Type(Type::Path(ty));
346+
let inner_path = GenericArgument::Type(ty);
347347
let mut args = Punctuated::new();
348348
args.push(inner_path);
349349
args.push(GenericArgument::Const(new_syn_u32(array_info.dim, span)));

0 commit comments

Comments
 (0)