rust/crates/hir/src
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
..
semantics
attrs.rs Tease apart orthogonal concerns in markdown link rewriting 2020-08-26 20:24:00 +02:00
code_model.rs Fix type walking about type of async block 2020-09-12 01:08:50 +08:00
db.rs
diagnostics.rs
from_id.rs Remove AttrDef 2020-08-25 14:44:15 +02:00
has_source.rs synchronizing changes 2020-08-15 02:37:43 +07:00
lib.rs Tease apart orthogonal concerns in markdown link rewriting 2020-08-26 20:24:00 +02:00
semantics.rs Rename record_field_pat to record_pat_field 2020-09-10 18:56:04 +02:00
source_analyzer.rs Rename record_field_pat to record_pat_field 2020-09-10 18:56:04 +02:00