impl VisitMut for AsyncAwaitRemoval { fn visit_expr_mut(&mutself, node: &mut Expr) { // Delegate to the default impl to visit nested expressions.
visit_mut::visit_expr_mut(self, node);
match node {
Expr::Await(expr) => *node = (*expr.base).clone(),
Expr::Async(expr) => { let inner = &expr.block; let sync_expr = iflet [Stmt::Expr(expr, None)] = inner.stmts.as_slice() { // remove useless braces when there is only one statement
expr.clone()
} else {
Expr::Block(ExprBlock {
attrs: expr.attrs.clone(),
block: inner.clone(),
label: None,
})
};
*node = sync_expr;
}
_ => {}
}
}
fn visit_item_mut(&mutself, i: &mut Item) { // find generic parameter of Future and replace it with its Output type iflet Item::Fn(item_fn) = i { letmut inputs: Vec<(String, PathSegment)> = vec![];
// generic params: <T:Future<Output=()>, F> for param in &item_fn.sig.generics.params { // generic param: T:Future<Output=()> iflet GenericParam::Type(type_param) = param { let generic_type_name = type_param.ident.to_string();
// bound: Future<Output=()> for bound in &type_param.bounds {
inputs.extend(search_trait_bound(&generic_type_name, bound));
}
}
}
iflet Some(where_clause) = &item_fn.sig.generics.where_clause { for predicate in &where_clause.predicates { iflet WherePredicate::Type(predicate_type) = predicate { let generic_type_name = ifletType::Path(p) = &predicate_type.bounded_ty {
p.path.segments[0].ident.to_string()
} else {
panic!("Please submit an issue");
};
for bound in &predicate_type.bounds {
inputs.extend(search_trait_bound(&generic_type_name, bound));
}
}
}
}
for (generic_type_name, path_seg) in &inputs {
ReplaceGenericType::replace_generic_type(i, generic_type_name, path_seg);
}
}
visit_item_mut(self, i);
}
}
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.