From 1c97c1ac11459d45f7bfc57dc72428d2b294520c Mon Sep 17 00:00:00 2001 From: Ville Penttinen Date: Sun, 17 Feb 2019 19:08:34 +0200 Subject: 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. --- .../data/parser/err/0032_match_arms_inner_attrs.rs | 20 +++ .../parser/err/0032_match_arms_inner_attrs.txt | 173 +++++++++++++++++++++ .../data/parser/err/0033_match_arms_outer_attrs.rs | 7 + .../parser/err/0033_match_arms_outer_attrs.txt | 64 ++++++++ 4 files changed, 264 insertions(+) create mode 100644 crates/ra_syntax/tests/data/parser/err/0032_match_arms_inner_attrs.rs create mode 100644 crates/ra_syntax/tests/data/parser/err/0032_match_arms_inner_attrs.txt create mode 100644 crates/ra_syntax/tests/data/parser/err/0033_match_arms_outer_attrs.rs create mode 100644 crates/ra_syntax/tests/data/parser/err/0033_match_arms_outer_attrs.txt (limited to 'crates/ra_syntax/tests/data/parser/err') diff --git a/crates/ra_syntax/tests/data/parser/err/0032_match_arms_inner_attrs.rs b/crates/ra_syntax/tests/data/parser/err/0032_match_arms_inner_attrs.rs new file mode 100644 index 000000000..06aa47770 --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/err/0032_match_arms_inner_attrs.rs @@ -0,0 +1,20 @@ +fn foo() { + match () { + _ => (), + #![doc("Not allowed here")] + _ => (), + } + + match () { + _ => (), + _ => (), + #![doc("Nor here")] + } + + match () { + #[cfg(test)] + #![doc("Nor here")] + _ => (), + _ => (), + } +} diff --git a/crates/ra_syntax/tests/data/parser/err/0032_match_arms_inner_attrs.txt b/crates/ra_syntax/tests/data/parser/err/0032_match_arms_inner_attrs.txt new file mode 100644 index 000000000..b3ff36364 --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/err/0032_match_arms_inner_attrs.txt @@ -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) diff --git a/crates/ra_syntax/tests/data/parser/err/0033_match_arms_outer_attrs.rs b/crates/ra_syntax/tests/data/parser/err/0033_match_arms_outer_attrs.rs new file mode 100644 index 000000000..4635222da --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/err/0033_match_arms_outer_attrs.rs @@ -0,0 +1,7 @@ +fn foo() { + match () { + _ => (), + _ => (), + #[cfg(test)] + } +} diff --git a/crates/ra_syntax/tests/data/parser/err/0033_match_arms_outer_attrs.txt b/crates/ra_syntax/tests/data/parser/err/0033_match_arms_outer_attrs.txt new file mode 100644 index 000000000..7f8767001 --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/err/0033_match_arms_outer_attrs.txt @@ -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) -- cgit v1.2.3