mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-03 07:04:49 +00:00
Desugar async fn completely
This commit is contained in:
parent
a6464392c1
commit
c26b12d01c
5 changed files with 56 additions and 21 deletions
|
@ -459,7 +459,6 @@ pub(crate) struct InferenceContext<'a> {
|
|||
resume_yield_tys: Option<(Ty, Ty)>,
|
||||
diverges: Diverges,
|
||||
breakables: Vec<BreakableContext>,
|
||||
is_async_fn: bool,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
|
@ -527,7 +526,6 @@ impl<'a> InferenceContext<'a> {
|
|||
resolver,
|
||||
diverges: Diverges::Maybe,
|
||||
breakables: Vec::new(),
|
||||
is_async_fn: false,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -639,9 +637,6 @@ impl<'a> InferenceContext<'a> {
|
|||
self.infer_top_pat(*pat, &ty);
|
||||
}
|
||||
let return_ty = &*data.ret_type;
|
||||
if data.has_async_kw() {
|
||||
self.is_async_fn = true;
|
||||
}
|
||||
|
||||
let ctx = crate::lower::TyLoweringContext::new(self.db, &self.resolver)
|
||||
.with_impl_trait_mode(ImplTraitLoweringMode::Opaque);
|
||||
|
|
|
@ -293,7 +293,6 @@ impl<'a> InferenceContext<'a> {
|
|||
|
||||
// FIXME: lift these out into a struct
|
||||
let prev_diverges = mem::replace(&mut self.diverges, Diverges::Maybe);
|
||||
let prev_is_async_fn = mem::replace(&mut self.is_async_fn, false);
|
||||
let prev_ret_ty = mem::replace(&mut self.return_ty, ret_ty.clone());
|
||||
let prev_ret_coercion =
|
||||
mem::replace(&mut self.return_coercion, Some(CoerceMany::new(ret_ty)));
|
||||
|
@ -307,7 +306,6 @@ impl<'a> InferenceContext<'a> {
|
|||
self.diverges = prev_diverges;
|
||||
self.return_ty = prev_ret_ty;
|
||||
self.return_coercion = prev_ret_coercion;
|
||||
self.is_async_fn = prev_is_async_fn;
|
||||
self.resume_yield_tys = prev_resume_yield_tys;
|
||||
|
||||
ty
|
||||
|
@ -963,11 +961,7 @@ impl<'a> InferenceContext<'a> {
|
|||
.as_mut()
|
||||
.expect("infer_return called outside function body")
|
||||
.expected_ty();
|
||||
let return_expr_ty = if self.is_async_fn {
|
||||
self.infer_async_block(expr, &None, &[], &Some(expr))
|
||||
} else {
|
||||
self.infer_expr_inner(expr, &Expectation::HasType(ret_ty))
|
||||
};
|
||||
let return_expr_ty = self.infer_expr_inner(expr, &Expectation::HasType(ret_ty));
|
||||
let mut coerce_many = self.return_coercion.take().unwrap();
|
||||
coerce_many.coerce(self, Some(expr), &return_expr_ty);
|
||||
self.return_coercion = Some(coerce_many);
|
||||
|
|
|
@ -2094,6 +2094,24 @@ async fn main() {
|
|||
"#]],
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn async_fn_and_try_operator() {
|
||||
check_no_mismatches(
|
||||
r#"
|
||||
//- minicore: future, result, fn, try, from
|
||||
async fn foo() -> Result<(), ()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn bar() -> Result<(), ()> {
|
||||
let x = foo().await?;
|
||||
Ok(x)
|
||||
}
|
||||
"#,
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn async_block_early_return() {
|
||||
check_infer(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue