diff options
-rw-r--r-- | src/grammar/expressions/mod.rs | 16 | ||||
-rw-r--r-- | src/grammar/items/mod.rs | 6 | ||||
-rw-r--r-- | tests/data/parser/inline/0039_path_expr.rs | 1 | ||||
-rw-r--r-- | tests/data/parser/inline/0039_path_expr.txt | 32 |
4 files changed, 42 insertions, 13 deletions
diff --git a/src/grammar/expressions/mod.rs b/src/grammar/expressions/mod.rs index 6831aef66..15669f99d 100644 --- a/src/grammar/expressions/mod.rs +++ b/src/grammar/expressions/mod.rs | |||
@@ -202,16 +202,22 @@ fn arg_list(p: &mut Parser) { | |||
202 | // let _ = a; | 202 | // let _ = a; |
203 | // let _ = a::b; | 203 | // let _ = a::b; |
204 | // let _ = ::a::<b>; | 204 | // let _ = ::a::<b>; |
205 | // let _ = format!(); | ||
205 | // } | 206 | // } |
206 | fn path_expr(p: &mut Parser, r: Restrictions) -> CompletedMarker { | 207 | fn path_expr(p: &mut Parser, r: Restrictions) -> CompletedMarker { |
207 | assert!(paths::is_path_start(p)); | 208 | assert!(paths::is_path_start(p)); |
208 | let m = p.start(); | 209 | let m = p.start(); |
209 | paths::expr_path(p); | 210 | paths::expr_path(p); |
210 | if p.at(L_CURLY) && !r.forbid_structs { | 211 | match p.current() { |
211 | struct_lit(p); | 212 | L_CURLY if !r.forbid_structs => { |
212 | m.complete(p, STRUCT_LIT) | 213 | struct_lit(p); |
213 | } else { | 214 | m.complete(p, STRUCT_LIT) |
214 | m.complete(p, PATH_EXPR) | 215 | } |
216 | EXCL => { | ||
217 | items::macro_call_after_excl(p); | ||
218 | m.complete(p, MACRO_CALL) | ||
219 | } | ||
220 | _ => m.complete(p, PATH_EXPR) | ||
215 | } | 221 | } |
216 | } | 222 | } |
217 | 223 | ||
diff --git a/src/grammar/items/mod.rs b/src/grammar/items/mod.rs index 8f766901e..657078765 100644 --- a/src/grammar/items/mod.rs +++ b/src/grammar/items/mod.rs | |||
@@ -277,7 +277,7 @@ fn mod_item(p: &mut Parser) { | |||
277 | } | 277 | } |
278 | } | 278 | } |
279 | 279 | ||
280 | enum MacroFlavor { | 280 | pub(super) enum MacroFlavor { |
281 | Curly, | 281 | Curly, |
282 | NonCurly, | 282 | NonCurly, |
283 | } | 283 | } |
@@ -285,6 +285,10 @@ enum MacroFlavor { | |||
285 | fn macro_call(p: &mut Parser) -> MacroFlavor { | 285 | fn macro_call(p: &mut Parser) -> MacroFlavor { |
286 | assert!(paths::is_path_start(p)); | 286 | assert!(paths::is_path_start(p)); |
287 | paths::use_path(p); | 287 | paths::use_path(p); |
288 | macro_call_after_excl(p) | ||
289 | } | ||
290 | |||
291 | pub(super) fn macro_call_after_excl(p: &mut Parser) -> MacroFlavor { | ||
288 | p.expect(EXCL); | 292 | p.expect(EXCL); |
289 | p.eat(IDENT); | 293 | p.eat(IDENT); |
290 | let flavor = match p.current() { | 294 | let flavor = match p.current() { |
diff --git a/tests/data/parser/inline/0039_path_expr.rs b/tests/data/parser/inline/0039_path_expr.rs index e9855bad7..333ebabef 100644 --- a/tests/data/parser/inline/0039_path_expr.rs +++ b/tests/data/parser/inline/0039_path_expr.rs | |||
@@ -2,4 +2,5 @@ fn foo() { | |||
2 | let _ = a; | 2 | let _ = a; |
3 | let _ = a::b; | 3 | let _ = a::b; |
4 | let _ = ::a::<b>; | 4 | let _ = ::a::<b>; |
5 | let _ = format!(); | ||
5 | } | 6 | } |
diff --git a/tests/data/parser/inline/0039_path_expr.txt b/tests/data/parser/inline/0039_path_expr.txt index a646f523f..a3e2dbbe8 100644 --- a/tests/data/parser/inline/0039_path_expr.txt +++ b/tests/data/parser/inline/0039_path_expr.txt | |||
@@ -1,5 +1,5 @@ | |||
1 | FILE@[0; 68) | 1 | FILE@[0; 91) |
2 | FN_ITEM@[0; 68) | 2 | FN_ITEM@[0; 91) |
3 | FN_KW@[0; 2) | 3 | FN_KW@[0; 2) |
4 | NAME@[2; 6) | 4 | NAME@[2; 6) |
5 | WHITESPACE@[2; 3) | 5 | WHITESPACE@[2; 3) |
@@ -8,7 +8,7 @@ FILE@[0; 68) | |||
8 | L_PAREN@[6; 7) | 8 | L_PAREN@[6; 7) |
9 | R_PAREN@[7; 8) | 9 | R_PAREN@[7; 8) |
10 | WHITESPACE@[8; 9) | 10 | WHITESPACE@[8; 9) |
11 | BLOCK_EXPR@[9; 68) | 11 | BLOCK_EXPR@[9; 91) |
12 | L_CURLY@[9; 10) | 12 | L_CURLY@[9; 10) |
13 | LET_STMT@[10; 30) | 13 | LET_STMT@[10; 30) |
14 | WHITESPACE@[10; 15) | 14 | WHITESPACE@[10; 15) |
@@ -46,7 +46,7 @@ FILE@[0; 68) | |||
46 | IDENT@[41; 42) "b" | 46 | IDENT@[41; 42) "b" |
47 | SEMI@[42; 43) | 47 | SEMI@[42; 43) |
48 | WHITESPACE@[43; 48) | 48 | WHITESPACE@[43; 48) |
49 | LET_STMT@[48; 66) | 49 | LET_STMT@[48; 70) |
50 | LET_KW@[48; 51) | 50 | LET_KW@[48; 51) |
51 | PLACEHOLDER_PAT@[51; 54) | 51 | PLACEHOLDER_PAT@[51; 54) |
52 | WHITESPACE@[51; 52) | 52 | WHITESPACE@[51; 52) |
@@ -71,6 +71,24 @@ FILE@[0; 68) | |||
71 | IDENT@[62; 63) "b" | 71 | IDENT@[62; 63) "b" |
72 | R_ANGLE@[63; 64) | 72 | R_ANGLE@[63; 64) |
73 | SEMI@[64; 65) | 73 | SEMI@[64; 65) |
74 | WHITESPACE@[65; 66) | 74 | WHITESPACE@[65; 70) |
75 | R_CURLY@[66; 67) | 75 | LET_STMT@[70; 89) |
76 | WHITESPACE@[67; 68) | 76 | LET_KW@[70; 73) |
77 | PLACEHOLDER_PAT@[73; 76) | ||
78 | WHITESPACE@[73; 74) | ||
79 | UNDERSCORE@[74; 75) | ||
80 | WHITESPACE@[75; 76) | ||
81 | EQ@[76; 77) | ||
82 | MACRO_CALL@[77; 87) | ||
83 | PATH@[77; 84) | ||
84 | PATH_SEGMENT@[77; 84) | ||
85 | NAME_REF@[77; 84) | ||
86 | WHITESPACE@[77; 78) | ||
87 | IDENT@[78; 84) "format" | ||
88 | EXCL@[84; 85) | ||
89 | L_PAREN@[85; 86) | ||
90 | R_PAREN@[86; 87) | ||
91 | SEMI@[87; 88) | ||
92 | WHITESPACE@[88; 89) | ||
93 | R_CURLY@[89; 90) | ||
94 | WHITESPACE@[90; 91) | ||