Implement ExtendXXX for multiple root create infos

if there are more than 1
This commit is contained in:
Maik Klein 2019-03-03 18:29:37 +01:00
parent 38fe16f6c7
commit 215511f9cf
2 changed files with 1814 additions and 1802 deletions

File diff suppressed because it is too large Load diff

View file

@ -1583,16 +1583,20 @@ pub fn derive_setters(
let extends_name = name_to_tokens(&format!("Extends{}", name)); let extends_name = name_to_tokens(&format!("Extends{}", name));
let next_extends = _struct.extends.as_ref().map(|extends| { let root_extends: Vec<Ident> = _struct
let extends = extends .extends
.split(',') .as_ref()
.find(|extend| root_create_info_names.contains(&extend.to_string())) .map(|extends| {
.expect("Should have a root create info"); extends
name_to_tokens(&format!("Extends{}", name_to_tokens(&extends))) .split(',')
}); .filter(|extend| root_create_info_names.contains(&extend.to_string()))
.map(|extends| name_to_tokens(&format!("Extends{}", name_to_tokens(&extends))))
.collect()
})
.unwrap_or(vec![]);
// We only implement a next methods for root create infos // We only implement a next methods for root create infos
let next_function = if has_next && next_extends.is_none() { let next_function = if has_next && root_extends.is_empty() {
quote! { quote! {
/// Prepends the given extension struct between the root and the first pointer. This /// Prepends the given extension struct between the root and the first pointer. This
/// method only exists on create infos that can be passed to a function directly. Only /// method only exists on create infos that can be passed to a function directly. Only
@ -1624,16 +1628,14 @@ pub fn derive_setters(
}; };
// If the struct extends something we need to implement the root create info trait. // If the struct extends something we need to implement the root create info trait.
let impl_extend_trait = if let Some(next_extends) = next_extends { let impl_extend_trait = root_extends.iter().map(|extends| {
quote! { quote! {
unsafe impl #next_extends for #name_builder<'_> { unsafe impl #extends for #name_builder<'_> {
} }
unsafe impl #next_extends for #name { unsafe impl #extends for #name {
} }
} }
} else { });
quote! {}
};
let q = quote! { let q = quote! {
impl #name { impl #name {
@ -1651,7 +1653,7 @@ pub fn derive_setters(
marker: ::std::marker::PhantomData<&'a ()>, marker: ::std::marker::PhantomData<&'a ()>,
} }
#impl_extend_trait #(#impl_extend_trait)*
#next_trait #next_trait