Enable parsing of attributes inside a match block

We allow invalid inner attributes to be parsed, e.g. inner attributes that are
not directly after the opening brace of the match block.

Instead we run validation on `MatchArmList` to allow better reporting of errors.
This commit is contained in:
Ville Penttinen 2019-02-17 19:08:34 +02:00
parent 982f72c022
commit 1c97c1ac11
16 changed files with 589 additions and 1 deletions

View file

@ -0,0 +1,20 @@
fn foo() {
match () {
_ => (),
#![doc("Not allowed here")]
_ => (),
}
match () {
_ => (),
_ => (),
#![doc("Nor here")]
}
match () {
#[cfg(test)]
#![doc("Nor here")]
_ => (),
_ => (),
}
}

View file

@ -0,0 +1,173 @@
SOURCE_FILE@[0; 293)
FN_DEF@[0; 292)
FN_KW@[0; 2)
WHITESPACE@[2; 3)
NAME@[3; 6)
IDENT@[3; 6) "foo"
PARAM_LIST@[6; 8)
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
BLOCK@[9; 292)
L_CURLY@[9; 10)
WHITESPACE@[10; 15)
EXPR_STMT@[15; 101)
MATCH_EXPR@[15; 101)
MATCH_KW@[15; 20)
WHITESPACE@[20; 21)
TUPLE_EXPR@[21; 23)
L_PAREN@[21; 22)
R_PAREN@[22; 23)
WHITESPACE@[23; 24)
MATCH_ARM_LIST@[24; 101)
L_CURLY@[24; 25)
WHITESPACE@[25; 34)
MATCH_ARM@[34; 41)
PLACEHOLDER_PAT@[34; 35)
UNDERSCORE@[34; 35)
WHITESPACE@[35; 36)
FAT_ARROW@[36; 38)
WHITESPACE@[38; 39)
TUPLE_EXPR@[39; 41)
L_PAREN@[39; 40)
R_PAREN@[40; 41)
COMMA@[41; 42)
WHITESPACE@[42; 51)
err: `Inner attributes are only allowed directly after the opening brace of the match expression`
ATTR@[51; 78)
POUND@[51; 52)
EXCL@[52; 53)
TOKEN_TREE@[53; 78)
L_BRACK@[53; 54)
IDENT@[54; 57) "doc"
TOKEN_TREE@[57; 77)
L_PAREN@[57; 58)
STRING@[58; 76)
R_PAREN@[76; 77)
R_BRACK@[77; 78)
WHITESPACE@[78; 87)
MATCH_ARM@[87; 94)
PLACEHOLDER_PAT@[87; 88)
UNDERSCORE@[87; 88)
WHITESPACE@[88; 89)
FAT_ARROW@[89; 91)
WHITESPACE@[91; 92)
TUPLE_EXPR@[92; 94)
L_PAREN@[92; 93)
R_PAREN@[93; 94)
COMMA@[94; 95)
WHITESPACE@[95; 100)
R_CURLY@[100; 101)
WHITESPACE@[101; 107)
EXPR_STMT@[107; 185)
MATCH_EXPR@[107; 185)
MATCH_KW@[107; 112)
WHITESPACE@[112; 113)
TUPLE_EXPR@[113; 115)
L_PAREN@[113; 114)
R_PAREN@[114; 115)
WHITESPACE@[115; 116)
MATCH_ARM_LIST@[116; 185)
L_CURLY@[116; 117)
WHITESPACE@[117; 126)
MATCH_ARM@[126; 133)
PLACEHOLDER_PAT@[126; 127)
UNDERSCORE@[126; 127)
WHITESPACE@[127; 128)
FAT_ARROW@[128; 130)
WHITESPACE@[130; 131)
TUPLE_EXPR@[131; 133)
L_PAREN@[131; 132)
R_PAREN@[132; 133)
COMMA@[133; 134)
WHITESPACE@[134; 143)
MATCH_ARM@[143; 150)
PLACEHOLDER_PAT@[143; 144)
UNDERSCORE@[143; 144)
WHITESPACE@[144; 145)
FAT_ARROW@[145; 147)
WHITESPACE@[147; 148)
TUPLE_EXPR@[148; 150)
L_PAREN@[148; 149)
R_PAREN@[149; 150)
COMMA@[150; 151)
WHITESPACE@[151; 160)
err: `Inner attributes are only allowed directly after the opening brace of the match expression`
ATTR@[160; 179)
POUND@[160; 161)
EXCL@[161; 162)
TOKEN_TREE@[162; 179)
L_BRACK@[162; 163)
IDENT@[163; 166) "doc"
TOKEN_TREE@[166; 178)
L_PAREN@[166; 167)
STRING@[167; 177)
R_PAREN@[177; 178)
R_BRACK@[178; 179)
WHITESPACE@[179; 184)
err: `expected pattern`
err: `expected FAT_ARROW`
err: `expected expression`
MATCH_ARM@[184; 184)
R_CURLY@[184; 185)
WHITESPACE@[185; 191)
MATCH_EXPR@[191; 290)
MATCH_KW@[191; 196)
WHITESPACE@[196; 197)
TUPLE_EXPR@[197; 199)
L_PAREN@[197; 198)
R_PAREN@[198; 199)
WHITESPACE@[199; 200)
MATCH_ARM_LIST@[200; 290)
L_CURLY@[200; 201)
WHITESPACE@[201; 210)
ATTR@[210; 222)
POUND@[210; 211)
TOKEN_TREE@[211; 222)
L_BRACK@[211; 212)
IDENT@[212; 215) "cfg"
TOKEN_TREE@[215; 221)
L_PAREN@[215; 216)
IDENT@[216; 220) "test"
R_PAREN@[220; 221)
R_BRACK@[221; 222)
WHITESPACE@[222; 231)
err: `Inner attributes are only allowed directly after the opening brace of the match expression`
ATTR@[231; 250)
POUND@[231; 232)
EXCL@[232; 233)
TOKEN_TREE@[233; 250)
L_BRACK@[233; 234)
IDENT@[234; 237) "doc"
TOKEN_TREE@[237; 249)
L_PAREN@[237; 238)
STRING@[238; 248)
R_PAREN@[248; 249)
R_BRACK@[249; 250)
WHITESPACE@[250; 259)
MATCH_ARM@[259; 266)
PLACEHOLDER_PAT@[259; 260)
UNDERSCORE@[259; 260)
WHITESPACE@[260; 261)
FAT_ARROW@[261; 263)
WHITESPACE@[263; 264)
TUPLE_EXPR@[264; 266)
L_PAREN@[264; 265)
R_PAREN@[265; 266)
COMMA@[266; 267)
WHITESPACE@[267; 276)
MATCH_ARM@[276; 283)
PLACEHOLDER_PAT@[276; 277)
UNDERSCORE@[276; 277)
WHITESPACE@[277; 278)
FAT_ARROW@[278; 280)
WHITESPACE@[280; 281)
TUPLE_EXPR@[281; 283)
L_PAREN@[281; 282)
R_PAREN@[282; 283)
COMMA@[283; 284)
WHITESPACE@[284; 289)
R_CURLY@[289; 290)
WHITESPACE@[290; 291)
R_CURLY@[291; 292)
WHITESPACE@[292; 293)

View file

@ -0,0 +1,7 @@
fn foo() {
match () {
_ => (),
_ => (),
#[cfg(test)]
}
}

View file

@ -0,0 +1,64 @@
SOURCE_FILE@[0; 89)
FN_DEF@[0; 88)
FN_KW@[0; 2)
WHITESPACE@[2; 3)
NAME@[3; 6)
IDENT@[3; 6) "foo"
PARAM_LIST@[6; 8)
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
BLOCK@[9; 88)
L_CURLY@[9; 10)
WHITESPACE@[10; 15)
MATCH_EXPR@[15; 86)
MATCH_KW@[15; 20)
WHITESPACE@[20; 21)
TUPLE_EXPR@[21; 23)
L_PAREN@[21; 22)
R_PAREN@[22; 23)
WHITESPACE@[23; 24)
MATCH_ARM_LIST@[24; 86)
L_CURLY@[24; 25)
WHITESPACE@[25; 34)
MATCH_ARM@[34; 41)
PLACEHOLDER_PAT@[34; 35)
UNDERSCORE@[34; 35)
WHITESPACE@[35; 36)
FAT_ARROW@[36; 38)
WHITESPACE@[38; 39)
TUPLE_EXPR@[39; 41)
L_PAREN@[39; 40)
R_PAREN@[40; 41)
COMMA@[41; 42)
WHITESPACE@[42; 51)
MATCH_ARM@[51; 58)
PLACEHOLDER_PAT@[51; 52)
UNDERSCORE@[51; 52)
WHITESPACE@[52; 53)
FAT_ARROW@[53; 55)
WHITESPACE@[55; 56)
TUPLE_EXPR@[56; 58)
L_PAREN@[56; 57)
R_PAREN@[57; 58)
COMMA@[58; 59)
WHITESPACE@[59; 68)
ATTR@[68; 80)
POUND@[68; 69)
TOKEN_TREE@[69; 80)
L_BRACK@[69; 70)
IDENT@[70; 73) "cfg"
TOKEN_TREE@[73; 79)
L_PAREN@[73; 74)
IDENT@[74; 78) "test"
R_PAREN@[78; 79)
R_BRACK@[79; 80)
WHITESPACE@[80; 85)
err: `expected pattern`
err: `expected FAT_ARROW`
err: `expected expression`
MATCH_ARM@[85; 85)
R_CURLY@[85; 86)
WHITESPACE@[86; 87)
R_CURLY@[87; 88)
WHITESPACE@[88; 89)