mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-25 20:43:21 +00:00
Generic params in structs
This commit is contained in:
parent
7e55b2693f
commit
8ca02acb5a
6 changed files with 294 additions and 3 deletions
|
@ -88,5 +88,8 @@ Grammar(
|
||||||
"LITERAL",
|
"LITERAL",
|
||||||
"ALIAS",
|
"ALIAS",
|
||||||
"VISIBILITY",
|
"VISIBILITY",
|
||||||
|
"TYPE_PARAM_LIST",
|
||||||
|
"LIFETIME_PARAM",
|
||||||
|
"TYPE_PARAM",
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
|
@ -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) {}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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" },
|
||||||
|
|
17
tests/data/parser/ok/0018_struct_type_params.rs
Normal file
17
tests/data/parser/ok/0018_struct_type_params.rs
Normal 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>;
|
223
tests/data/parser/ok/0018_struct_type_params.txt
Normal file
223
tests/data/parser/ok/0018_struct_type_params.txt
Normal 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)
|
Loading…
Reference in a new issue