mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-13 05:38:46 +00:00
Fix block structure in enums
This commit is contained in:
parent
749907d330
commit
f48b9d9be7
5 changed files with 274 additions and 25 deletions
|
@ -1,11 +1,11 @@
|
|||
|
||||
mod consts;
|
||||
mod structs;
|
||||
mod nominal;
|
||||
mod traits;
|
||||
mod use_item;
|
||||
|
||||
use super::*;
|
||||
pub(crate) use self::structs::named_field_def_list;
|
||||
pub(crate) use self::nominal::named_field_def_list;
|
||||
|
||||
// test mod_contents
|
||||
// fn foo() {}
|
||||
|
@ -176,7 +176,7 @@ fn items_without_modifiers(p: &mut Parser) -> Option<SyntaxKind> {
|
|||
MODULE
|
||||
}
|
||||
STRUCT_KW => {
|
||||
structs::struct_def(p);
|
||||
nominal::struct_def(p);
|
||||
if p.at(SEMI) {
|
||||
p.err_and_bump(
|
||||
"expected item, found `;`\n\
|
||||
|
@ -186,7 +186,7 @@ fn items_without_modifiers(p: &mut Parser) -> Option<SyntaxKind> {
|
|||
STRUCT_DEF
|
||||
}
|
||||
ENUM_KW => {
|
||||
structs::enum_def(p);
|
||||
nominal::enum_def(p);
|
||||
ENUM_DEF
|
||||
}
|
||||
USE_KW => {
|
||||
|
|
|
@ -91,6 +91,10 @@ pub(crate) fn named_field_def_list(p: &mut Parser) {
|
|||
let m = p.start();
|
||||
p.bump();
|
||||
while !p.at(R_CURLY) && !p.at(EOF) {
|
||||
if p.at(L_CURLY) {
|
||||
error_block(p, "expected field");
|
||||
continue;
|
||||
}
|
||||
named_field_def(p);
|
||||
if !p.at(R_CURLY) {
|
||||
p.expect(COMMA);
|
||||
|
@ -127,10 +131,15 @@ fn pos_field_list(p: &mut Parser) {
|
|||
return;
|
||||
}
|
||||
while !p.at(R_PAREN) && !p.at(EOF) {
|
||||
let pos_field = p.start();
|
||||
let m = p.start();
|
||||
opt_visibility(p);
|
||||
if !p.at_ts(types::TYPE_FIRST) {
|
||||
p.error("expected a type");
|
||||
m.complete(p, ERROR);
|
||||
break;
|
||||
}
|
||||
types::type_(p);
|
||||
pos_field.complete(p, POS_FIELD);
|
||||
m.complete(p, POS_FIELD);
|
||||
|
||||
if !p.at(R_PAREN) {
|
||||
p.expect(COMMA);
|
|
@ -1,5 +1,5 @@
|
|||
ROOT@[0; 86)
|
||||
STRUCT_DEF@[0; 84)
|
||||
STRUCT_DEF@[0; 72)
|
||||
VISIBILITY@[0; 3)
|
||||
PUB_KW@[0; 3)
|
||||
WHITESPACE@[3; 4)
|
||||
|
@ -7,7 +7,7 @@ ROOT@[0; 86)
|
|||
WHITESPACE@[10; 11)
|
||||
NAME@[11; 16)
|
||||
IDENT@[11; 16) "Cache"
|
||||
POS_FIELD_LIST@[16; 83)
|
||||
POS_FIELD_LIST@[16; 72)
|
||||
L_PAREN@[16; 17)
|
||||
WHITESPACE@[17; 22)
|
||||
POS_FIELD@[22; 68)
|
||||
|
@ -62,22 +62,28 @@ ROOT@[0; 86)
|
|||
NAME_REF@[69; 72)
|
||||
IDENT@[69; 72) "Any"
|
||||
err: `expected COMMA`
|
||||
err: `expected type`
|
||||
POS_FIELD@[72; 73)
|
||||
ERROR@[72; 73)
|
||||
R_ANGLE@[72; 73)
|
||||
COMMA@[73; 74)
|
||||
WHITESPACE@[74; 79)
|
||||
err: `expected type`
|
||||
POS_FIELD@[79; 80)
|
||||
ERROR@[79; 80)
|
||||
R_ANGLE@[79; 80)
|
||||
err: `expected COMMA`
|
||||
err: `expected type`
|
||||
POS_FIELD@[80; 81)
|
||||
ERROR@[80; 81)
|
||||
R_ANGLE@[80; 81)
|
||||
WHITESPACE@[81; 82)
|
||||
R_PAREN@[82; 83)
|
||||
err: `expected a type`
|
||||
err: `expected R_PAREN`
|
||||
err: `expected SEMI`
|
||||
err: `expected an item`
|
||||
ERROR@[72; 72)
|
||||
ERROR@[72; 73)
|
||||
R_ANGLE@[72; 73)
|
||||
err: `expected an item`
|
||||
ERROR@[73; 74)
|
||||
COMMA@[73; 74)
|
||||
WHITESPACE@[74; 79)
|
||||
err: `expected an item`
|
||||
ERROR@[79; 80)
|
||||
R_ANGLE@[79; 80)
|
||||
err: `expected an item`
|
||||
ERROR@[80; 81)
|
||||
R_ANGLE@[80; 81)
|
||||
WHITESPACE@[81; 82)
|
||||
err: `expected an item`
|
||||
ERROR@[82; 83)
|
||||
R_PAREN@[82; 83)
|
||||
err: `expected an item`
|
||||
ERROR@[83; 84)
|
||||
SEMI@[83; 84)
|
||||
WHITESPACE@[84; 86)
|
||||
|
|
31
crates/libsyntax2/tests/data/parser/err/0025_nope.rs
Normal file
31
crates/libsyntax2/tests/data/parser/err/0025_nope.rs
Normal file
|
@ -0,0 +1,31 @@
|
|||
fn main() {
|
||||
enum Test {
|
||||
Var1,
|
||||
Var2(String),
|
||||
Var3 {
|
||||
abc: {}, //~ ERROR: expected type, found `{`
|
||||
},
|
||||
}
|
||||
|
||||
// recover...
|
||||
let a = 1;
|
||||
enum Test2 {
|
||||
Fine,
|
||||
}
|
||||
|
||||
enum Test3 {
|
||||
StillFine {
|
||||
def: i32,
|
||||
},
|
||||
}
|
||||
|
||||
{
|
||||
// fail again
|
||||
enum Test4 {
|
||||
Nope(i32 {}) //~ ERROR: found `{`
|
||||
//~^ ERROR: found `{`
|
||||
}
|
||||
}
|
||||
// still recover later
|
||||
let bad_syntax = _; //~ ERROR: expected expression, found reserved identifier `_`
|
||||
}
|
203
crates/libsyntax2/tests/data/parser/err/0025_nope.txt
Normal file
203
crates/libsyntax2/tests/data/parser/err/0025_nope.txt
Normal file
|
@ -0,0 +1,203 @@
|
|||
ROOT@[0; 575)
|
||||
FN_DEF@[0; 574)
|
||||
FN_KW@[0; 2)
|
||||
WHITESPACE@[2; 3)
|
||||
NAME@[3; 7)
|
||||
IDENT@[3; 7) "main"
|
||||
PARAM_LIST@[7; 9)
|
||||
L_PAREN@[7; 8)
|
||||
R_PAREN@[8; 9)
|
||||
WHITESPACE@[9; 10)
|
||||
BLOCK@[10; 574)
|
||||
L_CURLY@[10; 11)
|
||||
WHITESPACE@[11; 16)
|
||||
ENUM_DEF@[16; 152)
|
||||
ENUM_KW@[16; 20)
|
||||
WHITESPACE@[20; 21)
|
||||
NAME@[21; 25)
|
||||
IDENT@[21; 25) "Test"
|
||||
WHITESPACE@[25; 26)
|
||||
ENUM_VARIANT_LIST@[26; 152)
|
||||
L_CURLY@[26; 27)
|
||||
WHITESPACE@[27; 36)
|
||||
ENUM_VARIANT@[36; 40)
|
||||
NAME@[36; 40)
|
||||
IDENT@[36; 40) "Var1"
|
||||
COMMA@[40; 41)
|
||||
WHITESPACE@[41; 50)
|
||||
ENUM_VARIANT@[50; 62)
|
||||
NAME@[50; 54)
|
||||
IDENT@[50; 54) "Var2"
|
||||
POS_FIELD_LIST@[54; 62)
|
||||
L_PAREN@[54; 55)
|
||||
POS_FIELD@[55; 61)
|
||||
PATH_TYPE@[55; 61)
|
||||
PATH@[55; 61)
|
||||
PATH_SEGMENT@[55; 61)
|
||||
NAME_REF@[55; 61)
|
||||
IDENT@[55; 61) "String"
|
||||
R_PAREN@[61; 62)
|
||||
COMMA@[62; 63)
|
||||
WHITESPACE@[63; 72)
|
||||
ENUM_VARIANT@[72; 145)
|
||||
NAME@[72; 76)
|
||||
IDENT@[72; 76) "Var3"
|
||||
WHITESPACE@[76; 77)
|
||||
NAMED_FIELD_DEF_LIST@[77; 145)
|
||||
L_CURLY@[77; 78)
|
||||
WHITESPACE@[78; 91)
|
||||
NAMED_FIELD_DEF@[91; 95)
|
||||
NAME@[91; 94)
|
||||
IDENT@[91; 94) "abc"
|
||||
COLON@[94; 95)
|
||||
err: `expected type`
|
||||
err: `expected COMMA`
|
||||
WHITESPACE@[95; 96)
|
||||
err: `expected field`
|
||||
ERROR@[96; 98)
|
||||
L_CURLY@[96; 97)
|
||||
R_CURLY@[97; 98)
|
||||
err: `expected field declaration`
|
||||
ERROR@[98; 99)
|
||||
COMMA@[98; 99)
|
||||
WHITESPACE@[99; 100)
|
||||
COMMENT@[100; 135)
|
||||
WHITESPACE@[135; 144)
|
||||
R_CURLY@[144; 145)
|
||||
COMMA@[145; 146)
|
||||
WHITESPACE@[146; 151)
|
||||
R_CURLY@[151; 152)
|
||||
WHITESPACE@[152; 158)
|
||||
COMMENT@[158; 171)
|
||||
WHITESPACE@[171; 176)
|
||||
LET_STMT@[176; 186)
|
||||
LET_KW@[176; 179)
|
||||
WHITESPACE@[179; 180)
|
||||
BIND_PAT@[180; 181)
|
||||
NAME@[180; 181)
|
||||
IDENT@[180; 181) "a"
|
||||
WHITESPACE@[181; 182)
|
||||
EQ@[182; 183)
|
||||
WHITESPACE@[183; 184)
|
||||
LITERAL@[184; 185)
|
||||
INT_NUMBER@[184; 185) "1"
|
||||
SEMI@[185; 186)
|
||||
WHITESPACE@[186; 191)
|
||||
ENUM_DEF@[191; 223)
|
||||
ENUM_KW@[191; 195)
|
||||
WHITESPACE@[195; 196)
|
||||
NAME@[196; 201)
|
||||
IDENT@[196; 201) "Test2"
|
||||
WHITESPACE@[201; 202)
|
||||
ENUM_VARIANT_LIST@[202; 223)
|
||||
L_CURLY@[202; 203)
|
||||
WHITESPACE@[203; 212)
|
||||
ENUM_VARIANT@[212; 216)
|
||||
NAME@[212; 216)
|
||||
IDENT@[212; 216) "Fine"
|
||||
COMMA@[216; 217)
|
||||
WHITESPACE@[217; 222)
|
||||
R_CURLY@[222; 223)
|
||||
WHITESPACE@[223; 229)
|
||||
ENUM_DEF@[229; 300)
|
||||
ENUM_KW@[229; 233)
|
||||
WHITESPACE@[233; 234)
|
||||
NAME@[234; 239)
|
||||
IDENT@[234; 239) "Test3"
|
||||
WHITESPACE@[239; 240)
|
||||
ENUM_VARIANT_LIST@[240; 300)
|
||||
L_CURLY@[240; 241)
|
||||
WHITESPACE@[241; 250)
|
||||
ENUM_VARIANT@[250; 293)
|
||||
NAME@[250; 259)
|
||||
IDENT@[250; 259) "StillFine"
|
||||
WHITESPACE@[259; 260)
|
||||
NAMED_FIELD_DEF_LIST@[260; 293)
|
||||
L_CURLY@[260; 261)
|
||||
WHITESPACE@[261; 274)
|
||||
NAMED_FIELD_DEF@[274; 282)
|
||||
NAME@[274; 277)
|
||||
IDENT@[274; 277) "def"
|
||||
COLON@[277; 278)
|
||||
WHITESPACE@[278; 279)
|
||||
PATH_TYPE@[279; 282)
|
||||
PATH@[279; 282)
|
||||
PATH_SEGMENT@[279; 282)
|
||||
NAME_REF@[279; 282)
|
||||
IDENT@[279; 282) "i32"
|
||||
COMMA@[282; 283)
|
||||
WHITESPACE@[283; 292)
|
||||
R_CURLY@[292; 293)
|
||||
COMMA@[293; 294)
|
||||
WHITESPACE@[294; 299)
|
||||
R_CURLY@[299; 300)
|
||||
WHITESPACE@[300; 306)
|
||||
EXPR_STMT@[306; 459)
|
||||
BLOCK_EXPR@[306; 459)
|
||||
BLOCK@[306; 459)
|
||||
L_CURLY@[306; 307)
|
||||
WHITESPACE@[307; 316)
|
||||
COMMENT@[316; 329)
|
||||
WHITESPACE@[329; 338)
|
||||
ENUM_DEF@[338; 453)
|
||||
ENUM_KW@[338; 342)
|
||||
WHITESPACE@[342; 343)
|
||||
NAME@[343; 348)
|
||||
IDENT@[343; 348) "Test4"
|
||||
WHITESPACE@[348; 349)
|
||||
ENUM_VARIANT_LIST@[349; 453)
|
||||
L_CURLY@[349; 350)
|
||||
WHITESPACE@[350; 363)
|
||||
ENUM_VARIANT@[363; 372)
|
||||
NAME@[363; 367)
|
||||
IDENT@[363; 367) "Nope"
|
||||
POS_FIELD_LIST@[367; 372)
|
||||
L_PAREN@[367; 368)
|
||||
POS_FIELD@[368; 371)
|
||||
PATH_TYPE@[368; 371)
|
||||
PATH@[368; 371)
|
||||
PATH_SEGMENT@[368; 371)
|
||||
NAME_REF@[368; 371)
|
||||
IDENT@[368; 371) "i32"
|
||||
err: `expected COMMA`
|
||||
WHITESPACE@[371; 372)
|
||||
err: `expected a type`
|
||||
err: `expected R_PAREN`
|
||||
err: `expected COMMA`
|
||||
err: `expected enum variant`
|
||||
ERROR@[372; 372)
|
||||
ERROR@[372; 374)
|
||||
L_CURLY@[372; 373)
|
||||
R_CURLY@[373; 374)
|
||||
err: `expected enum variant`
|
||||
ERROR@[374; 375)
|
||||
R_PAREN@[374; 375)
|
||||
WHITESPACE@[375; 376)
|
||||
COMMENT@[376; 396)
|
||||
WHITESPACE@[396; 422)
|
||||
COMMENT@[422; 443)
|
||||
WHITESPACE@[443; 452)
|
||||
R_CURLY@[452; 453)
|
||||
WHITESPACE@[453; 458)
|
||||
R_CURLY@[458; 459)
|
||||
WHITESPACE@[459; 464)
|
||||
COMMENT@[464; 486)
|
||||
WHITESPACE@[486; 491)
|
||||
LET_STMT@[491; 510)
|
||||
LET_KW@[491; 494)
|
||||
WHITESPACE@[494; 495)
|
||||
BIND_PAT@[495; 505)
|
||||
NAME@[495; 505)
|
||||
IDENT@[495; 505) "bad_syntax"
|
||||
WHITESPACE@[505; 506)
|
||||
EQ@[506; 507)
|
||||
WHITESPACE@[507; 508)
|
||||
err: `expected expression`
|
||||
ERROR@[508; 509)
|
||||
UNDERSCORE@[508; 509)
|
||||
SEMI@[509; 510)
|
||||
WHITESPACE@[510; 511)
|
||||
COMMENT@[511; 572)
|
||||
WHITESPACE@[572; 573)
|
||||
R_CURLY@[573; 574)
|
||||
WHITESPACE@[574; 575)
|
Loading…
Reference in a new issue