Expr macros

This commit is contained in:
Aleksey Kladov 2018-08-05 14:16:38 +03:00
parent c871022f98
commit 5691da4c84
4 changed files with 42 additions and 13 deletions

View File

@ -202,16 +202,22 @@ fn arg_list(p: &mut Parser) {
// let _ = a;
// let _ = a::b;
// let _ = ::a::<b>;
// let _ = format!();
// }
fn path_expr(p: &mut Parser, r: Restrictions) -> CompletedMarker {
assert!(paths::is_path_start(p));
let m = p.start();
paths::expr_path(p);
if p.at(L_CURLY) && !r.forbid_structs {
struct_lit(p);
m.complete(p, STRUCT_LIT)
} else {
m.complete(p, PATH_EXPR)
match p.current() {
L_CURLY if !r.forbid_structs => {
struct_lit(p);
m.complete(p, STRUCT_LIT)
}
EXCL => {
items::macro_call_after_excl(p);
m.complete(p, MACRO_CALL)
}
_ => m.complete(p, PATH_EXPR)
}
}

View File

@ -277,7 +277,7 @@ fn mod_item(p: &mut Parser) {
}
}
enum MacroFlavor {
pub(super) enum MacroFlavor {
Curly,
NonCurly,
}
@ -285,6 +285,10 @@ enum MacroFlavor {
fn macro_call(p: &mut Parser) -> MacroFlavor {
assert!(paths::is_path_start(p));
paths::use_path(p);
macro_call_after_excl(p)
}
pub(super) fn macro_call_after_excl(p: &mut Parser) -> MacroFlavor {
p.expect(EXCL);
p.eat(IDENT);
let flavor = match p.current() {

View File

@ -2,4 +2,5 @@ fn foo() {
let _ = a;
let _ = a::b;
let _ = ::a::<b>;
let _ = format!();
}

View File

@ -1,5 +1,5 @@
FILE@[0; 68)
FN_ITEM@[0; 68)
FILE@[0; 91)
FN_ITEM@[0; 91)
FN_KW@[0; 2)
NAME@[2; 6)
WHITESPACE@[2; 3)
@ -8,7 +8,7 @@ FILE@[0; 68)
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
BLOCK_EXPR@[9; 68)
BLOCK_EXPR@[9; 91)
L_CURLY@[9; 10)
LET_STMT@[10; 30)
WHITESPACE@[10; 15)
@ -46,7 +46,7 @@ FILE@[0; 68)
IDENT@[41; 42) "b"
SEMI@[42; 43)
WHITESPACE@[43; 48)
LET_STMT@[48; 66)
LET_STMT@[48; 70)
LET_KW@[48; 51)
PLACEHOLDER_PAT@[51; 54)
WHITESPACE@[51; 52)
@ -71,6 +71,24 @@ FILE@[0; 68)
IDENT@[62; 63) "b"
R_ANGLE@[63; 64)
SEMI@[64; 65)
WHITESPACE@[65; 66)
R_CURLY@[66; 67)
WHITESPACE@[67; 68)
WHITESPACE@[65; 70)
LET_STMT@[70; 89)
LET_KW@[70; 73)
PLACEHOLDER_PAT@[73; 76)
WHITESPACE@[73; 74)
UNDERSCORE@[74; 75)
WHITESPACE@[75; 76)
EQ@[76; 77)
MACRO_CALL@[77; 87)
PATH@[77; 84)
PATH_SEGMENT@[77; 84)
NAME_REF@[77; 84)
WHITESPACE@[77; 78)
IDENT@[78; 84) "format"
EXCL@[84; 85)
L_PAREN@[85; 86)
R_PAREN@[86; 87)
SEMI@[87; 88)
WHITESPACE@[88; 89)
R_CURLY@[89; 90)
WHITESPACE@[90; 91)