murf-macros 0.2.0

Murf's proc macros
Documentation
use quote::{quote, ToTokens};
use syn::{FnArg, ImplItemFn, Item, ReturnType, Stmt};

pub(crate) trait MethodEx {
    fn is_associated_fn(&self) -> bool;
    fn has_default_impl(&self) -> bool;
    fn need_default_impl(&self) -> bool;
}

impl MethodEx for ImplItemFn {
    fn is_associated_fn(&self) -> bool {
        self.sig.inputs.iter().all(|i| match i {
            FnArg::Receiver(_) => false,
            FnArg::Typed(t) if t.pat.to_token_stream().to_string() == "self" => false,
            FnArg::Typed(_) => true,
        })
    }

    fn has_default_impl(&self) -> bool {
        let stmts = &self.block.stmts;

        let no_impl_block = self.block.stmts.len() == 1
            && matches!(self.block.stmts.last(), Some(Stmt::Item(Item::Verbatim(v))) if v.to_string() == ";");
        let generated_panic_impl_block = quote!( #( #stmts )* )
            .to_string()
            .contains("\"No default action specified!\"");

        !no_impl_block && !generated_panic_impl_block
    }

    fn need_default_impl(&self) -> bool {
        self.sig.output != ReturnType::Default
    }
}