use proc_macro2::TokenStream;
use quote::quote;
use syn::{ImplItem, ItemImpl};
pub fn generate(input: &ItemImpl) -> TokenStream {
let ItemImpl {
attrs,
defaultness,
unsafety,
generics,
trait_,
self_ty,
items,
..
} = input;
let items = items
.iter()
.filter_map(|item| match item {
ImplItem::Type(ty) if ty.ident == "Target" => None,
ImplItem::Fn(fn_) if fn_.sig.ident == "deref" || fn_.sig.ident == "deref_mut" => None,
item => Some(item),
})
.collect::<Vec<_>>();
if items.is_empty() {
return TokenStream::new();
}
let (impl_generics, _, where_clause) = generics.split_for_impl();
let trait_ = if let Some((not, path, for_)) = trait_ {
quote! {
#not #path #for_
}
} else {
TokenStream::new()
};
quote! {
#(#attrs)*
#defaultness #unsafety impl #impl_generics #trait_ #self_ty
#where_clause {
#(#items)*
}
}
}