summaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorEric Seppanen <eds@reric.net>2021-06-02 18:17:15 -0700
committerEmilio Cobos Álvarez <emilio@crisal.io>2021-07-16 21:23:05 +0200
commitb6109c00fcb13a27e06387ce2ef417a54c24cf3f (patch)
tree3a93f160080ad10e7b009b6b62a9495180279686 /src/codegen
parent67538b64ea1b90a0d01e4f6ebd45713ec03c9222 (diff)
add custom derives callback
This callback allows us to specify arbitrary derive attributes for each named struct. This is useful for adding things that can't easily be implemented separately, such as `serde::Deserialize` or `zerocopy::FromBytes`.
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/mod.rs9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs
index 515ebf17..c70c1064 100644
--- a/src/codegen/mod.rs
+++ b/src/codegen/mod.rs
@@ -2005,6 +2005,15 @@ impl CodeGenerator for CompInfo {
let mut derives: Vec<_> = derivable_traits.into();
derives.extend(item.annotations().derives().iter().map(String::as_str));
+ // The custom derives callback may return a list of derive attributes;
+ // add them to the end of the list.
+ let custom_derives;
+ if let Some(cb) = &ctx.options().parse_callbacks {
+ custom_derives = cb.add_derives(&canonical_name);
+ // In most cases this will be a no-op, since custom_derives will be empty.
+ derives.extend(custom_derives.iter().map(|s| s.as_str()));
+ };
+
if !derives.is_empty() {
attributes.push(attributes::derives(&derives))
}