Nodes for type args

This commit is contained in:
Aleksey Kladov 2018-07-31 19:37:40 +03:00
parent cd814fdf81
commit 63e2ed4e75
6 changed files with 84 additions and 12 deletions

View file

@ -152,10 +152,13 @@ Grammar(
"LET_STMT",
"EXPR_STMT",
"TYPE_PARAM",
"LIFETIME_PARAM",
"TYPE_PARAM_LIST",
"LIFETIME_PARAM",
"TYPE_PARAM",
"TYPE_ARG_LIST",
"LIFETIME_ARG",
"TYPE_ARG",
"ASSOC_TYPE_ARG",
"PARAM_LIST",
"SELF_PARAM",

View file

@ -16,7 +16,7 @@ pub(super) fn list(p: &mut Parser, colon_colon_required: bool) {
};
while !p.at(EOF) && !p.at(R_ANGLE) {
types::type_(p);
type_arg(p);
if !p.at(R_ANGLE) && !p.expect(COMMA) {
break;
}
@ -24,3 +24,25 @@ pub(super) fn list(p: &mut Parser, colon_colon_required: bool) {
p.expect(R_ANGLE);
m.complete(p, TYPE_ARG_LIST);
}
// test type_arg
// type A = B<'static, i32, Item=u64>
fn type_arg(p: &mut Parser) {
let m = p.start();
match p.current() {
LIFETIME => {
p.bump();
m.complete(p, LIFETIME_ARG);
},
IDENT if p.nth(1) == EQ => {
p.bump();
p.bump();
types::type_(p);
m.complete(p, ASSOC_TYPE_ARG);
},
_ => {
types::type_(p);
m.complete(p, TYPE_ARG);
},
}
}

View file

@ -140,10 +140,13 @@ pub enum SyntaxKind {
BLOCK,
LET_STMT,
EXPR_STMT,
TYPE_PARAM,
LIFETIME_PARAM,
TYPE_PARAM_LIST,
LIFETIME_PARAM,
TYPE_PARAM,
TYPE_ARG_LIST,
LIFETIME_ARG,
TYPE_ARG,
ASSOC_TYPE_ARG,
PARAM_LIST,
SELF_PARAM,
ARG_LIST,
@ -294,10 +297,13 @@ impl SyntaxKind {
BLOCK => &SyntaxInfo { name: "BLOCK" },
LET_STMT => &SyntaxInfo { name: "LET_STMT" },
EXPR_STMT => &SyntaxInfo { name: "EXPR_STMT" },
TYPE_PARAM => &SyntaxInfo { name: "TYPE_PARAM" },
LIFETIME_PARAM => &SyntaxInfo { name: "LIFETIME_PARAM" },
TYPE_PARAM_LIST => &SyntaxInfo { name: "TYPE_PARAM_LIST" },
LIFETIME_PARAM => &SyntaxInfo { name: "LIFETIME_PARAM" },
TYPE_PARAM => &SyntaxInfo { name: "TYPE_PARAM" },
TYPE_ARG_LIST => &SyntaxInfo { name: "TYPE_ARG_LIST" },
LIFETIME_ARG => &SyntaxInfo { name: "LIFETIME_ARG" },
TYPE_ARG => &SyntaxInfo { name: "TYPE_ARG" },
ASSOC_TYPE_ARG => &SyntaxInfo { name: "ASSOC_TYPE_ARG" },
PARAM_LIST => &SyntaxInfo { name: "PARAM_LIST" },
SELF_PARAM => &SyntaxInfo { name: "SELF_PARAM" },
ARG_LIST => &SyntaxInfo { name: "ARG_LIST" },

View file

@ -63,11 +63,12 @@ FILE@[0; 68)
TYPE_ARG_LIST@[59; 64)
COLONCOLON@[59; 61)
L_ANGLE@[61; 62)
PATH_TYPE@[62; 63)
PATH@[62; 63)
PATH_SEGMENT@[62; 63)
NAME_REF@[62; 63)
IDENT@[62; 63) "b"
TYPE_ARG@[62; 63)
PATH_TYPE@[62; 63)
PATH@[62; 63)
PATH_SEGMENT@[62; 63)
NAME_REF@[62; 63)
IDENT@[62; 63) "b"
R_ANGLE@[63; 64)
SEMI@[64; 65)
WHITESPACE@[65; 66)

View file

@ -0,0 +1 @@
type A = B<'static, i32, Item=u64>

View file

@ -0,0 +1,39 @@
FILE@[0; 35)
TYPE_ITEM@[0; 35)
TYPE_KW@[0; 4)
NAME@[4; 7)
WHITESPACE@[4; 5)
IDENT@[5; 6) "A"
WHITESPACE@[6; 7)
EQ@[7; 8)
PATH_TYPE@[8; 35)
PATH@[8; 35)
PATH_SEGMENT@[8; 35)
NAME_REF@[8; 10)
WHITESPACE@[8; 9)
IDENT@[9; 10) "B"
TYPE_ARG_LIST@[10; 35)
L_ANGLE@[10; 11)
LIFETIME_ARG@[11; 18)
LIFETIME@[11; 18) "'static"
COMMA@[18; 19)
TYPE_ARG@[19; 23)
PATH_TYPE@[19; 23)
PATH@[19; 23)
PATH_SEGMENT@[19; 23)
NAME_REF@[19; 23)
WHITESPACE@[19; 20)
IDENT@[20; 23) "i32"
COMMA@[23; 24)
ASSOC_TYPE_ARG@[24; 33)
WHITESPACE@[24; 25)
IDENT@[25; 29) "Item"
EQ@[29; 30)
PATH_TYPE@[30; 33)
PATH@[30; 33)
PATH_SEGMENT@[30; 33)
NAME_REF@[30; 33)
IDENT@[30; 33) "u64"
R_ANGLE@[33; 34)
WHITESPACE@[34; 35)
err: `expected SEMI`