Skip to content

Commit f9b0e25

Browse files
committed
reexport enum
1 parent 0a1d951 commit f9b0e25

File tree

2 files changed

+59
-67
lines changed

2 files changed

+59
-67
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
1212
- Add `base-address-shift` config flag
1313
- Use `PascalCase` for type idents, fix case changing bugs, add `--ident-format` (`-f`) option flag
1414
- Add `enum_read_name` for `read-only` enums, `RWEnum` helper
15+
- Reexport enums inside register again
1516

1617
## [v0.31.5] - 2024-01-04
1718

src/generate/register.rs

Lines changed: 58 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -620,8 +620,9 @@ pub fn fields(
620620

621621
// Hack for #625
622622
let mut enum_derives = HashSet::new();
623+
let mut read_enum_derives = HashSet::new();
624+
let mut write_enum_derives = HashSet::new();
623625
let mut reader_derives = HashSet::new();
624-
let mut writer_enum_derives = HashSet::new();
625626
let mut writer_derives = HashSet::new();
626627

627628
// TODO enumeratedValues
@@ -737,32 +738,31 @@ pub fn fields(
737738

738739
// If this field can be read, generate read proxy structure and value structure.
739740
if can_read {
740-
// get the type of value structure. It can be generated from either name field
741-
// in enumeratedValues if it's an enumeration, or from field name directly if it's not.
741+
// collect information on items in enumeration to generate it later.
742+
let mut enum_items = TokenStream::new();
743+
744+
// if this is an enumeratedValues not derived from base, generate the enum structure
745+
// and implement functions for each value in enumeration.
742746
let value_read_ty = if let Some(ev) = rwenum.read_enum() {
743-
let fmt = if rwenum.different_enums() {
744-
"enum_read_name"
747+
let derives;
748+
let fmt;
749+
if rwenum.different_enums() {
750+
derives = &mut read_enum_derives;
751+
fmt = "enum_read_name";
745752
} else {
746-
"enum_name"
753+
derives = &mut enum_derives;
754+
fmt = "enum_name";
747755
};
748-
ident(
756+
// get the type of value structure. It can be generated from either name field
757+
// in enumeratedValues if it's an enumeration, or from field name directly if it's not.
758+
let value_read_ty = ident(
749759
ev.values().name.as_deref().unwrap_or(&name),
750760
config,
751761
fmt,
752762
span,
753-
)
754-
} else {
755-
// raw_field_value_read_ty
756-
fty.clone()
757-
};
758-
759-
// collect information on items in enumeration to generate it later.
760-
let mut enum_items = TokenStream::new();
763+
);
761764

762-
if let Some(ev) = rwenum.read_enum() {
763765
match ev {
764-
// if this is an enumeratedValues not derived from base, generate the enum structure
765-
// and implement functions for each value in enumeration.
766766
EV::New(evs) => {
767767
// parse enum variants from enumeratedValues svd record
768768
let mut variants = Variant::from_enumerated_values(evs, config)?;
@@ -909,24 +909,22 @@ pub fn fields(
909909
}
910910
}
911911
EV::Derived(_, base) => {
912-
// only pub use enum when derived from another register.
913-
// If field is in the same register it emits
914-
// pub use enum from same module which is not expected
915-
if base.register() != fpath.register() {
916-
// use the same enum structure name
917-
if !enum_derives.contains(&value_read_ty) {
918-
let base_path =
919-
base_syn_path(base, &fpath, &value_read_ty, config)?;
920-
mod_items.extend(quote! {
921-
#[doc = #description]
922-
pub use #base_path as #value_read_ty;
923-
});
924-
enum_derives.insert(value_read_ty.clone());
925-
}
912+
let base_ident = ident(&base.name, config, fmt, span);
913+
if !derives.contains(&value_read_ty) {
914+
let base_path = base_syn_path(base, &fpath, &base_ident, config)?;
915+
mod_items.extend(quote! {
916+
#[doc = #description]
917+
pub use #base_path as #value_read_ty;
918+
});
926919
}
927920
}
928921
}
929-
}
922+
derives.insert(value_read_ty.clone());
923+
value_read_ty
924+
} else {
925+
// raw_field_value_read_ty
926+
fty.clone()
927+
};
930928

931929
// get a brief description for this field
932930
// the suffix string from field name is removed in brief description.
@@ -1083,29 +1081,28 @@ pub fn fields(
10831081
// If this field can be written, generate write proxy. Generate write value if it differs from
10841082
// the read value, or else we reuse read value.
10851083
if can_write {
1084+
let mut proxy_items = TokenStream::new();
1085+
let mut unsafety = unsafety(f.write_constraint.as_ref(), width);
1086+
1087+
// if we writes to enumeratedValues, generate its structure if it differs from read structure.
10861088
let value_write_ty = if let Some(ev) = rwenum.write_enum() {
1087-
let fmt = if rwenum.different_enums() {
1088-
"enum_write_name"
1089+
let derives;
1090+
let fmt;
1091+
if rwenum.different_enums() {
1092+
derives = &mut write_enum_derives;
1093+
fmt = "enum_write_name";
10891094
} else {
1090-
"enum_name"
1095+
derives = &mut enum_derives;
1096+
fmt = "enum_name";
10911097
};
1092-
ident(
1098+
let value_write_ty = ident(
10931099
ev.values().name.as_deref().unwrap_or(&name),
10941100
config,
10951101
fmt,
10961102
span,
1097-
)
1098-
} else {
1099-
// raw_field_value_write_ty
1100-
fty.clone()
1101-
};
1103+
);
11021104

1103-
let mut proxy_items = TokenStream::new();
1104-
let mut unsafety = unsafety(f.write_constraint.as_ref(), width);
1105-
1106-
if let Some(ev) = rwenum.write_enum() {
11071105
match ev {
1108-
// if we writes to enumeratedValues, generate its structure if it differs from read structure.
11091106
EV::New(evs) => {
11101107
// parse variants from enumeratedValues svd record
11111108
let mut variants = Variant::from_enumerated_values(evs, config)?;
@@ -1167,24 +1164,23 @@ pub fn fields(
11671164
}
11681165
}
11691166
EV::Derived(_, base) => {
1170-
// If field is in the same register it emits pub use structure from same module.
1171-
if base.register() != fpath.register() {
1172-
// use the same enum structure name
1173-
if rwenum.generate_write_enum()
1174-
&& !writer_enum_derives.contains(&value_write_ty)
1175-
{
1176-
let base_path =
1177-
base_syn_path(base, &fpath, &value_write_ty, config)?;
1178-
mod_items.extend(quote! {
1179-
#[doc = #description]
1180-
pub use #base_path as #value_write_ty;
1181-
});
1182-
writer_enum_derives.insert(value_write_ty.clone());
1183-
}
1167+
let base_ident = ident(&base.name, config, fmt, span);
1168+
1169+
if rwenum.generate_write_enum() && !derives.contains(&value_write_ty) {
1170+
let base_path = base_syn_path(base, &fpath, &base_ident, config)?;
1171+
mod_items.extend(quote! {
1172+
#[doc = #description]
1173+
pub use #base_path as #value_write_ty;
1174+
});
11841175
}
11851176
}
11861177
}
1187-
}
1178+
derives.insert(value_write_ty.clone());
1179+
value_write_ty
1180+
} else {
1181+
// raw_field_value_write_ty
1182+
fty.clone()
1183+
};
11881184

11891185
let mwv = f.modified_write_values.or(rmwv).unwrap_or_default();
11901186

@@ -1238,11 +1234,6 @@ pub fn fields(
12381234
});
12391235
}
12401236
Some(EV::Derived(_, base)) => {
1241-
// if base.register == None, derive write from the same module. This is allowed because both
1242-
// the generated and source write proxy are in the same module.
1243-
// we never reuse writer for writer in different module does not have the same _SPEC strcuture,
1244-
// thus we cannot write to current register using re-exported write proxy.
1245-
12461237
// generate pub use field_1 writer as field_2 writer
12471238
let base_field = util::replace_suffix(&base.field.name, "");
12481239
let base_w = ident(&base_field, config, "field_writer", span);

0 commit comments

Comments
 (0)