Skip to content

Commit 0c58aa9

Browse files
bors[bot]sasurau4
andauthored
Merge #7209
7209: Support yield keyword r=Veykril a=sasurau4 Part of #4309 The inference of yield will be implemented at another PR. Co-authored-by: Daiki Ihara <sasurau4@gmail.com>
2 parents d6a708b + 138514b commit 0c58aa9

File tree

12 files changed

+152
-52
lines changed

12 files changed

+152
-52
lines changed

Cargo.lock

Lines changed: 24 additions & 24 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/assists/src/handlers/inline_local_variable.rs

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -79,29 +79,30 @@ pub(crate) fn inline_local_variable(acc: &mut Assists, ctx: &AssistContext) -> O
7979
None => return Ok(false),
8080
};
8181

82-
Ok(!matches!((&initializer_expr, usage_parent),
82+
Ok(!matches!(
83+
(&initializer_expr, usage_parent),
8384
(ast::Expr::CallExpr(_), _)
84-
| (ast::Expr::IndexExpr(_), _)
85-
| (ast::Expr::MethodCallExpr(_), _)
86-
| (ast::Expr::FieldExpr(_), _)
87-
| (ast::Expr::TryExpr(_), _)
88-
| (ast::Expr::RefExpr(_), _)
89-
| (ast::Expr::Literal(_), _)
90-
| (ast::Expr::TupleExpr(_), _)
91-
| (ast::Expr::ArrayExpr(_), _)
92-
| (ast::Expr::ParenExpr(_), _)
93-
| (ast::Expr::PathExpr(_), _)
94-
| (ast::Expr::BlockExpr(_), _)
95-
| (ast::Expr::EffectExpr(_), _)
96-
| (_, ast::Expr::CallExpr(_))
97-
| (_, ast::Expr::TupleExpr(_))
98-
| (_, ast::Expr::ArrayExpr(_))
99-
| (_, ast::Expr::ParenExpr(_))
100-
| (_, ast::Expr::ForExpr(_))
101-
| (_, ast::Expr::WhileExpr(_))
102-
| (_, ast::Expr::BreakExpr(_))
103-
| (_, ast::Expr::ReturnExpr(_))
104-
| (_, ast::Expr::MatchExpr(_))
85+
| (ast::Expr::IndexExpr(_), _)
86+
| (ast::Expr::MethodCallExpr(_), _)
87+
| (ast::Expr::FieldExpr(_), _)
88+
| (ast::Expr::TryExpr(_), _)
89+
| (ast::Expr::RefExpr(_), _)
90+
| (ast::Expr::Literal(_), _)
91+
| (ast::Expr::TupleExpr(_), _)
92+
| (ast::Expr::ArrayExpr(_), _)
93+
| (ast::Expr::ParenExpr(_), _)
94+
| (ast::Expr::PathExpr(_), _)
95+
| (ast::Expr::BlockExpr(_), _)
96+
| (ast::Expr::EffectExpr(_), _)
97+
| (_, ast::Expr::CallExpr(_))
98+
| (_, ast::Expr::TupleExpr(_))
99+
| (_, ast::Expr::ArrayExpr(_))
100+
| (_, ast::Expr::ParenExpr(_))
101+
| (_, ast::Expr::ForExpr(_))
102+
| (_, ast::Expr::WhileExpr(_))
103+
| (_, ast::Expr::BreakExpr(_))
104+
| (_, ast::Expr::ReturnExpr(_))
105+
| (_, ast::Expr::MatchExpr(_))
105106
))
106107
})
107108
.collect::<Result<Vec<_>, _>>()?;

crates/hir_def/src/body/lower.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,10 @@ impl ExprCollector<'_> {
386386
let expr = e.expr().map(|e| self.collect_expr(e));
387387
self.alloc_expr(Expr::Return { expr }, syntax_ptr)
388388
}
389+
ast::Expr::YieldExpr(e) => {
390+
let expr = e.expr().map(|e| self.collect_expr(e));
391+
self.alloc_expr(Expr::Yield { expr }, syntax_ptr)
392+
}
389393
ast::Expr::RecordExpr(e) => {
390394
let path = e.path().and_then(|path| self.expander.parse_path(path));
391395
let mut field_ptrs = Vec::new();

crates/hir_def/src/expr.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ pub enum Expr {
9999
Return {
100100
expr: Option<ExprId>,
101101
},
102+
Yield {
103+
expr: Option<ExprId>,
104+
},
102105
RecordLit {
103106
path: Option<Path>,
104107
fields: Vec<RecordLitField>,
@@ -294,7 +297,7 @@ impl Expr {
294297
}
295298
}
296299
Expr::Continue { .. } => {}
297-
Expr::Break { expr, .. } | Expr::Return { expr } => {
300+
Expr::Break { expr, .. } | Expr::Return { expr } | Expr::Yield { expr } => {
298301
if let Some(expr) = expr {
299302
f(*expr);
300303
}

crates/hir_ty/src/infer/expr.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,13 @@ impl<'a> InferenceContext<'a> {
367367
}
368368
Ty::simple(TypeCtor::Never)
369369
}
370+
Expr::Yield { expr } => {
371+
// FIXME: track yield type for coercion
372+
if let Some(expr) = expr {
373+
self.infer_expr(*expr, &Expectation::none());
374+
}
375+
Ty::simple(TypeCtor::Never)
376+
}
370377
Expr::RecordLit { path, fields, spread } => {
371378
let (ty, def_id) = self.resolve_variant(path.as_ref());
372379
if let Some(variant) = def_id {

crates/parser/src/grammar/expressions/atom.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ pub(super) const ATOM_EXPR_FIRST: TokenSet =
5050
T![match],
5151
T![unsafe],
5252
T![return],
53+
T![yield],
5354
T![break],
5455
T![continue],
5556
T![async],
@@ -142,6 +143,7 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
142143
block_expr_unchecked(p)
143144
}
144145
T![return] => return_expr(p),
146+
T![yield] => yield_expr(p),
145147
T![continue] => continue_expr(p),
146148
T![break] => break_expr(p, r),
147149
_ => {
@@ -508,6 +510,20 @@ fn return_expr(p: &mut Parser) -> CompletedMarker {
508510
}
509511
m.complete(p, RETURN_EXPR)
510512
}
513+
// test yield_expr
514+
// fn foo() {
515+
// yield;
516+
// yield 1;
517+
// }
518+
fn yield_expr(p: &mut Parser) -> CompletedMarker {
519+
assert!(p.at(T![yield]));
520+
let m = p.start();
521+
p.bump(T![yield]);
522+
if p.at_ts(EXPR_FIRST) {
523+
expr(p);
524+
}
525+
m.complete(p, YIELD_EXPR)
526+
}
511527

512528
// test continue_expr
513529
// fn foo() {

0 commit comments

Comments
 (0)