reflica 0.2.0

Automatically implements Deref / DerefMut / AsRef / AsMut from the given deref / deref_mut
Documentation
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)*
        }
    }
}