Skip to content

Commit b3d00ed

Browse files
committed
Prepare for landing await syntax
1 parent f366d2e commit b3d00ed

File tree

4 files changed

+49
-29
lines changed

4 files changed

+49
-29
lines changed

futures-async-macro/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Processes streams using a for loop.
1717
This is a reimplement of [futures-await]'s `#[async]` for loops for futures 0.3 and is an experimental implementation of [the idea listed as the next step of async/await](https://github.com/rust-lang/rfcs/blob/master/text/2394-async_await.md#for-await-and-processing-streams).
1818

1919
```rust
20-
#![feature(async_await, generators, stmt_expr_attributes, proc_macro_hygiene)]
20+
#![feature(async_await, await_macro, stmt_expr_attributes, proc_macro_hygiene)]
2121
use futures::for_await;
2222
use futures::prelude::*;
2323

futures-async-macro/src/lib.rs

+46-27
Original file line numberDiff line numberDiff line change
@@ -241,42 +241,61 @@ impl Expand {
241241
));
242242
}
243243

244+
let ExprForLoop { label, pat, expr, body, .. } = &expr;
244245
// It needs to adjust the type yielded by the macro because generators used internally by
245246
// async fn yield `()` type, but generators used internally by `async_stream` yield
246247
// `Poll<U>` type.
247-
let yield_ = match self.0 {
248-
Future => TokenStream2::new(),
249-
Stream => quote! { ::futures::core_reexport::task::Poll::Pending },
250-
Closure => return outside_of_async_error!(expr, "#[for_await]"),
251-
};
252-
let ExprForLoop { label, pat, expr, body, .. } = expr;
253-
254-
// Basically just expand to a `poll` loop
255-
syn::parse_quote! {{
256-
let mut __pinned = #expr;
257-
#label
258-
loop {
259-
let #pat = {
260-
match ::futures::async_stream::poll_next_with_tls_context(unsafe {
261-
::futures::core_reexport::pin::Pin::new_unchecked(&mut __pinned)
262-
})
263-
{
264-
::futures::core_reexport::task::Poll::Ready(e) => {
265-
match e {
248+
match self.0 {
249+
Future => {
250+
// Basically just expand to a `poll` loop
251+
syn::parse_quote! {{
252+
let mut __pinned = #expr;
253+
let mut __pinned = unsafe {
254+
::futures::core_reexport::pin::Pin::new_unchecked(&mut __pinned)
255+
};
256+
#label
257+
loop {
258+
let #pat = {
259+
match r#await!(::futures::stream::StreamExt::next(&mut __pinned)) {
266260
::futures::core_reexport::option::Option::Some(e) => e,
267261
::futures::core_reexport::option::Option::None => break,
268262
}
269-
}
270-
::futures::core_reexport::task::Poll::Pending => {
271-
yield #yield_;
272-
continue
273-
}
263+
};
264+
265+
#body
274266
}
275-
};
267+
}}
268+
}
269+
Stream => {
270+
// Basically just expand to a `poll` loop
271+
syn::parse_quote! {{
272+
let mut __pinned = #expr;
273+
#label
274+
loop {
275+
let #pat = {
276+
match ::futures::async_stream::poll_next_with_tls_context(unsafe {
277+
::futures::core_reexport::pin::Pin::new_unchecked(&mut __pinned)
278+
})
279+
{
280+
::futures::core_reexport::task::Poll::Ready(e) => {
281+
match e {
282+
::futures::core_reexport::option::Option::Some(e) => e,
283+
::futures::core_reexport::option::Option::None => break,
284+
}
285+
}
286+
::futures::core_reexport::task::Poll::Pending => {
287+
yield ::futures::core_reexport::task::Poll::Pending;
288+
continue
289+
}
290+
}
291+
};
276292

277-
#body
293+
#body
294+
}
295+
}}
278296
}
279-
}}
297+
Closure => return outside_of_async_error!(expr, "#[for_await]"),
298+
}
280299
}
281300

282301
/// Expands `yield expr` in `async_stream` scope.

futures/testcrate/ui/nested.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#![feature(async_await, generators)]
1+
#![feature(async_await, generators, await_macro)]
22

33
use futures::*;
44

futures/testcrate/ui/nested.stderr

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ note: the type is part of the generator because of this `yield`
3030
|
3131
5 | #[async_stream]
3232
| ^^^^^^^^^^^^^^^
33+
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
3334

3435
error: aborting due to 3 previous errors
3536

0 commit comments

Comments
 (0)