Add support for postfix yield expressions
We had a discussion[1] today about whether postfix yield would make sense.
It's easy enough to support both in the parser, so we might as well have
both and see how people use it while the feature is experimental.
[1]: 505231568
This commit is contained in:
parent
cb50d4d856
commit
edf65e735c
2 changed files with 41 additions and 0 deletions
|
@ -1310,6 +1310,13 @@ impl<'a> Parser<'a> {
|
|||
return self.parse_match_block(lo, match_span, self_arg, MatchKind::Postfix);
|
||||
}
|
||||
|
||||
// Post-fix yield
|
||||
if self.eat_keyword(exp!(Yield)) {
|
||||
let yield_span = self.prev_token.span;
|
||||
self.psess.gated_spans.gate(sym::yield_expr, yield_span);
|
||||
return Ok(self.mk_expr(yield_span, ExprKind::Yield(Some(self_arg))));
|
||||
}
|
||||
|
||||
let fn_span_lo = self.token.span;
|
||||
let mut seg = self.parse_path_segment(PathStyle::Expr, None)?;
|
||||
self.check_trailing_angle_brackets(&seg, &[exp!(OpenParen)]);
|
||||
|
|
34
tests/ui/coroutine/postfix-yield.rs
Normal file
34
tests/ui/coroutine/postfix-yield.rs
Normal file
|
@ -0,0 +1,34 @@
|
|||
// This demonstrates a proposed alternate or additional option of having yield in postfix position.
|
||||
|
||||
//@ run-pass
|
||||
//@ edition: 2024
|
||||
|
||||
#![feature(gen_blocks, coroutines, coroutine_trait, yield_expr)]
|
||||
|
||||
use std::ops::{Coroutine, CoroutineState};
|
||||
use std::pin::pin;
|
||||
|
||||
fn main() {
|
||||
// generators (i.e. yield doesn't return anything useful)
|
||||
let mut gn = gen {
|
||||
yield 1;
|
||||
2.yield;
|
||||
};
|
||||
|
||||
assert_eq!(gn.next(), Some(1));
|
||||
assert_eq!(gn.next(), Some(2));
|
||||
assert_eq!(gn.next(), None);
|
||||
|
||||
//coroutines (i.e. yield returns something useful)
|
||||
let mut coro = pin!(
|
||||
#[coroutine]
|
||||
|_: i32| {
|
||||
let x = yield 1;
|
||||
yield x + 2;
|
||||
}
|
||||
);
|
||||
|
||||
assert_eq!(coro.as_mut().resume(0), CoroutineState::Yielded(1));
|
||||
assert_eq!(coro.as_mut().resume(2), CoroutineState::Yielded(4));
|
||||
assert_eq!(coro.as_mut().resume(3), CoroutineState::Complete(()));
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue