use syn::spanned::Spanned;
use super::utils::{prepend_function_path, signature_to_function_call};
pub fn defer_trait_methods(
mut trait_: syn::ItemTrait,
default: syn::Path,
) -> syn::Result<syn::ItemTrait> {
for item in trait_.items.iter_mut() {
if let syn::TraitItem::Fn(ref mut m) = item {
if m.default.is_some() {
let msg = "method should not have default implementation if using #[blanket(default = \"...\")]";
return Err(syn::Error::new(item.span(), msg));
}
let mut call = signature_to_function_call(&m.sig)?;
prepend_function_path(&mut call, default.clone())?;
m.default = Some(syn::Block {
brace_token: syn::token::Brace::default(),
stmts: vec![syn::Stmt::Expr(syn::Expr::Call(call), None)],
});
}
}
Ok(trait_)
}