let (ret_arrow, ret) = match &sig.output {
ReturnType::Default => (Token, quote_spanned!(default_span=> ())),
ReturnType::Type(arrow, ret) => (*arrow, quote!(#ret)),
};
letmut lifetimes = CollectLifetimes::new(); for arg in sig.inputs.iter_mut() { match arg {
FnArg::Receiver(arg) => lifetimes.visit_receiver_mut(arg),
FnArg::Typed(arg) => lifetimes.visit_type_mut(&mut arg.ty),
}
}
for param in &mut sig.generics.params { match param {
GenericParam::Type(param) => { let param_name = ¶m.ident; let span = match param.colon_token.take() {
Some(colon_token) => colon_token.span,
None => param_name.span(),
}; let bounds = mem::replace(&mut param.bounds, Punctuated::new());
where_clause_or_default(&mut sig.generics.where_clause)
.predicates
.push(parse_quote_spanned!(span=> #param_name: 'async_trait + #bounds));
}
GenericParam::Lifetime(param) => { let param_name = ¶m.lifetime; let span = match param.colon_token.take() {
Some(colon_token) => colon_token.span,
None => param_name.span(),
}; let bounds = mem::replace(&mut param.bounds, Punctuated::new());
where_clause_or_default(&mut sig.generics.where_clause)
.predicates
.push(parse_quote_spanned!(span=> #param: 'async_trait + #bounds));
}
GenericParam::Const(_) => {}
}
}
for param in context.lifetimes(&lifetimes.explicit) { let param = ¶m.lifetime; let span = param.span();
where_clause_or_default(&mut sig.generics.where_clause)
.predicates
.push(parse_quote_spanned!(span=> #param: 'async_trait));
}
if sig.generics.lt_token.is_none() {
sig.generics.lt_token = Some(Token));
} if sig.generics.gt_token.is_none() {
sig.generics.gt_token = Some(Token));
}
for elided in lifetimes.elided {
sig.generics.params.push(parse_quote!(#elided));
where_clause_or_default(&mut sig.generics.where_clause)
.predicates
.push(parse_quote_spanned!(elided.span()=> #elided: 'async_trait));
}
// Input: // async fn f<T>(&self, x: &T, (a, b): (A, B)) -> Ret { // self + x + a + b // } // // Output: // Box::pin(async move { // let ___ret: Ret = { // let __self = self; // let x = x; // let (a, b) = __arg1; // // __self + x + a + b // }; // // ___ret // }) fn transform_block(context: Context, sig: &mut Signature, block: &<span style='color:red'>mut Block) { letmut self_span = None; let decls = sig
.inputs
.iter()
.enumerate()
.map(|(i, arg)| match arg {
FnArg::Receiver(Receiver {
self_token,
mutability,
..
}) => { let ident = Ident::new("__self", self_token.span);
self_span = Some(self_token.span);
quote!(let#mutability#ident = #self_token;)
}
FnArg::Typed(arg) => { // If there is a #[cfg(...)] attribute that selectively enables // the parameter, forward it to the variable. // // This is currently not applied to the `self` parameter. let attrs = arg.attrs.iter().filter(|attr| attr.path().is_ident("cfg"));
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.