From 8ca02acb5a574c312dcb3842904b99b282d45883 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 28 Jan 2018 18:53:53 +0300 Subject: Generic params in structs --- grammar.ron | 5 +- src/parser/event_parser/grammar/items/mod.rs | 44 ++++- src/parser/event_parser/grammar/items/structs.rs | 2 +- src/syntax_kinds.rs | 6 + tests/data/parser/ok/0018_struct_type_params.rs | 17 ++ tests/data/parser/ok/0018_struct_type_params.txt | 223 +++++++++++++++++++++++ 6 files changed, 294 insertions(+), 3 deletions(-) create mode 100644 tests/data/parser/ok/0018_struct_type_params.rs create mode 100644 tests/data/parser/ok/0018_struct_type_params.txt diff --git a/grammar.ron b/grammar.ron index 70e269e20..7c76d595d 100644 --- a/grammar.ron +++ b/grammar.ron @@ -88,5 +88,8 @@ Grammar( "LITERAL", "ALIAS", "VISIBILITY", + "TYPE_PARAM_LIST", + "LIFETIME_PARAM", + "TYPE_PARAM", ] -) \ No newline at end of file +) diff --git a/src/parser/event_parser/grammar/items/mod.rs b/src/parser/event_parser/grammar/items/mod.rs index 867776415..f10fb230b 100644 --- a/src/parser/event_parser/grammar/items/mod.rs +++ b/src/parser/event_parser/grammar/items/mod.rs @@ -59,7 +59,49 @@ fn item(p: &mut Parser) { 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) {} diff --git a/src/parser/event_parser/grammar/items/structs.rs b/src/parser/event_parser/grammar/items/structs.rs index b31cf18df..0934f3d28 100644 --- a/src/parser/event_parser/grammar/items/structs.rs +++ b/src/parser/event_parser/grammar/items/structs.rs @@ -7,7 +7,7 @@ pub(super) fn struct_item(p: &mut Parser) { if !p.expect(IDENT) { return; } - generic_parameters(p); + type_param_list(p); match p.current() { WHERE_KW => { where_clause(p); diff --git a/src/syntax_kinds.rs b/src/syntax_kinds.rs index 23a0881b7..b6c281cd5 100644 --- a/src/syntax_kinds.rs +++ b/src/syntax_kinds.rs @@ -90,6 +90,9 @@ pub enum SyntaxKind { LITERAL, ALIAS, VISIBILITY, + TYPE_PARAM_LIST, + LIFETIME_PARAM, + TYPE_PARAM, // Technical SyntaxKinds: they appear temporally during parsing, // but never end up in the final tree @@ -187,6 +190,9 @@ impl SyntaxKind { LITERAL => &SyntaxInfo { name: "LITERAL" }, ALIAS => &SyntaxInfo { name: "ALIAS" }, 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" }, EOF => &SyntaxInfo { name: "EOF" }, diff --git a/tests/data/parser/ok/0018_struct_type_params.rs b/tests/data/parser/ok/0018_struct_type_params.rs new file mode 100644 index 000000000..88c544923 --- /dev/null +++ b/tests/data/parser/ok/0018_struct_type_params.rs @@ -0,0 +1,17 @@ +struct S1; +struct S2(u32); +struct S3 { 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; +struct S14; +struct S15<'a, T, U>; diff --git a/tests/data/parser/ok/0018_struct_type_params.txt b/tests/data/parser/ok/0018_struct_type_params.txt new file mode 100644 index 000000000..b2e7ef9d7 --- /dev/null +++ b/tests/data/parser/ok/0018_struct_type_params.txt @@ -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) -- cgit v1.2.3