Skip to content

Commit 20b0ae4

Browse files
committed
2 parents ea8897c + 346bf5f commit 20b0ae4

File tree

16 files changed

+145
-9
lines changed

16 files changed

+145
-9
lines changed

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

+4
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

+9
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

+7-1
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

+6
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,12 @@ impl<'a> InferenceContext<'a> {
474474
TyKind::Error.intern(Interner)
475475
}
476476
}
477+
Expr::Yeet { expr } => {
478+
if let &Some(expr) = expr {
479+
self.infer_expr_inner(expr, &Expectation::None);
480+
}
481+
TyKind::Never.intern(Interner)
482+
}
477483
Expr::RecordLit { path, fields, spread, .. } => {
478484
let (ty, def_id) = self.resolve_variant(path.as_deref(), false);
479485
if let Some(variant) = def_id {

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

+2-1
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/signature_help.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,7 @@ pub fn add_one(x: i32) -> i32 {
646646
x + 1
647647
}
648648
649-
pub fn do() {
649+
pub fn r#do() {
650650
add_one($0
651651
}"#,
652652
expect![[r##"

crates/ide/src/syntax_highlighting/highlight.rs

+1
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/parser/src/grammar/expressions/atom.rs

+20
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ pub(super) const ATOM_EXPR_FIRST: TokenSet =
4848
T![unsafe],
4949
T![return],
5050
T![yield],
51+
T![do],
5152
T![break],
5253
T![continue],
5354
T![async],
@@ -93,6 +94,7 @@ pub(super) fn atom_expr(
9394
T![match] => match_expr(p),
9495
T![return] => return_expr(p),
9596
T![yield] => yield_expr(p),
97+
T![do] if p.nth_at_contextual_kw(1, T![yeet]) => yeet_expr(p),
9698
T![continue] => continue_expr(p),
9799
T![break] => break_expr(p, r),
98100

@@ -533,6 +535,7 @@ fn return_expr(p: &mut Parser<'_>) -> CompletedMarker {
533535
}
534536
m.complete(p, RETURN_EXPR)
535537
}
538+
536539
// test yield_expr
537540
// fn foo() {
538541
// yield;
@@ -548,6 +551,23 @@ fn yield_expr(p: &mut Parser<'_>) -> CompletedMarker {
548551
m.complete(p, YIELD_EXPR)
549552
}
550553

554+
// test yeet_expr
555+
// fn foo() {
556+
// do yeet;
557+
// do yeet 1
558+
// }
559+
fn yeet_expr(p: &mut Parser<'_>) -> CompletedMarker {
560+
assert!(p.at(T![do]));
561+
assert!(p.nth_at_contextual_kw(1, T![yeet]));
562+
let m = p.start();
563+
p.bump(T![do]);
564+
p.bump_remap(T![yeet]);
565+
if p.at_ts(EXPR_FIRST) {
566+
expr(p);
567+
}
568+
m.complete(p, YEET_EXPR)
569+
}
570+
551571
// test continue_expr
552572
// fn foo() {
553573
// loop {

crates/parser/src/parser.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,16 @@ impl<'t> Parser<'t> {
148148
kinds.contains(self.current())
149149
}
150150

151-
/// Checks if the current token is contextual keyword with text `t`.
151+
/// Checks if the current token is contextual keyword `kw`.
152152
pub(crate) fn at_contextual_kw(&self, kw: SyntaxKind) -> bool {
153153
self.inp.contextual_kind(self.pos) == kw
154154
}
155155

156+
/// Checks if the nth token is contextual keyword `kw`.
157+
pub(crate) fn nth_at_contextual_kw(&self, n: usize, kw: SyntaxKind) -> bool {
158+
self.inp.contextual_kind(self.pos + n) == kw
159+
}
160+
156161
/// Starts a new node in the syntax tree. All nodes and tokens
157162
/// consumed between the `start` and the corresponding `Marker::complete`
158163
/// belong to the same node.

crates/parser/src/syntax_kind/generated.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ pub enum SyntaxKind {
6969
CONST_KW,
7070
CONTINUE_KW,
7171
CRATE_KW,
72+
DO_KW,
7273
DYN_KW,
7374
ELSE_KW,
7475
ENUM_KW,
@@ -109,6 +110,7 @@ pub enum SyntaxKind {
109110
UNION_KW,
110111
RAW_KW,
111112
MACRO_RULES_KW,
113+
YEET_KW,
112114
INT_NUMBER,
113115
FLOAT_NUMBER,
114116
CHAR,
@@ -188,6 +190,7 @@ pub enum SyntaxKind {
188190
STMT_LIST,
189191
RETURN_EXPR,
190192
YIELD_EXPR,
193+
YEET_EXPR,
191194
LET_EXPR,
192195
UNDERSCORE_EXPR,
193196
MACRO_EXPR,
@@ -272,6 +275,7 @@ impl SyntaxKind {
272275
| CONST_KW
273276
| CONTINUE_KW
274277
| CRATE_KW
278+
| DO_KW
275279
| DYN_KW
276280
| ELSE_KW
277281
| ENUM_KW
@@ -312,6 +316,7 @@ impl SyntaxKind {
312316
| UNION_KW
313317
| RAW_KW
314318
| MACRO_RULES_KW
319+
| YEET_KW
315320
)
316321
}
317322
pub fn is_punct(self) -> bool {
@@ -384,6 +389,7 @@ impl SyntaxKind {
384389
"const" => CONST_KW,
385390
"continue" => CONTINUE_KW,
386391
"crate" => CRATE_KW,
392+
"do" => DO_KW,
387393
"dyn" => DYN_KW,
388394
"else" => ELSE_KW,
389395
"enum" => ENUM_KW,
@@ -430,6 +436,7 @@ impl SyntaxKind {
430436
"union" => UNION_KW,
431437
"raw" => RAW_KW,
432438
"macro_rules" => MACRO_RULES_KW,
439+
"yeet" => YEET_KW,
433440
_ => return None,
434441
};
435442
Some(kw)
@@ -470,5 +477,5 @@ impl SyntaxKind {
470477
}
471478
}
472479
#[macro_export]
473-
macro_rules ! T { [;] => { $ crate :: SyntaxKind :: SEMICOLON } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['('] => { $ crate :: SyntaxKind :: L_PAREN } ; [')'] => { $ crate :: SyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: SyntaxKind :: L_CURLY } ; ['}'] => { $ crate :: SyntaxKind :: R_CURLY } ; ['['] => { $ crate :: SyntaxKind :: L_BRACK } ; [']'] => { $ crate :: SyntaxKind :: R_BRACK } ; [<] => { $ crate :: SyntaxKind :: L_ANGLE } ; [>] => { $ crate :: SyntaxKind :: R_ANGLE } ; [@] => { $ crate :: SyntaxKind :: AT } ; [#] => { $ crate :: SyntaxKind :: POUND } ; [~] => { $ crate :: SyntaxKind :: TILDE } ; [?] => { $ crate :: SyntaxKind :: QUESTION } ; [$] => { $ crate :: SyntaxKind :: DOLLAR } ; [&] => { $ crate :: SyntaxKind :: AMP } ; [|] => { $ crate :: SyntaxKind :: PIPE } ; [+] => { $ crate :: SyntaxKind :: PLUS } ; [*] => { $ crate :: SyntaxKind :: STAR } ; [/] => { $ crate :: SyntaxKind :: SLASH } ; [^] => { $ crate :: SyntaxKind :: CARET } ; [%] => { $ crate :: SyntaxKind :: PERCENT } ; [_] => { $ crate :: SyntaxKind :: UNDERSCORE } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [..] => { $ crate :: SyntaxKind :: DOT2 } ; [...] => { $ crate :: SyntaxKind :: DOT3 } ; [..=] => { $ crate :: SyntaxKind :: DOT2EQ } ; [:] => { $ crate :: SyntaxKind :: COLON } ; [::] => { $ crate :: SyntaxKind :: COLON2 } ; [=] => { $ crate :: SyntaxKind :: EQ } ; [==] => { $ crate :: SyntaxKind :: EQ2 } ; [=>] => { $ crate :: SyntaxKind :: FAT_ARROW } ; [!] => { $ crate :: SyntaxKind :: BANG } ; [!=] => { $ crate :: SyntaxKind :: NEQ } ; [-] => { $ crate :: SyntaxKind :: MINUS } ; [->] => { $ crate :: SyntaxKind :: THIN_ARROW } ; [<=] => { $ crate :: SyntaxKind :: LTEQ } ; [>=] => { $ crate :: SyntaxKind :: GTEQ } ; [+=] => { $ crate :: SyntaxKind :: PLUSEQ } ; [-=] => { $ crate :: SyntaxKind :: MINUSEQ } ; [|=] => { $ crate :: SyntaxKind :: PIPEEQ } ; [&=] => { $ crate :: SyntaxKind :: AMPEQ } ; [^=] => { $ crate :: SyntaxKind :: CARETEQ } ; [/=] => { $ crate :: SyntaxKind :: SLASHEQ } ; [*=] => { $ crate :: SyntaxKind :: STAREQ } ; [%=] => { $ crate :: SyntaxKind :: PERCENTEQ } ; [&&] => { $ crate :: SyntaxKind :: AMP2 } ; [||] => { $ crate :: SyntaxKind :: PIPE2 } ; [<<] => { $ crate :: SyntaxKind :: SHL } ; [>>] => { $ crate :: SyntaxKind :: SHR } ; [<<=] => { $ crate :: SyntaxKind :: SHLEQ } ; [>>=] => { $ crate :: SyntaxKind :: SHREQ } ; [as] => { $ crate :: SyntaxKind :: AS_KW } ; [async] => { $ crate :: SyntaxKind :: ASYNC_KW } ; [await] => { $ crate :: SyntaxKind :: AWAIT_KW } ; [box] => { $ crate :: SyntaxKind :: BOX_KW } ; [break] => { $ crate :: SyntaxKind :: BREAK_KW } ; [const] => { $ crate :: SyntaxKind :: CONST_KW } ; [continue] => { $ crate :: SyntaxKind :: CONTINUE_KW } ; [crate] => { $ crate :: SyntaxKind :: CRATE_KW } ; [dyn] => { $ crate :: SyntaxKind :: DYN_KW } ; [else] => { $ crate :: SyntaxKind :: ELSE_KW } ; [enum] => { $ crate :: SyntaxKind :: ENUM_KW } ; [extern] => { $ crate :: SyntaxKind :: EXTERN_KW } ; [false] => { $ crate :: SyntaxKind :: FALSE_KW } ; [fn] => { $ crate :: SyntaxKind :: FN_KW } ; [for] => { $ crate :: SyntaxKind :: FOR_KW } ; [if] => { $ crate :: SyntaxKind :: IF_KW } ; [impl] => { $ crate :: SyntaxKind :: IMPL_KW } ; [in] => { $ crate :: SyntaxKind :: IN_KW } ; [let] => { $ crate :: SyntaxKind :: LET_KW } ; [loop] => { $ crate :: SyntaxKind :: LOOP_KW } ; [macro] => { $ crate :: SyntaxKind :: MACRO_KW } ; [match] => { $ crate :: SyntaxKind :: MATCH_KW } ; [mod] => { $ crate :: SyntaxKind :: MOD_KW } ; [move] => { $ crate :: SyntaxKind :: MOVE_KW } ; [mut] => { $ crate :: SyntaxKind :: MUT_KW } ; [pub] => { $ crate :: SyntaxKind :: PUB_KW } ; [ref] => { $ crate :: SyntaxKind :: REF_KW } ; [return] => { $ crate :: SyntaxKind :: RETURN_KW } ; [self] => { $ crate :: SyntaxKind :: SELF_KW } ; [Self] => { $ crate :: SyntaxKind :: SELF_TYPE_KW } ; [static] => { $ crate :: SyntaxKind :: STATIC_KW } ; [struct] => { $ crate :: SyntaxKind :: STRUCT_KW } ; [super] => { $ crate :: SyntaxKind :: SUPER_KW } ; [trait] => { $ crate :: SyntaxKind :: TRAIT_KW } ; [true] => { $ crate :: SyntaxKind :: TRUE_KW } ; [try] => { $ crate :: SyntaxKind :: TRY_KW } ; [type] => { $ crate :: SyntaxKind :: TYPE_KW } ; [unsafe] => { $ crate :: SyntaxKind :: UNSAFE_KW } ; [use] => { $ crate :: SyntaxKind :: USE_KW } ; [where] => { $ crate :: SyntaxKind :: WHERE_KW } ; [while] => { $ crate :: SyntaxKind :: WHILE_KW } ; [yield] => { $ crate :: SyntaxKind :: YIELD_KW } ; [auto] => { $ crate :: SyntaxKind :: AUTO_KW } ; [default] => { $ crate :: SyntaxKind :: DEFAULT_KW } ; [existential] => { $ crate :: SyntaxKind :: EXISTENTIAL_KW } ; [union] => { $ crate :: SyntaxKind :: UNION_KW } ; [raw] => { $ crate :: SyntaxKind :: RAW_KW } ; [macro_rules] => { $ crate :: SyntaxKind :: MACRO_RULES_KW } ; [lifetime_ident] => { $ crate :: SyntaxKind :: LIFETIME_IDENT } ; [ident] => { $ crate :: SyntaxKind :: IDENT } ; [shebang] => { $ crate :: SyntaxKind :: SHEBANG } ; }
480+
macro_rules ! T { [;] => { $ crate :: SyntaxKind :: SEMICOLON } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['('] => { $ crate :: SyntaxKind :: L_PAREN } ; [')'] => { $ crate :: SyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: SyntaxKind :: L_CURLY } ; ['}'] => { $ crate :: SyntaxKind :: R_CURLY } ; ['['] => { $ crate :: SyntaxKind :: L_BRACK } ; [']'] => { $ crate :: SyntaxKind :: R_BRACK } ; [<] => { $ crate :: SyntaxKind :: L_ANGLE } ; [>] => { $ crate :: SyntaxKind :: R_ANGLE } ; [@] => { $ crate :: SyntaxKind :: AT } ; [#] => { $ crate :: SyntaxKind :: POUND } ; [~] => { $ crate :: SyntaxKind :: TILDE } ; [?] => { $ crate :: SyntaxKind :: QUESTION } ; [$] => { $ crate :: SyntaxKind :: DOLLAR } ; [&] => { $ crate :: SyntaxKind :: AMP } ; [|] => { $ crate :: SyntaxKind :: PIPE } ; [+] => { $ crate :: SyntaxKind :: PLUS } ; [*] => { $ crate :: SyntaxKind :: STAR } ; [/] => { $ crate :: SyntaxKind :: SLASH } ; [^] => { $ crate :: SyntaxKind :: CARET } ; [%] => { $ crate :: SyntaxKind :: PERCENT } ; [_] => { $ crate :: SyntaxKind :: UNDERSCORE } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [..] => { $ crate :: SyntaxKind :: DOT2 } ; [...] => { $ crate :: SyntaxKind :: DOT3 } ; [..=] => { $ crate :: SyntaxKind :: DOT2EQ } ; [:] => { $ crate :: SyntaxKind :: COLON } ; [::] => { $ crate :: SyntaxKind :: COLON2 } ; [=] => { $ crate :: SyntaxKind :: EQ } ; [==] => { $ crate :: SyntaxKind :: EQ2 } ; [=>] => { $ crate :: SyntaxKind :: FAT_ARROW } ; [!] => { $ crate :: SyntaxKind :: BANG } ; [!=] => { $ crate :: SyntaxKind :: NEQ } ; [-] => { $ crate :: SyntaxKind :: MINUS } ; [->] => { $ crate :: SyntaxKind :: THIN_ARROW } ; [<=] => { $ crate :: SyntaxKind :: LTEQ } ; [>=] => { $ crate :: SyntaxKind :: GTEQ } ; [+=] => { $ crate :: SyntaxKind :: PLUSEQ } ; [-=] => { $ crate :: SyntaxKind :: MINUSEQ } ; [|=] => { $ crate :: SyntaxKind :: PIPEEQ } ; [&=] => { $ crate :: SyntaxKind :: AMPEQ } ; [^=] => { $ crate :: SyntaxKind :: CARETEQ } ; [/=] => { $ crate :: SyntaxKind :: SLASHEQ } ; [*=] => { $ crate :: SyntaxKind :: STAREQ } ; [%=] => { $ crate :: SyntaxKind :: PERCENTEQ } ; [&&] => { $ crate :: SyntaxKind :: AMP2 } ; [||] => { $ crate :: SyntaxKind :: PIPE2 } ; [<<] => { $ crate :: SyntaxKind :: SHL } ; [>>] => { $ crate :: SyntaxKind :: SHR } ; [<<=] => { $ crate :: SyntaxKind :: SHLEQ } ; [>>=] => { $ crate :: SyntaxKind :: SHREQ } ; [as] => { $ crate :: SyntaxKind :: AS_KW } ; [async] => { $ crate :: SyntaxKind :: ASYNC_KW } ; [await] => { $ crate :: SyntaxKind :: AWAIT_KW } ; [box] => { $ crate :: SyntaxKind :: BOX_KW } ; [break] => { $ crate :: SyntaxKind :: BREAK_KW } ; [const] => { $ crate :: SyntaxKind :: CONST_KW } ; [continue] => { $ crate :: SyntaxKind :: CONTINUE_KW } ; [crate] => { $ crate :: SyntaxKind :: CRATE_KW } ; [do] => { $ crate :: SyntaxKind :: DO_KW } ; [dyn] => { $ crate :: SyntaxKind :: DYN_KW } ; [else] => { $ crate :: SyntaxKind :: ELSE_KW } ; [enum] => { $ crate :: SyntaxKind :: ENUM_KW } ; [extern] => { $ crate :: SyntaxKind :: EXTERN_KW } ; [false] => { $ crate :: SyntaxKind :: FALSE_KW } ; [fn] => { $ crate :: SyntaxKind :: FN_KW } ; [for] => { $ crate :: SyntaxKind :: FOR_KW } ; [if] => { $ crate :: SyntaxKind :: IF_KW } ; [impl] => { $ crate :: SyntaxKind :: IMPL_KW } ; [in] => { $ crate :: SyntaxKind :: IN_KW } ; [let] => { $ crate :: SyntaxKind :: LET_KW } ; [loop] => { $ crate :: SyntaxKind :: LOOP_KW } ; [macro] => { $ crate :: SyntaxKind :: MACRO_KW } ; [match] => { $ crate :: SyntaxKind :: MATCH_KW } ; [mod] => { $ crate :: SyntaxKind :: MOD_KW } ; [move] => { $ crate :: SyntaxKind :: MOVE_KW } ; [mut] => { $ crate :: SyntaxKind :: MUT_KW } ; [pub] => { $ crate :: SyntaxKind :: PUB_KW } ; [ref] => { $ crate :: SyntaxKind :: REF_KW } ; [return] => { $ crate :: SyntaxKind :: RETURN_KW } ; [self] => { $ crate :: SyntaxKind :: SELF_KW } ; [Self] => { $ crate :: SyntaxKind :: SELF_TYPE_KW } ; [static] => { $ crate :: SyntaxKind :: STATIC_KW } ; [struct] => { $ crate :: SyntaxKind :: STRUCT_KW } ; [super] => { $ crate :: SyntaxKind :: SUPER_KW } ; [trait] => { $ crate :: SyntaxKind :: TRAIT_KW } ; [true] => { $ crate :: SyntaxKind :: TRUE_KW } ; [try] => { $ crate :: SyntaxKind :: TRY_KW } ; [type] => { $ crate :: SyntaxKind :: TYPE_KW } ; [unsafe] => { $ crate :: SyntaxKind :: UNSAFE_KW } ; [use] => { $ crate :: SyntaxKind :: USE_KW } ; [where] => { $ crate :: SyntaxKind :: WHERE_KW } ; [while] => { $ crate :: SyntaxKind :: WHILE_KW } ; [yield] => { $ crate :: SyntaxKind :: YIELD_KW } ; [auto] => { $ crate :: SyntaxKind :: AUTO_KW } ; [default] => { $ crate :: SyntaxKind :: DEFAULT_KW } ; [existential] => { $ crate :: SyntaxKind :: EXISTENTIAL_KW } ; [union] => { $ crate :: SyntaxKind :: UNION_KW } ; [raw] => { $ crate :: SyntaxKind :: RAW_KW } ; [macro_rules] => { $ crate :: SyntaxKind :: MACRO_RULES_KW } ; [yeet] => { $ crate :: SyntaxKind :: YEET_KW } ; [lifetime_ident] => { $ crate :: SyntaxKind :: LIFETIME_IDENT } ; [ident] => { $ crate :: SyntaxKind :: IDENT } ; [shebang] => { $ crate :: SyntaxKind :: SHEBANG } ; }
474481
pub use T;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
SOURCE_FILE
2+
FN
3+
FN_KW "fn"
4+
WHITESPACE " "
5+
NAME
6+
IDENT "foo"
7+
PARAM_LIST
8+
L_PAREN "("
9+
R_PAREN ")"
10+
WHITESPACE " "
11+
BLOCK_EXPR
12+
STMT_LIST
13+
L_CURLY "{"
14+
WHITESPACE "\n "
15+
EXPR_STMT
16+
YEET_EXPR
17+
DO_KW "do"
18+
WHITESPACE " "
19+
YEET_KW "yeet"
20+
SEMICOLON ";"
21+
WHITESPACE "\n "
22+
YEET_EXPR
23+
DO_KW "do"
24+
WHITESPACE " "
25+
YEET_KW "yeet"
26+
WHITESPACE " "
27+
LITERAL
28+
INT_NUMBER "1"
29+
WHITESPACE "\n"
30+
R_CURLY "}"
31+
WHITESPACE "\n"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
fn foo() {
2+
do yeet;
3+
do yeet 1
4+
}

crates/syntax/rust.ungram

+4
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

0 commit comments

Comments
 (0)