summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/callbacks.rs8
-rw-r--r--src/codegen/mod.rs9
2 files changed, 17 insertions, 0 deletions
diff --git a/src/callbacks.rs b/src/callbacks.rs
index e288af43..9b345449 100644
--- a/src/callbacks.rs
+++ b/src/callbacks.rs
@@ -95,4 +95,12 @@ pub trait ParseCallbacks: fmt::Debug + UnwindSafe {
) -> Option<ImplementsTrait> {
None
}
+
+ /// Provide a list of custom derive attributes.
+ ///
+ /// If no additional attributes are wanted, this function should return an
+ /// empty `Vec`.
+ fn add_derives(&self, _name: &str) -> Vec<String> {
+ vec![]
+ }
}
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))
}