aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/grammar/expressions/mod.rs16
-rw-r--r--src/grammar/items/mod.rs6
-rw-r--r--tests/data/parser/inline/0039_path_expr.rs1
-rw-r--r--tests/data/parser/inline/0039_path_expr.txt32
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// }
206fn path_expr(p: &mut Parser, r: Restrictions) -> CompletedMarker { 207fn 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
280enum MacroFlavor { 280pub(super) enum MacroFlavor {
281 Curly, 281 Curly,
282 NonCurly, 282 NonCurly,
283} 283}
@@ -285,6 +285,10 @@ enum MacroFlavor {
285fn macro_call(p: &mut Parser) -> MacroFlavor { 285fn 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
291pub(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 @@
1FILE@[0; 68) 1FILE@[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)