rust/crates
bors[bot] 0d03fe6ef5
Merge #5971
5971: Implement async blocks r=flodiebold a=oxalica

Fix #4018

@flodiebold already gave a generic guide in the issue. Here's some concern about implementation detail:
- Chalk doesn't support generator type yet.
- Adding generator type as a brand new type (ctor) can be complex and need to *re-introduced* builtin impls. (Like how we implement closures before native closure support of chalk, which is already removed in #5401 )
- The output type of async block should be known after type inference of the whole body.
  - We cannot directly get the type from source like return-positon-impl-trait. But we still need to provide trait bounds when chalk asking for `opaque_ty_data`.
  - During the inference, the output type of async block can be temporary unknown and participate the later inference.
    `let a = async { None }; let _: i32 = a.await.unwrap();`

So in this PR, the type of async blocks is inferred as an opaque type parameterized by the `Future::Output` type it should be, like what we do with closure type.
And it really works now.

Well, I still have some questions:
- The bounds `AsyncBlockImplType<T>: Future<Output = T>` is currently generated in `opaque_ty_data`. I'm not sure if we should put this code here.
- Type of async block is now rendered as `impl Future<Output = OutputType>`. Do we need to special display to hint that it's a async block? Note that closure type has its special format, instead of `impl Fn(..) -> ..` or function type.



Co-authored-by: oxalica <oxalicc@pm.me>
2020-09-13 17:28:22 +00:00
..
arena Add TBD description to arena 2020-08-24 13:29:10 +02:00
assists Properly preserve macro braces 2020-09-11 22:16:22 +03:00
base_db Move most of the logic into the completion module 2020-09-10 01:42:20 +03:00
cfg Add description for crates that will be published 2020-08-24 13:07:22 +02:00
flycheck Add description for crates that will be published 2020-08-24 13:07:22 +02:00
hir Merge #5971 2020-09-13 17:28:22 +00:00
hir_def Merge #5971 2020-09-13 17:28:22 +00:00
hir_expand Move most of the logic into the completion module 2020-09-10 01:42:20 +03:00
hir_ty Merge #5971 2020-09-13 17:28:22 +00:00
ide Merge #5971 2020-09-13 17:28:22 +00:00
ide_db Rename record_field_pat to record_pat_field 2020-09-10 18:56:04 +02:00
mbe Add description for crates that will be published 2020-08-24 13:07:22 +02:00
parser Rename record_field_pat to record_pat_field 2020-09-10 18:56:04 +02:00
paths Add description for crates that will be published 2020-08-24 13:07:22 +02:00
proc_macro_api Add description for crates that will be published 2020-08-24 13:07:22 +02:00
proc_macro_srv Add description for crates that will be published 2020-08-24 13:07:22 +02:00
proc_macro_test Add description for crates that will be published 2020-08-24 13:07:22 +02:00
profile Add description for crates that will be published 2020-08-24 13:07:22 +02:00
project_model Report better errors in project.json/sysroot 2020-09-11 14:48:56 +02:00
rust-analyzer Report better errors in project.json/sysroot 2020-09-11 14:48:56 +02:00
ssr ⬆️ expect-test 2020-08-28 14:47:14 +02:00
stdx Add description for crates that will be published 2020-08-24 13:07:22 +02:00
syntax Rename record_field_pat to record_pat_field 2020-09-10 18:56:04 +02:00
test_utils Add description for crates that will be published 2020-08-24 13:07:22 +02:00
text_edit Actually assert disjointness 2020-09-03 13:37:36 +02:00
toolchain Add description for crates that will be published 2020-08-24 13:07:22 +02:00
tt Add description for crates that will be published 2020-08-24 13:07:22 +02:00
vfs Rename the method to avoid false promises 2020-09-10 01:45:49 +03:00
vfs-notify Add description for crates that will be published 2020-08-24 13:07:22 +02:00