X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=crates%2Fparser%2Fsrc%2Fgrammar%2Fexpressions%2Fatom.rs;h=e2c1b1fec579ce7358aef88a16b30f1d9d0f43d5;hb=0b53744f2d7e0694cd7207cca632fd6de1dc5bff;hp=7075ae297f01541e0b45087c4334e3debe34909b;hpb=86c534f244bd72dc9e9ec1be0bfdf0131602ca30;p=rust.git diff --git a/crates/parser/src/grammar/expressions/atom.rs b/crates/parser/src/grammar/expressions/atom.rs index 7075ae297f0..e2c1b1fec57 100644 --- a/crates/parser/src/grammar/expressions/atom.rs +++ b/crates/parser/src/grammar/expressions/atom.rs @@ -39,7 +39,6 @@ pub(crate) fn literal(p: &mut Parser) -> Option { T!['('], T!['{'], T!['['], - L_DOLLAR, T![|], T![move], T![box], @@ -59,7 +58,7 @@ pub(crate) fn literal(p: &mut Parser) -> Option { LIFETIME_IDENT, ])); -const EXPR_RECOVERY_SET: TokenSet = TokenSet::new(&[T![let], R_DOLLAR]); +const EXPR_RECOVERY_SET: TokenSet = TokenSet::new(&[T![let]]); pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMarker, BlockLike)> { if let Some(m) = literal(p) { @@ -72,11 +71,15 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar let done = match p.current() { T!['('] => tuple_expr(p), T!['['] => array_expr(p), - L_DOLLAR => meta_var_expr(p), T![|] => closure_expr(p), - T![move] if la == T![|] => closure_expr(p), - T![async] if la == T![|] || (la == T![move] && p.nth(2) == T![|]) => closure_expr(p), + T![static] | T![async] | T![move] if la == T![|] => closure_expr(p), + T![static] | T![async] if la == T![move] && p.nth(2) == T![|] => closure_expr(p), + T![static] if la == T![async] && p.nth(2) == T![|] => closure_expr(p), + T![static] if la == T![async] && p.nth(2) == T![move] && p.nth(3) == T![|] => { + closure_expr(p) + } T![if] => if_expr(p), + T![let] => let_expr(p), T![loop] => loop_expr(p, None), T![box] => box_expr(p, None), @@ -236,6 +239,10 @@ fn array_expr(p: &mut Parser) -> CompletedMarker { // async || {}; // move || {}; // async move || {}; +// static || {}; +// static move || {}; +// static async || {}; +// static async move || {}; // } fn closure_expr(p: &mut Parser) -> CompletedMarker { assert!( @@ -243,8 +250,16 @@ fn closure_expr(p: &mut Parser) -> CompletedMarker { || (p.at(T![move]) && p.nth(1) == T![|]) || (p.at(T![async]) && p.nth(1) == T![|]) || (p.at(T![async]) && p.nth(1) == T![move] && p.nth(2) == T![|]) + || (p.at(T![static]) && p.nth(1) == T![|]) + || (p.at(T![static]) && p.nth(1) == T![move] && p.nth(2) == T![|]) + || (p.at(T![static]) && p.nth(1) == T![async] && p.nth(2) == T![|]) + || (p.at(T![static]) + && p.nth(1) == T![async] + && p.nth(2) == T![move] + && p.nth(3) == T![|]) ); let m = p.start(); + p.eat(T![static]); p.eat(T![async]); p.eat(T![move]); params::param_list_closure(p); @@ -272,7 +287,7 @@ fn if_expr(p: &mut Parser) -> CompletedMarker { assert!(p.at(T![if])); let m = p.start(); p.bump(T![if]); - condition(p); + expr_no_struct(p); block_expr(p); if p.at(T![else]) { p.bump(T![else]); @@ -321,7 +336,7 @@ fn while_expr(p: &mut Parser, m: Option) -> CompletedMarker { assert!(p.at(T![while])); let m = m.unwrap_or_else(|| p.start()); p.bump(T![while]); - condition(p); + expr_no_struct(p); block_expr(p); m.complete(p, WHILE_EXPR) } @@ -341,22 +356,18 @@ fn for_expr(p: &mut Parser, m: Option) -> CompletedMarker { m.complete(p, FOR_EXPR) } -// test cond -// fn foo() { if let Some(_) = None {} } -// fn bar() { -// if let Some(_) | Some(_) = None {} -// if let | Some(_) = None {} -// while let Some(_) | Some(_) = None {} -// while let | Some(_) = None {} +// test let_expr +// fn foo() { +// if let Some(_) = None && true {} +// while 1 == 5 && (let None = None) {} // } -fn condition(p: &mut Parser) { +fn let_expr(p: &mut Parser) -> CompletedMarker { let m = p.start(); - if p.eat(T![let]) { - patterns::pattern_top(p); - p.expect(T![=]); - } - expr_no_struct(p); - m.complete(p, CONDITION); + p.bump(T![let]); + patterns::pattern_top(p); + p.expect(T![=]); + expr_let(p); + m.complete(p, LET_EXPR) } // test match_expr @@ -468,10 +479,6 @@ fn match_guard(p: &mut Parser) -> CompletedMarker { assert!(p.at(T![if])); let m = p.start(); p.bump(T![if]); - if p.eat(T![let]) { - patterns::pattern_top(p); - p.expect(T![=]); - } expr(p); m.complete(p, MATCH_GUARD) } @@ -622,27 +629,3 @@ fn box_expr(p: &mut Parser, m: Option) -> CompletedMarker { } m.complete(p, BOX_EXPR) } - -/// Expression from `$var` macro expansion, wrapped in dollars -fn meta_var_expr(p: &mut Parser) -> CompletedMarker { - assert!(p.at(L_DOLLAR)); - let m = p.start(); - p.bump(L_DOLLAR); - let expr = expr_bp(p, None, Restrictions { forbid_structs: false, prefer_stmt: false }, 1); - - match (expr, p.current()) { - (Some((cm, _)), R_DOLLAR) => { - p.bump(R_DOLLAR); - // FIXME: this leaves the dollar hanging in the air... - m.abandon(p); - cm - } - _ => { - while !p.at(R_DOLLAR) { - p.bump_any(); - } - p.bump(R_DOLLAR); - m.complete(p, ERROR) - } - } -}