Skip to content

Commit 11937f2

Browse files
authored
Merge pull request #816 from rust-embedded/reexport_enum
reexport enum
2 parents 0a1d951 + 4813f56 commit 11937f2

File tree

4 files changed

+95
-69
lines changed

4 files changed

+95
-69
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/config.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ pub struct Config {
3333
pub reexport_interrupt: bool,
3434
pub ident_formats: IdentFormats,
3535
pub ident_formats_theme: Option<IdentFormatsTheme>,
36+
pub field_names_for_enums: bool,
3637
pub base_address_shift: u64,
3738
}
3839

src/generate/register.rs

Lines changed: 85 additions & 69 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,35 @@ 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(
749-
ev.values().name.as_deref().unwrap_or(&name),
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(
759+
if config.field_names_for_enums {
760+
&name
761+
} else {
762+
ev.values().name.as_deref().unwrap_or(&name)
763+
},
750764
config,
751765
fmt,
752766
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();
767+
);
761768

762-
if let Some(ev) = rwenum.read_enum() {
763769
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.
766770
EV::New(evs) => {
767771
// parse enum variants from enumeratedValues svd record
768772
let mut variants = Variant::from_enumerated_values(evs, config)?;
@@ -909,24 +913,31 @@ pub fn fields(
909913
}
910914
}
911915
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-
}
916+
let base_ident = if config.field_names_for_enums {
917+
ident(
918+
&util::replace_suffix(&base.field().name, ""),
919+
config,
920+
fmt,
921+
span,
922+
)
923+
} else {
924+
ident(&base.name, config, fmt, span)
925+
};
926+
if !derives.contains(&value_read_ty) {
927+
let base_path = base_syn_path(base, &fpath, &base_ident, config)?;
928+
mod_items.extend(quote! {
929+
#[doc = #description]
930+
pub use #base_path as #value_read_ty;
931+
});
926932
}
927933
}
928934
}
929-
}
935+
derives.insert(value_read_ty.clone());
936+
value_read_ty
937+
} else {
938+
// raw_field_value_read_ty
939+
fty.clone()
940+
};
930941

931942
// get a brief description for this field
932943
// the suffix string from field name is removed in brief description.
@@ -1083,29 +1094,32 @@ pub fn fields(
10831094
// If this field can be written, generate write proxy. Generate write value if it differs from
10841095
// the read value, or else we reuse read value.
10851096
if can_write {
1097+
let mut proxy_items = TokenStream::new();
1098+
let mut unsafety = unsafety(f.write_constraint.as_ref(), width);
1099+
1100+
// if we writes to enumeratedValues, generate its structure if it differs from read structure.
10861101
let value_write_ty = if let Some(ev) = rwenum.write_enum() {
1087-
let fmt = if rwenum.different_enums() {
1088-
"enum_write_name"
1102+
let derives;
1103+
let fmt;
1104+
if rwenum.different_enums() {
1105+
derives = &mut write_enum_derives;
1106+
fmt = "enum_write_name";
10891107
} else {
1090-
"enum_name"
1108+
derives = &mut enum_derives;
1109+
fmt = "enum_name";
10911110
};
1092-
ident(
1093-
ev.values().name.as_deref().unwrap_or(&name),
1111+
let value_write_ty = ident(
1112+
if config.field_names_for_enums {
1113+
&name
1114+
} else {
1115+
ev.values().name.as_deref().unwrap_or(&name)
1116+
},
10941117
config,
10951118
fmt,
10961119
span,
1097-
)
1098-
} else {
1099-
// raw_field_value_write_ty
1100-
fty.clone()
1101-
};
1120+
);
11021121

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() {
11071122
match ev {
1108-
// if we writes to enumeratedValues, generate its structure if it differs from read structure.
11091123
EV::New(evs) => {
11101124
// parse variants from enumeratedValues svd record
11111125
let mut variants = Variant::from_enumerated_values(evs, config)?;
@@ -1167,24 +1181,31 @@ pub fn fields(
11671181
}
11681182
}
11691183
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-
}
1184+
let base_ident = if config.field_names_for_enums {
1185+
ident(
1186+
&util::replace_suffix(&base.field().name, ""),
1187+
config,
1188+
fmt,
1189+
span,
1190+
)
1191+
} else {
1192+
ident(&base.name, config, fmt, span)
1193+
};
1194+
if rwenum.generate_write_enum() && !derives.contains(&value_write_ty) {
1195+
let base_path = base_syn_path(base, &fpath, &base_ident, config)?;
1196+
mod_items.extend(quote! {
1197+
#[doc = #description]
1198+
pub use #base_path as #value_write_ty;
1199+
});
11841200
}
11851201
}
11861202
}
1187-
}
1203+
derives.insert(value_write_ty.clone());
1204+
value_write_ty
1205+
} else {
1206+
// raw_field_value_write_ty
1207+
fty.clone()
1208+
};
11881209

11891210
let mwv = f.modified_write_values.or(rmwv).unwrap_or_default();
11901211

@@ -1238,11 +1259,6 @@ pub fn fields(
12381259
});
12391260
}
12401261
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-
12461262
// generate pub use field_1 writer as field_2 writer
12471263
let base_field = util::replace_suffix(&base.field.name, "");
12481264
let base_w = ident(&base_field, config, "field_writer", span);

src/main.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,18 @@ Allowed cases are `unchanged` (''), `pascal` ('p'), `constant` ('c') and `snake`
172172
.arg(
173173
Arg::new("ident_formats_theme")
174174
.long("ident-formats-theme")
175+
.alias("ident_formats_theme")
175176
.help("A set of `ident_format` settings. `new` or `legacy`")
176177
.action(ArgAction::Set)
177178
.value_name("THEME"),
178179
)
180+
.arg(
181+
Arg::new("field_names_for_enums")
182+
.long("field-names-for-enums")
183+
.alias("field_names_for_enums")
184+
.action(ArgAction::SetTrue)
185+
.help("Use field name for enumerations even when enumeratedValues has a name"),
186+
)
179187
.arg(
180188
Arg::new("max_cluster_size")
181189
.long("max-cluster-size")

0 commit comments

Comments
 (0)