usecrate::parse::TraitImpl; usecrate::verbatim::VerbatimFn; use proc_macro2::{Span, TokenStream}; use quote::{quote, quote_spanned}; use syn::{Attribute, FnArg, Ident, ImplItem, Pat, Path, Signature, Visibility};
pubfn inherent(mut input: TraitImpl) -> TokenStream { let impl_token = &input.impl_token; let generics = &input.generics; let where_clause = &input.generics.where_clause; let trait_ = &input.trait_; let ty = &input.self_ty;
fn fwd_method(
trait_: &Path,
attrs: &[Attribute],
vis: &Visibility,
sig: &Signature,
body_span: Span,
) -> TokenStream { let constness = &sig.constness; let asyncness = &sig.asyncness; let unsafety = &sig.unsafety; let abi = &sig.abi; let fn_token = sig.fn_token; let ident = &sig.ident; let generics = &sig.generics; let output = &sig.output; let where_clause = &sig.generics.where_clause;
let (arg_pat, arg_val): (Vec<_>, Vec<_>) = sig
.inputs
.pairs()
.enumerate()
.map(|(i, pair)| { let (input, comma_token) = pair.into_tuple(); match input {
FnArg::Receiver(receiver) => { let self_token = receiver.self_token; if receiver.reference.is_some() {
(quote!(#receiver#comma_token), quote!(#self_token))
} else {
(quote!(#self_token#comma_token), quote!(#self_token))
}
}
FnArg::Typed(arg) => { let var = match arg.pat.as_ref() {
Pat::Ident(pat) => pat.ident.clone(),
_ => Ident::new(&format!("__arg{}", i), Span::call_site()),
}; let colon_token = arg.colon_token; let ty = &arg.ty;
(quote!(#var#colon_token#ty#comma_token), quote!(#var))
}
}
})
.unzip();
let types = generics.type_params().map(|param| ¶m.ident); let body = quote!(<Selfas#trait_>::#ident::<#(#types,)*>(#(#arg_val,)*)); let block = quote_spanned!(body_span=> { #body }); let args = quote_spanned!(sig.paren_token.span=> (#(#arg_pat)*));
let has_doc = attrs.iter().any(|attr| attr.path().is_ident("doc")); let default_doc = if has_doc {
None
} else { letmut link = String::new(); for segment in &trait_.segments {
link += &segment.ident.to_string();
link += "::";
} let msg = format!("See [`{}{}`]", link, ident);
Some(quote!(#[doc = #msg]))
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.