diff options
5 files changed, 93 insertions, 0 deletions
diff --git a/crates/ra_parser/src/grammar/expressions.rs b/crates/ra_parser/src/grammar/expressions.rs index 298030cb9..3e49e70c7 100644 --- a/crates/ra_parser/src/grammar/expressions.rs +++ b/crates/ra_parser/src/grammar/expressions.rs | |||
@@ -393,6 +393,18 @@ fn postfix_expr( | |||
393 | T![.] if p.nth(1) == IDENT && (p.nth(2) == T!['('] || p.nth(2) == T![::]) => { | 393 | T![.] if p.nth(1) == IDENT && (p.nth(2) == T!['('] || p.nth(2) == T![::]) => { |
394 | method_call_expr(p, lhs) | 394 | method_call_expr(p, lhs) |
395 | } | 395 | } |
396 | T![.] if p.nth(1) == AWAIT_KW => { | ||
397 | // test await_expr | ||
398 | // fn foo() { | ||
399 | // x.await; | ||
400 | // x.0.await; | ||
401 | // x.0().await?.hello(); | ||
402 | // } | ||
403 | let m = lhs.precede(p); | ||
404 | p.bump(); | ||
405 | p.bump(); | ||
406 | m.complete(p, AWAIT_EXPR) | ||
407 | } | ||
396 | T![.] => field_expr(p, lhs), | 408 | T![.] => field_expr(p, lhs), |
397 | // test postfix_range | 409 | // test postfix_range |
398 | // fn foo() { let x = 1..; } | 410 | // fn foo() { let x = 1..; } |
diff --git a/crates/ra_parser/src/syntax_kind/generated.rs b/crates/ra_parser/src/syntax_kind/generated.rs index 374fd5aec..4b5abb516 100644 --- a/crates/ra_parser/src/syntax_kind/generated.rs +++ b/crates/ra_parser/src/syntax_kind/generated.rs | |||
@@ -105,6 +105,7 @@ pub enum SyntaxKind { | |||
105 | RETURN_KW, | 105 | RETURN_KW, |
106 | TRY_KW, | 106 | TRY_KW, |
107 | BOX_KW, | 107 | BOX_KW, |
108 | AWAIT_KW, | ||
108 | AUTO_KW, | 109 | AUTO_KW, |
109 | DEFAULT_KW, | 110 | DEFAULT_KW, |
110 | EXISTENTIAL_KW, | 111 | EXISTENTIAL_KW, |
@@ -193,6 +194,7 @@ pub enum SyntaxKind { | |||
193 | INDEX_EXPR, | 194 | INDEX_EXPR, |
194 | METHOD_CALL_EXPR, | 195 | METHOD_CALL_EXPR, |
195 | FIELD_EXPR, | 196 | FIELD_EXPR, |
197 | AWAIT_EXPR, | ||
196 | TRY_EXPR, | 198 | TRY_EXPR, |
197 | CAST_EXPR, | 199 | CAST_EXPR, |
198 | REF_EXPR, | 200 | REF_EXPR, |
@@ -338,6 +340,7 @@ macro_rules! T { | |||
338 | (return) => { $crate::SyntaxKind::RETURN_KW }; | 340 | (return) => { $crate::SyntaxKind::RETURN_KW }; |
339 | (try) => { $crate::SyntaxKind::TRY_KW }; | 341 | (try) => { $crate::SyntaxKind::TRY_KW }; |
340 | (box) => { $crate::SyntaxKind::BOX_KW }; | 342 | (box) => { $crate::SyntaxKind::BOX_KW }; |
343 | (await) => { $crate::SyntaxKind::AWAIT_KW }; | ||
341 | (auto) => { $crate::SyntaxKind::AUTO_KW }; | 344 | (auto) => { $crate::SyntaxKind::AUTO_KW }; |
342 | (default) => { $crate::SyntaxKind::DEFAULT_KW }; | 345 | (default) => { $crate::SyntaxKind::DEFAULT_KW }; |
343 | (existential) => { $crate::SyntaxKind::EXISTENTIAL_KW }; | 346 | (existential) => { $crate::SyntaxKind::EXISTENTIAL_KW }; |
@@ -398,6 +401,7 @@ impl SyntaxKind { | |||
398 | | RETURN_KW | 401 | | RETURN_KW |
399 | | TRY_KW | 402 | | TRY_KW |
400 | | BOX_KW | 403 | | BOX_KW |
404 | | AWAIT_KW | ||
401 | | AUTO_KW | 405 | | AUTO_KW |
402 | | DEFAULT_KW | 406 | | DEFAULT_KW |
403 | | EXISTENTIAL_KW | 407 | | EXISTENTIAL_KW |
@@ -572,6 +576,7 @@ impl SyntaxKind { | |||
572 | RETURN_KW => &SyntaxInfo { name: "RETURN_KW" }, | 576 | RETURN_KW => &SyntaxInfo { name: "RETURN_KW" }, |
573 | TRY_KW => &SyntaxInfo { name: "TRY_KW" }, | 577 | TRY_KW => &SyntaxInfo { name: "TRY_KW" }, |
574 | BOX_KW => &SyntaxInfo { name: "BOX_KW" }, | 578 | BOX_KW => &SyntaxInfo { name: "BOX_KW" }, |
579 | AWAIT_KW => &SyntaxInfo { name: "AWAIT_KW" }, | ||
575 | AUTO_KW => &SyntaxInfo { name: "AUTO_KW" }, | 580 | AUTO_KW => &SyntaxInfo { name: "AUTO_KW" }, |
576 | DEFAULT_KW => &SyntaxInfo { name: "DEFAULT_KW" }, | 581 | DEFAULT_KW => &SyntaxInfo { name: "DEFAULT_KW" }, |
577 | EXISTENTIAL_KW => &SyntaxInfo { name: "EXISTENTIAL_KW" }, | 582 | EXISTENTIAL_KW => &SyntaxInfo { name: "EXISTENTIAL_KW" }, |
@@ -660,6 +665,7 @@ impl SyntaxKind { | |||
660 | INDEX_EXPR => &SyntaxInfo { name: "INDEX_EXPR" }, | 665 | INDEX_EXPR => &SyntaxInfo { name: "INDEX_EXPR" }, |
661 | METHOD_CALL_EXPR => &SyntaxInfo { name: "METHOD_CALL_EXPR" }, | 666 | METHOD_CALL_EXPR => &SyntaxInfo { name: "METHOD_CALL_EXPR" }, |
662 | FIELD_EXPR => &SyntaxInfo { name: "FIELD_EXPR" }, | 667 | FIELD_EXPR => &SyntaxInfo { name: "FIELD_EXPR" }, |
668 | AWAIT_EXPR => &SyntaxInfo { name: "AWAIT_EXPR" }, | ||
663 | TRY_EXPR => &SyntaxInfo { name: "TRY_EXPR" }, | 669 | TRY_EXPR => &SyntaxInfo { name: "TRY_EXPR" }, |
664 | CAST_EXPR => &SyntaxInfo { name: "CAST_EXPR" }, | 670 | CAST_EXPR => &SyntaxInfo { name: "CAST_EXPR" }, |
665 | REF_EXPR => &SyntaxInfo { name: "REF_EXPR" }, | 671 | REF_EXPR => &SyntaxInfo { name: "REF_EXPR" }, |
@@ -752,6 +758,7 @@ impl SyntaxKind { | |||
752 | "return" => RETURN_KW, | 758 | "return" => RETURN_KW, |
753 | "try" => TRY_KW, | 759 | "try" => TRY_KW, |
754 | "box" => BOX_KW, | 760 | "box" => BOX_KW, |
761 | "await" => AWAIT_KW, | ||
755 | _ => return None, | 762 | _ => return None, |
756 | }; | 763 | }; |
757 | Some(kw) | 764 | Some(kw) |
diff --git a/crates/ra_syntax/src/grammar.ron b/crates/ra_syntax/src/grammar.ron index 6c075a700..55494239e 100644 --- a/crates/ra_syntax/src/grammar.ron +++ b/crates/ra_syntax/src/grammar.ron | |||
@@ -97,6 +97,7 @@ Grammar( | |||
97 | "return", | 97 | "return", |
98 | "try", | 98 | "try", |
99 | "box", | 99 | "box", |
100 | "await" | ||
100 | ], | 101 | ], |
101 | contextual_keywords: [ | 102 | contextual_keywords: [ |
102 | "auto", | 103 | "auto", |
@@ -200,6 +201,7 @@ Grammar( | |||
200 | "INDEX_EXPR", | 201 | "INDEX_EXPR", |
201 | "METHOD_CALL_EXPR", | 202 | "METHOD_CALL_EXPR", |
202 | "FIELD_EXPR", | 203 | "FIELD_EXPR", |
204 | "AWAIT_EXPR", | ||
203 | "TRY_EXPR", | 205 | "TRY_EXPR", |
204 | "CAST_EXPR", | 206 | "CAST_EXPR", |
205 | 207 | ||
diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0137_await_expr.rs b/crates/ra_syntax/tests/data/parser/inline/ok/0137_await_expr.rs new file mode 100644 index 000000000..d2ba89ca6 --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0137_await_expr.rs | |||
@@ -0,0 +1,5 @@ | |||
1 | fn foo() { | ||
2 | x.await; | ||
3 | x.0.await; | ||
4 | x.0().await?.hello(); | ||
5 | } | ||
diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0137_await_expr.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0137_await_expr.txt new file mode 100644 index 000000000..99bd76ace --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0137_await_expr.txt | |||
@@ -0,0 +1,67 @@ | |||
1 | SOURCE_FILE@[0; 67) | ||
2 | FN_DEF@[0; 66) | ||
3 | FN_KW@[0; 2) "fn" | ||
4 | WHITESPACE@[2; 3) " " | ||
5 | NAME@[3; 6) | ||
6 | IDENT@[3; 6) "foo" | ||
7 | PARAM_LIST@[6; 8) | ||
8 | L_PAREN@[6; 7) "(" | ||
9 | R_PAREN@[7; 8) ")" | ||
10 | WHITESPACE@[8; 9) " " | ||
11 | BLOCK@[9; 66) | ||
12 | L_CURLY@[9; 10) "{" | ||
13 | WHITESPACE@[10; 15) "\n " | ||
14 | EXPR_STMT@[15; 23) | ||
15 | AWAIT_EXPR@[15; 22) | ||
16 | PATH_EXPR@[15; 16) | ||
17 | PATH@[15; 16) | ||
18 | PATH_SEGMENT@[15; 16) | ||
19 | NAME_REF@[15; 16) | ||
20 | IDENT@[15; 16) "x" | ||
21 | DOT@[16; 17) "." | ||
22 | AWAIT_KW@[17; 22) "await" | ||
23 | SEMI@[22; 23) ";" | ||
24 | WHITESPACE@[23; 28) "\n " | ||
25 | EXPR_STMT@[28; 38) | ||
26 | AWAIT_EXPR@[28; 37) | ||
27 | FIELD_EXPR@[28; 31) | ||
28 | PATH_EXPR@[28; 29) | ||
29 | PATH@[28; 29) | ||
30 | PATH_SEGMENT@[28; 29) | ||
31 | NAME_REF@[28; 29) | ||
32 | IDENT@[28; 29) "x" | ||
33 | DOT@[29; 30) "." | ||
34 | INT_NUMBER@[30; 31) "0" | ||
35 | DOT@[31; 32) "." | ||
36 | AWAIT_KW@[32; 37) "await" | ||
37 | SEMI@[37; 38) ";" | ||
38 | WHITESPACE@[38; 43) "\n " | ||
39 | EXPR_STMT@[43; 64) | ||
40 | METHOD_CALL_EXPR@[43; 63) | ||
41 | TRY_EXPR@[43; 55) | ||
42 | AWAIT_EXPR@[43; 54) | ||
43 | CALL_EXPR@[43; 48) | ||
44 | FIELD_EXPR@[43; 46) | ||
45 | PATH_EXPR@[43; 44) | ||
46 | PATH@[43; 44) | ||
47 | PATH_SEGMENT@[43; 44) | ||
48 | NAME_REF@[43; 44) | ||
49 | IDENT@[43; 44) "x" | ||
50 | DOT@[44; 45) "." | ||
51 | INT_NUMBER@[45; 46) "0" | ||
52 | ARG_LIST@[46; 48) | ||
53 | L_PAREN@[46; 47) "(" | ||
54 | R_PAREN@[47; 48) ")" | ||
55 | DOT@[48; 49) "." | ||
56 | AWAIT_KW@[49; 54) "await" | ||
57 | QUESTION@[54; 55) "?" | ||
58 | DOT@[55; 56) "." | ||
59 | NAME_REF@[56; 61) | ||
60 | IDENT@[56; 61) "hello" | ||
61 | ARG_LIST@[61; 63) | ||
62 | L_PAREN@[61; 62) "(" | ||
63 | R_PAREN@[62; 63) ")" | ||
64 | SEMI@[63; 64) ";" | ||
65 | WHITESPACE@[64; 65) "\n" | ||
66 | R_CURLY@[65; 66) "}" | ||
67 | WHITESPACE@[66; 67) "\n" | ||