Skip to content

Commit 346bf5f

Browse files
committed
Implement do yeet expression
1 parent 4a16afa commit 346bf5f

File tree

9 files changed

+72
-4
lines changed

9 files changed

+72
-4
lines changed

crates/hir-def/src/body/lower.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,10 @@ impl ExprCollector<'_> {
371371
let expr = e.expr().map(|e| self.collect_expr(e));
372372
self.alloc_expr(Expr::Yield { expr }, syntax_ptr)
373373
}
374+
ast::Expr::YeetExpr(e) => {
375+
let expr = e.expr().map(|e| self.collect_expr(e));
376+
self.alloc_expr(Expr::Yeet { expr }, syntax_ptr)
377+
}
374378
ast::Expr::RecordExpr(e) => {
375379
let path =
376380
e.path().and_then(|path| self.expander.parse_path(self.db, path)).map(Box::new);

crates/hir-def/src/body/pretty.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,15 @@ impl<'a> Printer<'a> {
247247
self.print_expr(*expr);
248248
}
249249
}
250+
Expr::Yeet { expr } => {
251+
w!(self, "do");
252+
self.whitespace();
253+
w!(self, "yeet");
254+
if let Some(expr) = expr {
255+
self.whitespace();
256+
self.print_expr(*expr);
257+
}
258+
}
250259
Expr::RecordLit { path, fields, spread, ellipsis, is_assignee_expr: _ } => {
251260
match path {
252261
Some(path) => self.print_path(path),

crates/hir-def/src/expr.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,9 @@ pub enum Expr {
137137
Yield {
138138
expr: Option<ExprId>,
139139
},
140+
Yeet {
141+
expr: Option<ExprId>,
142+
},
140143
RecordLit {
141144
path: Option<Box<Path>>,
142145
fields: Box<[RecordLitField]>,
@@ -313,7 +316,10 @@ impl Expr {
313316
arms.iter().map(|arm| arm.expr).for_each(f);
314317
}
315318
Expr::Continue { .. } => {}
316-
Expr::Break { expr, .. } | Expr::Return { expr } | Expr::Yield { expr } => {
319+
Expr::Break { expr, .. }
320+
| Expr::Return { expr }
321+
| Expr::Yield { expr }
322+
| Expr::Yeet { expr } => {
317323
if let &Some(expr) = expr {
318324
f(expr);
319325
}

crates/hir-ty/src/infer/expr.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,12 @@ impl<'a> InferenceContext<'a> {
465465
TyKind::Error.intern(Interner)
466466
}
467467
}
468+
Expr::Yeet { expr } => {
469+
if let &Some(expr) = expr {
470+
self.infer_expr_inner(expr, &Expectation::None);
471+
}
472+
TyKind::Never.intern(Interner)
473+
}
468474
Expr::RecordLit { path, fields, spread, .. } => {
469475
let (ty, def_id) = self.resolve_variant(path.as_deref(), false);
470476
if let Some(variant) = def_id {

crates/ide-db/src/syntax_helpers/node_ext.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,8 @@ pub fn for_each_tail_expr(expr: &ast::Expr, cb: &mut dyn FnMut(&ast::Expr)) {
328328
| ast::Expr::WhileExpr(_)
329329
| ast::Expr::LetExpr(_)
330330
| ast::Expr::UnderscoreExpr(_)
331-
| ast::Expr::YieldExpr(_) => cb(expr),
331+
| ast::Expr::YieldExpr(_)
332+
| ast::Expr::YeetExpr(_) => cb(expr),
332333
}
333334
}
334335

crates/ide/src/syntax_highlighting/highlight.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ fn keyword(
174174
| T![return]
175175
| T![while]
176176
| T![yield] => h | HlMod::ControlFlow,
177+
T![do] | T![yeet] if parent_matches::<ast::YeetExpr>(&token) => h | HlMod::ControlFlow,
177178
T![for] if parent_matches::<ast::ForExpr>(&token) => h | HlMod::ControlFlow,
178179
T![unsafe] => h | HlMod::Unsafe,
179180
T![true] | T![false] => HlTag::BoolLiteral.into(),

crates/syntax/rust.ungram

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ Expr =
359359
| TupleExpr
360360
| WhileExpr
361361
| YieldExpr
362+
| YeetExpr
362363
| LetExpr
363364
| UnderscoreExpr
364365

@@ -503,6 +504,9 @@ ReturnExpr =
503504
YieldExpr =
504505
Attr* 'yield' Expr?
505506

507+
YeetExpr =
508+
Attr* 'do' 'yeet' Expr?
509+
506510
LetExpr =
507511
Attr* 'let' Pat '=' Expr
508512

crates/syntax/src/ast/generated/nodes.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,6 +1063,17 @@ impl YieldExpr {
10631063
pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
10641064
}
10651065

1066+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1067+
pub struct YeetExpr {
1068+
pub(crate) syntax: SyntaxNode,
1069+
}
1070+
impl ast::HasAttrs for YeetExpr {}
1071+
impl YeetExpr {
1072+
pub fn do_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![do]) }
1073+
pub fn yeet_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![yeet]) }
1074+
pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
1075+
}
1076+
10661077
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
10671078
pub struct LetExpr {
10681079
pub(crate) syntax: SyntaxNode,
@@ -1541,6 +1552,7 @@ pub enum Expr {
15411552
TupleExpr(TupleExpr),
15421553
WhileExpr(WhileExpr),
15431554
YieldExpr(YieldExpr),
1555+
YeetExpr(YeetExpr),
15441556
LetExpr(LetExpr),
15451557
UnderscoreExpr(UnderscoreExpr),
15461558
}
@@ -2694,6 +2706,17 @@ impl AstNode for YieldExpr {
26942706
}
26952707
fn syntax(&self) -> &SyntaxNode { &self.syntax }
26962708
}
2709+
impl AstNode for YeetExpr {
2710+
fn can_cast(kind: SyntaxKind) -> bool { kind == YEET_EXPR }
2711+
fn cast(syntax: SyntaxNode) -> Option<Self> {
2712+
if Self::can_cast(syntax.kind()) {
2713+
Some(Self { syntax })
2714+
} else {
2715+
None
2716+
}
2717+
}
2718+
fn syntax(&self) -> &SyntaxNode { &self.syntax }
2719+
}
26972720
impl AstNode for LetExpr {
26982721
fn can_cast(kind: SyntaxKind) -> bool { kind == LET_EXPR }
26992722
fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -3382,6 +3405,9 @@ impl From<WhileExpr> for Expr {
33823405
impl From<YieldExpr> for Expr {
33833406
fn from(node: YieldExpr) -> Expr { Expr::YieldExpr(node) }
33843407
}
3408+
impl From<YeetExpr> for Expr {
3409+
fn from(node: YeetExpr) -> Expr { Expr::YeetExpr(node) }
3410+
}
33853411
impl From<LetExpr> for Expr {
33863412
fn from(node: LetExpr) -> Expr { Expr::LetExpr(node) }
33873413
}
@@ -3422,6 +3448,7 @@ impl AstNode for Expr {
34223448
| TUPLE_EXPR
34233449
| WHILE_EXPR
34243450
| YIELD_EXPR
3451+
| YEET_EXPR
34253452
| LET_EXPR
34263453
| UNDERSCORE_EXPR
34273454
)
@@ -3458,6 +3485,7 @@ impl AstNode for Expr {
34583485
TUPLE_EXPR => Expr::TupleExpr(TupleExpr { syntax }),
34593486
WHILE_EXPR => Expr::WhileExpr(WhileExpr { syntax }),
34603487
YIELD_EXPR => Expr::YieldExpr(YieldExpr { syntax }),
3488+
YEET_EXPR => Expr::YeetExpr(YeetExpr { syntax }),
34613489
LET_EXPR => Expr::LetExpr(LetExpr { syntax }),
34623490
UNDERSCORE_EXPR => Expr::UnderscoreExpr(UnderscoreExpr { syntax }),
34633491
_ => return None,
@@ -3496,6 +3524,7 @@ impl AstNode for Expr {
34963524
Expr::TupleExpr(it) => &it.syntax,
34973525
Expr::WhileExpr(it) => &it.syntax,
34983526
Expr::YieldExpr(it) => &it.syntax,
3527+
Expr::YeetExpr(it) => &it.syntax,
34993528
Expr::LetExpr(it) => &it.syntax,
35003529
Expr::UnderscoreExpr(it) => &it.syntax,
35013530
}
@@ -3963,6 +3992,7 @@ impl AstNode for AnyHasAttrs {
39633992
| TUPLE_EXPR
39643993
| WHILE_EXPR
39653994
| YIELD_EXPR
3995+
| YEET_EXPR
39663996
| LET_EXPR
39673997
| UNDERSCORE_EXPR
39683998
| STMT_LIST
@@ -4655,6 +4685,11 @@ impl std::fmt::Display for YieldExpr {
46554685
std::fmt::Display::fmt(self.syntax(), f)
46564686
}
46574687
}
4688+
impl std::fmt::Display for YeetExpr {
4689+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4690+
std::fmt::Display::fmt(self.syntax(), f)
4691+
}
4692+
}
46584693
impl std::fmt::Display for LetExpr {
46594694
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
46604695
std::fmt::Display::fmt(self.syntax(), f)

crates/syntax/src/ast/prec.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ impl Expr {
130130
//
131131
ContinueExpr(_) => (0, 0),
132132

133-
ClosureExpr(_) | ReturnExpr(_) | YieldExpr(_) | BreakExpr(_) => (0, 1),
133+
ClosureExpr(_) | ReturnExpr(_) | YieldExpr(_) | YeetExpr(_) | BreakExpr(_) => (0, 1),
134134

135135
RangeExpr(_) => (5, 5),
136136

@@ -291,6 +291,7 @@ impl Expr {
291291
ReturnExpr(e) => e.return_token(),
292292
TryExpr(e) => e.question_mark_token(),
293293
YieldExpr(e) => e.yield_token(),
294+
YeetExpr(e) => e.do_token(),
294295
LetExpr(e) => e.let_token(),
295296

296297
ArrayExpr(_) | TupleExpr(_) | Literal(_) | PathExpr(_) | ParenExpr(_)
@@ -313,7 +314,8 @@ impl Expr {
313314

314315
// For BinExpr and RangeExpr this is technically wrong -- the child can be on the left...
315316
BinExpr(_) | RangeExpr(_) | BoxExpr(_) | BreakExpr(_) | ContinueExpr(_)
316-
| PrefixExpr(_) | RefExpr(_) | ReturnExpr(_) | YieldExpr(_) | LetExpr(_) => self
317+
| PrefixExpr(_) | RefExpr(_) | ReturnExpr(_) | YieldExpr(_) | YeetExpr(_)
318+
| LetExpr(_) => self
317319
.syntax()
318320
.parent()
319321
.and_then(Expr::cast)

0 commit comments

Comments
 (0)