in gazebo_derive/src/util.rs [60:107]
fn duplicate_variant(data: &Variant, duplicate: &TokenStream) -> TokenStream {
let ctor = &data.ident;
match data.fields {
Fields::Named(ref fields) => {
// Self::Ctor{x,y} => {x: clone(x), y: clone(y)}
let (pats, es): (Vec<_>, Vec<_>) = fields
.named
.iter()
.map(|f| {
let name = &f.ident;
(
quote_spanned! {f.span() =>
#name
},
quote_spanned! {f.span() =>
#name: #duplicate(#name)
},
)
})
.unzip();
quote! {
Self::#ctor{ #(#pats, )* } => Self::#ctor{ #(#es, )* }
}
}
Fields::Unnamed(ref fields) => {
// Self::Ctor(v0,v1) => Self::Ctor(clone(v0), clone(v1))
let (pats, es): (Vec<_>, Vec<_>) = fields
.unnamed
.iter()
.enumerate()
.map(|(i, f)| {
let var = Ident::new(&format!("v{}", i), f.span());
(
quote_spanned! {f.span() => #var},
quote_spanned! {f.span() => #duplicate(#var)},
)
})
.unzip();
quote! {
Self::#ctor( #(#pats,)* ) => Self::#ctor( #(#es,)* )
}
}
Fields::Unit => {
// Self::Ctor => Self::Ctor
quote!(Self::#ctor => Self::#ctor)
}
}
}