diff options
author | Marcus Klaas de Vries <[email protected]> | 2019-01-28 22:06:11 +0000 |
---|---|---|
committer | Marcus Klaas de Vries <[email protected]> | 2019-01-28 22:09:14 +0000 |
commit | 3daca3eb4d843199540edfb1092f57f49938d0f6 (patch) | |
tree | 4cdc5c921b024d8b348b73e1a7c3e6a56fc11305 /crates/ra_syntax | |
parent | 3f4f50baaa21cb2d0f6c102f1ca521946071a8dc (diff) |
Infer type of match guard
Diffstat (limited to 'crates/ra_syntax')
6 files changed, 117 insertions, 44 deletions
diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index 3ace6533c..4f5a96014 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs | |||
@@ -1981,7 +1981,11 @@ impl ToOwned for MatchGuard { | |||
1981 | } | 1981 | } |
1982 | 1982 | ||
1983 | 1983 | ||
1984 | impl MatchGuard {} | 1984 | impl MatchGuard { |
1985 | pub fn expr(&self) -> Option<&Expr> { | ||
1986 | super::child_opt(self) | ||
1987 | } | ||
1988 | } | ||
1985 | 1989 | ||
1986 | // MethodCallExpr | 1990 | // MethodCallExpr |
1987 | #[derive(Debug, PartialEq, Eq, Hash)] | 1991 | #[derive(Debug, PartialEq, Eq, Hash)] |
diff --git a/crates/ra_syntax/src/grammar.ron b/crates/ra_syntax/src/grammar.ron index 85fc79038..e4cad4eb3 100644 --- a/crates/ra_syntax/src/grammar.ron +++ b/crates/ra_syntax/src/grammar.ron | |||
@@ -418,7 +418,7 @@ Grammar( | |||
418 | ], | 418 | ], |
419 | collections: [ [ "pats", "Pat" ] ] | 419 | collections: [ [ "pats", "Pat" ] ] |
420 | ), | 420 | ), |
421 | "MatchGuard": (), | 421 | "MatchGuard": (options: ["Expr"]), |
422 | "StructLit": (options: ["Path", "NamedFieldList", ["spread", "Expr"]]), | 422 | "StructLit": (options: ["Path", "NamedFieldList", ["spread", "Expr"]]), |
423 | "NamedFieldList": (collections: [ ["fields", "NamedField"] ]), | 423 | "NamedFieldList": (collections: [ ["fields", "NamedField"] ]), |
424 | "NamedField": (options: ["NameRef", "Expr"]), | 424 | "NamedField": (options: ["NameRef", "Expr"]), |
diff --git a/crates/ra_syntax/src/grammar/expressions/atom.rs b/crates/ra_syntax/src/grammar/expressions/atom.rs index 6d6d89f70..600774afd 100644 --- a/crates/ra_syntax/src/grammar/expressions/atom.rs +++ b/crates/ra_syntax/src/grammar/expressions/atom.rs | |||
@@ -360,8 +360,8 @@ fn match_arm(p: &mut Parser) -> BlockLike { | |||
360 | while p.eat(PIPE) { | 360 | while p.eat(PIPE) { |
361 | patterns::pattern(p); | 361 | patterns::pattern(p); |
362 | } | 362 | } |
363 | if p.eat(IF_KW) { | 363 | if p.at(IF_KW) { |
364 | expr(p); | 364 | match_guard(p); |
365 | } | 365 | } |
366 | p.expect(FAT_ARROW); | 366 | p.expect(FAT_ARROW); |
367 | let ret = expr_stmt(p); | 367 | let ret = expr_stmt(p); |
@@ -369,6 +369,20 @@ fn match_arm(p: &mut Parser) -> BlockLike { | |||
369 | ret | 369 | ret |
370 | } | 370 | } |
371 | 371 | ||
372 | // test match_guard | ||
373 | // fn foo() { | ||
374 | // match () { | ||
375 | // _ if foo => (), | ||
376 | // } | ||
377 | // } | ||
378 | fn match_guard(p: &mut Parser) -> CompletedMarker { | ||
379 | assert!(p.at(IF_KW)); | ||
380 | let m = p.start(); | ||
381 | p.bump(); | ||
382 | expr(p); | ||
383 | m.complete(p, MATCH_GUARD) | ||
384 | } | ||
385 | |||
372 | // test block_expr | 386 | // test block_expr |
373 | // fn foo() { | 387 | // fn foo() { |
374 | // {}; | 388 | // {}; |
diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0066_match_arm.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0066_match_arm.txt index 98e7535a3..b44e61879 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0066_match_arm.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0066_match_arm.txt | |||
@@ -37,32 +37,33 @@ SOURCE_FILE@[0; 167) | |||
37 | PLACEHOLDER_PAT@[51; 52) | 37 | PLACEHOLDER_PAT@[51; 52) |
38 | UNDERSCORE@[51; 52) | 38 | UNDERSCORE@[51; 52) |
39 | WHITESPACE@[52; 53) | 39 | WHITESPACE@[52; 53) |
40 | IF_KW@[53; 55) | 40 | MATCH_GUARD@[53; 77) |
41 | WHITESPACE@[55; 56) | 41 | IF_KW@[53; 55) |
42 | BIN_EXPR@[56; 77) | 42 | WHITESPACE@[55; 56) |
43 | PATH_EXPR@[56; 60) | 43 | BIN_EXPR@[56; 77) |
44 | PATH@[56; 60) | 44 | PATH_EXPR@[56; 60) |
45 | PATH_SEGMENT@[56; 60) | 45 | PATH@[56; 60) |
46 | NAME_REF@[56; 60) | 46 | PATH_SEGMENT@[56; 60) |
47 | IDENT@[56; 60) "Test" | 47 | NAME_REF@[56; 60) |
48 | WHITESPACE@[60; 61) | 48 | IDENT@[56; 60) "Test" |
49 | R_ANGLE@[61; 62) | 49 | WHITESPACE@[60; 61) |
50 | WHITESPACE@[62; 63) | 50 | R_ANGLE@[61; 62) |
51 | STRUCT_LIT@[63; 77) | 51 | WHITESPACE@[62; 63) |
52 | PATH@[63; 67) | 52 | STRUCT_LIT@[63; 77) |
53 | PATH_SEGMENT@[63; 67) | 53 | PATH@[63; 67) |
54 | NAME_REF@[63; 67) | 54 | PATH_SEGMENT@[63; 67) |
55 | IDENT@[63; 67) "Test" | 55 | NAME_REF@[63; 67) |
56 | NAMED_FIELD_LIST@[67; 77) | 56 | IDENT@[63; 67) "Test" |
57 | L_CURLY@[67; 68) | 57 | NAMED_FIELD_LIST@[67; 77) |
58 | NAMED_FIELD@[68; 76) | 58 | L_CURLY@[67; 68) |
59 | NAME_REF@[68; 73) | 59 | NAMED_FIELD@[68; 76) |
60 | IDENT@[68; 73) "field" | 60 | NAME_REF@[68; 73) |
61 | COLON@[73; 74) | 61 | IDENT@[68; 73) "field" |
62 | WHITESPACE@[74; 75) | 62 | COLON@[73; 74) |
63 | LITERAL@[75; 76) | 63 | WHITESPACE@[74; 75) |
64 | INT_NUMBER@[75; 76) "0" | 64 | LITERAL@[75; 76) |
65 | R_CURLY@[76; 77) | 65 | INT_NUMBER@[75; 76) "0" |
66 | R_CURLY@[76; 77) | ||
66 | WHITESPACE@[77; 78) | 67 | WHITESPACE@[77; 78) |
67 | FAT_ARROW@[78; 80) | 68 | FAT_ARROW@[78; 80) |
68 | WHITESPACE@[80; 81) | 69 | WHITESPACE@[80; 81) |
@@ -82,13 +83,14 @@ SOURCE_FILE@[0; 167) | |||
82 | NAME@[97; 98) | 83 | NAME@[97; 98) |
83 | IDENT@[97; 98) "Y" | 84 | IDENT@[97; 98) "Y" |
84 | WHITESPACE@[98; 99) | 85 | WHITESPACE@[98; 99) |
85 | IF_KW@[99; 101) | 86 | MATCH_GUARD@[99; 103) |
86 | WHITESPACE@[101; 102) | 87 | IF_KW@[99; 101) |
87 | PATH_EXPR@[102; 103) | 88 | WHITESPACE@[101; 102) |
88 | PATH@[102; 103) | 89 | PATH_EXPR@[102; 103) |
89 | PATH_SEGMENT@[102; 103) | 90 | PATH@[102; 103) |
90 | NAME_REF@[102; 103) | 91 | PATH_SEGMENT@[102; 103) |
91 | IDENT@[102; 103) "Z" | 92 | NAME_REF@[102; 103) |
93 | IDENT@[102; 103) "Z" | ||
92 | WHITESPACE@[103; 104) | 94 | WHITESPACE@[103; 104) |
93 | FAT_ARROW@[104; 106) | 95 | FAT_ARROW@[104; 106) |
94 | WHITESPACE@[106; 107) | 96 | WHITESPACE@[106; 107) |
@@ -110,13 +112,14 @@ SOURCE_FILE@[0; 167) | |||
110 | NAME@[125; 126) | 112 | NAME@[125; 126) |
111 | IDENT@[125; 126) "Y" | 113 | IDENT@[125; 126) "Y" |
112 | WHITESPACE@[126; 127) | 114 | WHITESPACE@[126; 127) |
113 | IF_KW@[127; 129) | 115 | MATCH_GUARD@[127; 131) |
114 | WHITESPACE@[129; 130) | 116 | IF_KW@[127; 129) |
115 | PATH_EXPR@[130; 131) | 117 | WHITESPACE@[129; 130) |
116 | PATH@[130; 131) | 118 | PATH_EXPR@[130; 131) |
117 | PATH_SEGMENT@[130; 131) | 119 | PATH@[130; 131) |
118 | NAME_REF@[130; 131) | 120 | PATH_SEGMENT@[130; 131) |
119 | IDENT@[130; 131) "Z" | 121 | NAME_REF@[130; 131) |
122 | IDENT@[130; 131) "Z" | ||
120 | WHITESPACE@[131; 132) | 123 | WHITESPACE@[131; 132) |
121 | FAT_ARROW@[132; 134) | 124 | FAT_ARROW@[132; 134) |
122 | WHITESPACE@[134; 135) | 125 | WHITESPACE@[134; 135) |
diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0118_match_guard.rs b/crates/ra_syntax/tests/data/parser/inline/ok/0118_match_guard.rs new file mode 100644 index 000000000..f1bd72fc4 --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0118_match_guard.rs | |||
@@ -0,0 +1,5 @@ | |||
1 | fn foo() { | ||
2 | match () { | ||
3 | _ if foo => (), | ||
4 | } | ||
5 | } | ||
diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0118_match_guard.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0118_match_guard.txt new file mode 100644 index 000000000..27553882d --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0118_match_guard.txt | |||
@@ -0,0 +1,47 @@ | |||
1 | SOURCE_FILE@[0; 58) | ||
2 | FN_DEF@[0; 57) | ||
3 | FN_KW@[0; 2) | ||
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; 57) | ||
12 | L_CURLY@[9; 10) | ||
13 | WHITESPACE@[10; 15) | ||
14 | MATCH_EXPR@[15; 55) | ||
15 | MATCH_KW@[15; 20) | ||
16 | WHITESPACE@[20; 21) | ||
17 | TUPLE_EXPR@[21; 23) | ||
18 | L_PAREN@[21; 22) | ||
19 | R_PAREN@[22; 23) | ||
20 | WHITESPACE@[23; 24) | ||
21 | MATCH_ARM_LIST@[24; 55) | ||
22 | L_CURLY@[24; 25) | ||
23 | WHITESPACE@[25; 34) | ||
24 | MATCH_ARM@[34; 48) | ||
25 | PLACEHOLDER_PAT@[34; 35) | ||
26 | UNDERSCORE@[34; 35) | ||
27 | WHITESPACE@[35; 36) | ||
28 | MATCH_GUARD@[36; 42) | ||
29 | IF_KW@[36; 38) | ||
30 | WHITESPACE@[38; 39) | ||
31 | PATH_EXPR@[39; 42) | ||
32 | PATH@[39; 42) | ||
33 | PATH_SEGMENT@[39; 42) | ||
34 | NAME_REF@[39; 42) | ||
35 | IDENT@[39; 42) "foo" | ||
36 | WHITESPACE@[42; 43) | ||
37 | FAT_ARROW@[43; 45) | ||
38 | WHITESPACE@[45; 46) | ||
39 | TUPLE_EXPR@[46; 48) | ||
40 | L_PAREN@[46; 47) | ||
41 | R_PAREN@[47; 48) | ||
42 | COMMA@[48; 49) | ||
43 | WHITESPACE@[49; 54) | ||
44 | R_CURLY@[54; 55) | ||
45 | WHITESPACE@[55; 56) | ||
46 | R_CURLY@[56; 57) | ||
47 | WHITESPACE@[57; 58) | ||