write_method_var_decl_body(w, &$trait_meth.sig, "", &mut trait_resolver, Some(&meth_gen_types), false);
let mut takes_self = false;
for inp in $m.sig.inputs.iter() {
- if let syn::FnArg::Receiver(_) = inp {
- takes_self = true;
+ match inp {
+ syn::FnArg::Receiver(_) => {
+ takes_self = true;
+ break;
+ },
+ syn::FnArg::Typed(ty) => {
+ if let syn::Pat::Ident(id) = &*ty.pat {
+ if format!("{}", id.ident) == "self" {
+ takes_self = true;
+ break;
+ }
+ }
+ }
}
}
- let mut t_gen_args = String::new();
- for (idx, _) in $trait.generics.params.iter().enumerate() {
- if idx != 0 { t_gen_args += ", " };
- t_gen_args += "_"
- }
- // rustc doesn't like <_> if the _ is actually a lifetime, so
- // if all the parameters are lifetimes just skip it.
- let mut nonlifetime_param = false;
- for param in $trait.generics.params.iter() {
- if let syn::GenericParam::Lifetime(_) = param {}
- else { nonlifetime_param = true; }
- }
- if !nonlifetime_param { t_gen_args = String::new(); }
+ let mut t_gen_args_vec = Vec::new();
+ maybe_write_type_non_lifetime_generics(&mut t_gen_args_vec, &$trait.generics, &trait_resolver);
+ let t_gen_args = String::from_utf8(t_gen_args_vec).unwrap();
if takes_self {
- write!(w, "<native{} as {}<{}>>::{}(unsafe {{ &mut *(this_arg as *mut native{}) }}, ", ident, $trait_path, t_gen_args, $m.sig.ident, ident).unwrap();
+ write!(w, "<native{} as {}{}>::{}(unsafe {{ &mut *(this_arg as *mut native{}) }}, ", ident, $trait_path, t_gen_args, $m.sig.ident, ident).unwrap();
} else {
- write!(w, "<native{} as {}<{}>>::{}(", ident, $trait_path, t_gen_args, $m.sig.ident).unwrap();
+ write!(w, "<native{} as {}{}>::{}(", ident, $trait_path, t_gen_args, $m.sig.ident).unwrap();
}
let mut real_type = "".to_string();
let mut takes_mut_self = false;
let mut takes_owned_self = false;
for inp in m.sig.inputs.iter() {
- if let syn::FnArg::Receiver(r) = inp {
- takes_self = true;
- if r.mutability.is_some() { takes_mut_self = true; }
- if r.reference.is_none() { takes_owned_self = true; }
+ match inp {
+ syn::FnArg::Receiver(r) => {
+ takes_self = true;
+ if r.mutability.is_some() { takes_mut_self = true; }
+ if r.reference.is_none() { takes_owned_self = true; }
+ break;
+ },
+ syn::FnArg::Typed(ty) => {
+ if let syn::Pat::Ident(id) = &*ty.pat {
+ if format!("{}", id.ident) == "self" {
+ takes_self = true;
+ if id.mutability.is_some() { takes_mut_self = true; }
+ if id.by_ref.is_none() { takes_owned_self = true; }
+ break;
+ }
+ }
+ }
}
}
if !takes_mut_self && !takes_self {