Generic params in structs

This commit is contained in:
Aleksey Kladov 2018-01-28 18:53:53 +03:00
parent 7e55b2693f
commit 8ca02acb5a
6 changed files with 294 additions and 3 deletions

View file

@ -88,5 +88,8 @@ Grammar(
"LITERAL", "LITERAL",
"ALIAS", "ALIAS",
"VISIBILITY", "VISIBILITY",
"TYPE_PARAM_LIST",
"LIFETIME_PARAM",
"TYPE_PARAM",
] ]
) )

View file

@ -59,7 +59,49 @@ fn item(p: &mut Parser) {
item.complete(p, item_kind); item.complete(p, item_kind);
} }
fn generic_parameters(_: &mut Parser) {} fn type_param_list(p: &mut Parser) {
if !p.at(L_ANGLE) {
return;
}
let m = p.start();
p.bump();
while !p.at(EOF) && !p.at(R_ANGLE) {
match p.current() {
LIFETIME => lifetime_param(p),
IDENT => type_param(p),
_ => p.err_and_bump("expected type parameter"),
}
if !p.at(R_ANGLE) && !p.expect(COMMA) {
break;
}
}
p.expect(R_ANGLE);
m.complete(p, TYPE_PARAM_LIST);
fn lifetime_param(p: &mut Parser) {
assert!(p.at(LIFETIME));
let m = p.start();
p.bump();
if p.eat(COLON) {
while p.at(LIFETIME) {
p.bump();
if !p.eat(PLUS) {
break;
}
}
}
m.complete(p, LIFETIME_PARAM);
}
fn type_param(p: &mut Parser) {
assert!(p.at(IDENT));
let m = p.start();
p.bump();
m.complete(p, TYPE_PARAM);
//TODO: bounds
}
}
fn where_clause(_: &mut Parser) {} fn where_clause(_: &mut Parser) {}

View file

@ -7,7 +7,7 @@ pub(super) fn struct_item(p: &mut Parser) {
if !p.expect(IDENT) { if !p.expect(IDENT) {
return; return;
} }
generic_parameters(p); type_param_list(p);
match p.current() { match p.current() {
WHERE_KW => { WHERE_KW => {
where_clause(p); where_clause(p);

View file

@ -90,6 +90,9 @@ pub enum SyntaxKind {
LITERAL, LITERAL,
ALIAS, ALIAS,
VISIBILITY, VISIBILITY,
TYPE_PARAM_LIST,
LIFETIME_PARAM,
TYPE_PARAM,
// Technical SyntaxKinds: they appear temporally during parsing, // Technical SyntaxKinds: they appear temporally during parsing,
// but never end up in the final tree // but never end up in the final tree
@ -187,6 +190,9 @@ impl SyntaxKind {
LITERAL => &SyntaxInfo { name: "LITERAL" }, LITERAL => &SyntaxInfo { name: "LITERAL" },
ALIAS => &SyntaxInfo { name: "ALIAS" }, ALIAS => &SyntaxInfo { name: "ALIAS" },
VISIBILITY => &SyntaxInfo { name: "VISIBILITY" }, VISIBILITY => &SyntaxInfo { name: "VISIBILITY" },
TYPE_PARAM_LIST => &SyntaxInfo { name: "TYPE_PARAM_LIST" },
LIFETIME_PARAM => &SyntaxInfo { name: "LIFETIME_PARAM" },
TYPE_PARAM => &SyntaxInfo { name: "TYPE_PARAM" },
TOMBSTONE => &SyntaxInfo { name: "TOMBSTONE" }, TOMBSTONE => &SyntaxInfo { name: "TOMBSTONE" },
EOF => &SyntaxInfo { name: "EOF" }, EOF => &SyntaxInfo { name: "EOF" },

View file

@ -0,0 +1,17 @@
struct S1<T>;
struct S2<T>(u32);
struct S3<T> { u: u32 }
struct S4<>;
struct S5<'a>;
struct S6<'a:>;
struct S7<'a: 'b>;
struct S8<'a: 'b + >;
struct S9<'a: 'b + 'c>;
struct S10<'a,>;
struct S11<'a, 'b>;
struct S12<'a: 'b+, 'b: 'c,>;
struct S13<T>;
struct S14<T, U>;
struct S15<'a, T, U>;

View file

@ -0,0 +1,223 @@
FILE@[0; 290)
STRUCT_ITEM@[0; 14)
STRUCT_KW@[0; 6)
WHITESPACE@[6; 7)
IDENT@[7; 9)
TYPE_PARAM_LIST@[9; 12)
L_ANGLE@[9; 10)
TYPE_PARAM@[10; 11)
IDENT@[10; 11)
R_ANGLE@[11; 12)
SEMI@[12; 13)
WHITESPACE@[13; 14)
STRUCT_ITEM@[14; 33)
STRUCT_KW@[14; 20)
WHITESPACE@[20; 21)
IDENT@[21; 23)
TYPE_PARAM_LIST@[23; 26)
L_ANGLE@[23; 24)
TYPE_PARAM@[24; 25)
IDENT@[24; 25)
R_ANGLE@[25; 26)
L_PAREN@[26; 27)
POS_FIELD@[27; 30)
IDENT@[27; 30)
R_PAREN@[30; 31)
SEMI@[31; 32)
WHITESPACE@[32; 33)
STRUCT_ITEM@[33; 58)
STRUCT_KW@[33; 39)
WHITESPACE@[39; 40)
IDENT@[40; 42)
TYPE_PARAM_LIST@[42; 46)
L_ANGLE@[42; 43)
TYPE_PARAM@[43; 44)
IDENT@[43; 44)
R_ANGLE@[44; 45)
WHITESPACE@[45; 46)
L_CURLY@[46; 47)
NAMED_FIELD@[47; 55)
WHITESPACE@[47; 48)
IDENT@[48; 49)
COLON@[49; 50)
WHITESPACE@[50; 51)
IDENT@[51; 54)
WHITESPACE@[54; 55)
R_CURLY@[55; 56)
WHITESPACE@[56; 58)
STRUCT_ITEM@[58; 71)
STRUCT_KW@[58; 64)
WHITESPACE@[64; 65)
IDENT@[65; 67)
TYPE_PARAM_LIST@[67; 69)
L_ANGLE@[67; 68)
R_ANGLE@[68; 69)
SEMI@[69; 70)
WHITESPACE@[70; 71)
STRUCT_ITEM@[71; 86)
STRUCT_KW@[71; 77)
WHITESPACE@[77; 78)
IDENT@[78; 80)
TYPE_PARAM_LIST@[80; 84)
L_ANGLE@[80; 81)
LIFETIME_PARAM@[81; 83)
LIFETIME@[81; 83)
R_ANGLE@[83; 84)
SEMI@[84; 85)
WHITESPACE@[85; 86)
STRUCT_ITEM@[86; 102)
STRUCT_KW@[86; 92)
WHITESPACE@[92; 93)
IDENT@[93; 95)
TYPE_PARAM_LIST@[95; 100)
L_ANGLE@[95; 96)
LIFETIME_PARAM@[96; 99)
LIFETIME@[96; 98)
COLON@[98; 99)
R_ANGLE@[99; 100)
SEMI@[100; 101)
WHITESPACE@[101; 102)
STRUCT_ITEM@[102; 121)
STRUCT_KW@[102; 108)
WHITESPACE@[108; 109)
IDENT@[109; 111)
TYPE_PARAM_LIST@[111; 119)
L_ANGLE@[111; 112)
LIFETIME_PARAM@[112; 118)
LIFETIME@[112; 114)
COLON@[114; 115)
WHITESPACE@[115; 116)
LIFETIME@[116; 118)
R_ANGLE@[118; 119)
SEMI@[119; 120)
WHITESPACE@[120; 121)
STRUCT_ITEM@[121; 143)
STRUCT_KW@[121; 127)
WHITESPACE@[127; 128)
IDENT@[128; 130)
TYPE_PARAM_LIST@[130; 141)
L_ANGLE@[130; 131)
LIFETIME_PARAM@[131; 140)
LIFETIME@[131; 133)
COLON@[133; 134)
WHITESPACE@[134; 135)
LIFETIME@[135; 137)
WHITESPACE@[137; 138)
PLUS@[138; 139)
WHITESPACE@[139; 140)
R_ANGLE@[140; 141)
SEMI@[141; 142)
WHITESPACE@[142; 143)
STRUCT_ITEM@[143; 167)
STRUCT_KW@[143; 149)
WHITESPACE@[149; 150)
IDENT@[150; 152)
TYPE_PARAM_LIST@[152; 165)
L_ANGLE@[152; 153)
LIFETIME_PARAM@[153; 164)
LIFETIME@[153; 155)
COLON@[155; 156)
WHITESPACE@[156; 157)
LIFETIME@[157; 159)
WHITESPACE@[159; 160)
PLUS@[160; 161)
WHITESPACE@[161; 162)
LIFETIME@[162; 164)
R_ANGLE@[164; 165)
SEMI@[165; 166)
WHITESPACE@[166; 167)
STRUCT_ITEM@[167; 184)
STRUCT_KW@[167; 173)
WHITESPACE@[173; 174)
IDENT@[174; 177)
TYPE_PARAM_LIST@[177; 182)
L_ANGLE@[177; 178)
LIFETIME_PARAM@[178; 180)
LIFETIME@[178; 180)
COMMA@[180; 181)
R_ANGLE@[181; 182)
SEMI@[182; 183)
WHITESPACE@[183; 184)
STRUCT_ITEM@[184; 204)
STRUCT_KW@[184; 190)
WHITESPACE@[190; 191)
IDENT@[191; 194)
TYPE_PARAM_LIST@[194; 202)
L_ANGLE@[194; 195)
LIFETIME_PARAM@[195; 197)
LIFETIME@[195; 197)
COMMA@[197; 198)
LIFETIME_PARAM@[198; 201)
WHITESPACE@[198; 199)
LIFETIME@[199; 201)
R_ANGLE@[201; 202)
SEMI@[202; 203)
WHITESPACE@[203; 204)
STRUCT_ITEM@[204; 235)
STRUCT_KW@[204; 210)
WHITESPACE@[210; 211)
IDENT@[211; 214)
TYPE_PARAM_LIST@[214; 232)
L_ANGLE@[214; 215)
LIFETIME_PARAM@[215; 222)
LIFETIME@[215; 217)
COLON@[217; 218)
WHITESPACE@[218; 219)
LIFETIME@[219; 221)
PLUS@[221; 222)
COMMA@[222; 223)
LIFETIME_PARAM@[223; 230)
WHITESPACE@[223; 224)
LIFETIME@[224; 226)
COLON@[226; 227)
WHITESPACE@[227; 228)
LIFETIME@[228; 230)
COMMA@[230; 231)
R_ANGLE@[231; 232)
SEMI@[232; 233)
WHITESPACE@[233; 235)
STRUCT_ITEM@[235; 250)
STRUCT_KW@[235; 241)
WHITESPACE@[241; 242)
IDENT@[242; 245)
TYPE_PARAM_LIST@[245; 248)
L_ANGLE@[245; 246)
TYPE_PARAM@[246; 247)
IDENT@[246; 247)
R_ANGLE@[247; 248)
SEMI@[248; 249)
WHITESPACE@[249; 250)
STRUCT_ITEM@[250; 268)
STRUCT_KW@[250; 256)
WHITESPACE@[256; 257)
IDENT@[257; 260)
TYPE_PARAM_LIST@[260; 266)
L_ANGLE@[260; 261)
TYPE_PARAM@[261; 262)
IDENT@[261; 262)
COMMA@[262; 263)
TYPE_PARAM@[263; 265)
WHITESPACE@[263; 264)
IDENT@[264; 265)
R_ANGLE@[265; 266)
SEMI@[266; 267)
WHITESPACE@[267; 268)
STRUCT_ITEM@[268; 290)
STRUCT_KW@[268; 274)
WHITESPACE@[274; 275)
IDENT@[275; 278)
TYPE_PARAM_LIST@[278; 288)
L_ANGLE@[278; 279)
LIFETIME_PARAM@[279; 281)
LIFETIME@[279; 281)
COMMA@[281; 282)
TYPE_PARAM@[282; 284)
WHITESPACE@[282; 283)
IDENT@[283; 284)
COMMA@[284; 285)
TYPE_PARAM@[285; 287)
WHITESPACE@[285; 286)
IDENT@[286; 287)
R_ANGLE@[287; 288)
SEMI@[288; 289)
WHITESPACE@[289; 290)