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,8 @@
fn foo() {
match () {
#![doc("Inner attribute")]
#![doc("Can be")]
#![doc("Stacked")]
_ => (),
}
}

View file

@ -0,0 +1,74 @@
SOURCE_FILE@[0; 139)
FN_DEF@[0; 138)
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; 138)
L_CURLY@[9; 10)
WHITESPACE@[10; 15)
MATCH_EXPR@[15; 136)
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; 136)
L_CURLY@[24; 25)
WHITESPACE@[25; 34)
ATTR@[34; 60)
POUND@[34; 35)
EXCL@[35; 36)
TOKEN_TREE@[36; 60)
L_BRACK@[36; 37)
IDENT@[37; 40) "doc"
TOKEN_TREE@[40; 59)
L_PAREN@[40; 41)
STRING@[41; 58)
R_PAREN@[58; 59)
R_BRACK@[59; 60)
WHITESPACE@[60; 69)
ATTR@[69; 86)
POUND@[69; 70)
EXCL@[70; 71)
TOKEN_TREE@[71; 86)
L_BRACK@[71; 72)
IDENT@[72; 75) "doc"
TOKEN_TREE@[75; 85)
L_PAREN@[75; 76)
STRING@[76; 84)
R_PAREN@[84; 85)
R_BRACK@[85; 86)
WHITESPACE@[86; 95)
ATTR@[95; 113)
POUND@[95; 96)
EXCL@[96; 97)
TOKEN_TREE@[97; 113)
L_BRACK@[97; 98)
IDENT@[98; 101) "doc"
TOKEN_TREE@[101; 112)
L_PAREN@[101; 102)
STRING@[102; 111)
R_PAREN@[111; 112)
R_BRACK@[112; 113)
WHITESPACE@[113; 122)
MATCH_ARM@[122; 129)
PLACEHOLDER_PAT@[122; 123)
UNDERSCORE@[122; 123)
WHITESPACE@[123; 124)
FAT_ARROW@[124; 126)
WHITESPACE@[126; 127)
TUPLE_EXPR@[127; 129)
L_PAREN@[127; 128)
R_PAREN@[128; 129)
COMMA@[129; 130)
WHITESPACE@[130; 135)
R_CURLY@[135; 136)
WHITESPACE@[136; 137)
R_CURLY@[137; 138)
WHITESPACE@[138; 139)

View file

@ -0,0 +1,12 @@
fn foo() {
match () {
#[cfg(feature = "some")]
_ => (),
#[cfg(feature = "other")]
_ => (),
#[cfg(feature = "many")]
#[cfg(feature = "attributes")]
#[cfg(feature = "before")]
_ => (),
}
}

View file

@ -0,0 +1,135 @@
SOURCE_FILE@[0; 259)
FN_DEF@[0; 258)
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; 258)
L_CURLY@[9; 10)
WHITESPACE@[10; 15)
MATCH_EXPR@[15; 256)
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; 256)
L_CURLY@[24; 25)
WHITESPACE@[25; 34)
ATTR@[34; 58)
POUND@[34; 35)
TOKEN_TREE@[35; 58)
L_BRACK@[35; 36)
IDENT@[36; 39) "cfg"
TOKEN_TREE@[39; 57)
L_PAREN@[39; 40)
IDENT@[40; 47) "feature"
WHITESPACE@[47; 48)
EQ@[48; 49)
WHITESPACE@[49; 50)
STRING@[50; 56)
R_PAREN@[56; 57)
R_BRACK@[57; 58)
WHITESPACE@[58; 67)
MATCH_ARM@[67; 74)
PLACEHOLDER_PAT@[67; 68)
UNDERSCORE@[67; 68)
WHITESPACE@[68; 69)
FAT_ARROW@[69; 71)
WHITESPACE@[71; 72)
TUPLE_EXPR@[72; 74)
L_PAREN@[72; 73)
R_PAREN@[73; 74)
COMMA@[74; 75)
WHITESPACE@[75; 84)
ATTR@[84; 109)
POUND@[84; 85)
TOKEN_TREE@[85; 109)
L_BRACK@[85; 86)
IDENT@[86; 89) "cfg"
TOKEN_TREE@[89; 108)
L_PAREN@[89; 90)
IDENT@[90; 97) "feature"
WHITESPACE@[97; 98)
EQ@[98; 99)
WHITESPACE@[99; 100)
STRING@[100; 107)
R_PAREN@[107; 108)
R_BRACK@[108; 109)
WHITESPACE@[109; 118)
MATCH_ARM@[118; 125)
PLACEHOLDER_PAT@[118; 119)
UNDERSCORE@[118; 119)
WHITESPACE@[119; 120)
FAT_ARROW@[120; 122)
WHITESPACE@[122; 123)
TUPLE_EXPR@[123; 125)
L_PAREN@[123; 124)
R_PAREN@[124; 125)
COMMA@[125; 126)
WHITESPACE@[126; 135)
ATTR@[135; 159)
POUND@[135; 136)
TOKEN_TREE@[136; 159)
L_BRACK@[136; 137)
IDENT@[137; 140) "cfg"
TOKEN_TREE@[140; 158)
L_PAREN@[140; 141)
IDENT@[141; 148) "feature"
WHITESPACE@[148; 149)
EQ@[149; 150)
WHITESPACE@[150; 151)
STRING@[151; 157)
R_PAREN@[157; 158)
R_BRACK@[158; 159)
WHITESPACE@[159; 168)
ATTR@[168; 198)
POUND@[168; 169)
TOKEN_TREE@[169; 198)
L_BRACK@[169; 170)
IDENT@[170; 173) "cfg"
TOKEN_TREE@[173; 197)
L_PAREN@[173; 174)
IDENT@[174; 181) "feature"
WHITESPACE@[181; 182)
EQ@[182; 183)
WHITESPACE@[183; 184)
STRING@[184; 196)
R_PAREN@[196; 197)
R_BRACK@[197; 198)
WHITESPACE@[198; 207)
ATTR@[207; 233)
POUND@[207; 208)
TOKEN_TREE@[208; 233)
L_BRACK@[208; 209)
IDENT@[209; 212) "cfg"
TOKEN_TREE@[212; 232)
L_PAREN@[212; 213)
IDENT@[213; 220) "feature"
WHITESPACE@[220; 221)
EQ@[221; 222)
WHITESPACE@[222; 223)
STRING@[223; 231)
R_PAREN@[231; 232)
R_BRACK@[232; 233)
WHITESPACE@[233; 242)
MATCH_ARM@[242; 249)
PLACEHOLDER_PAT@[242; 243)
UNDERSCORE@[242; 243)
WHITESPACE@[243; 244)
FAT_ARROW@[244; 246)
WHITESPACE@[246; 247)
TUPLE_EXPR@[247; 249)
L_PAREN@[247; 248)
R_PAREN@[248; 249)
COMMA@[249; 250)
WHITESPACE@[250; 255)
R_CURLY@[255; 256)
WHITESPACE@[256; 257)
R_CURLY@[257; 258)
WHITESPACE@[258; 259)