Add tests and only traverse in the crates directory

This commit is contained in:
DJMcNab 2018-12-19 21:19:32 +00:00
parent db67741430
commit a3b842fb8b
7 changed files with 185 additions and 94 deletions

View file

@ -73,6 +73,10 @@ pub(crate) fn block(p: &mut Parser) {
// for _ in () {} // for _ in () {}
// {} // {}
// {} // {}
// macro_rules! test {
// () => {}
// }
// test!{}
// } // }
if is_blocklike { if is_blocklike {
p.eat(SEMI); p.eat(SEMI);
@ -168,13 +172,13 @@ fn current_op(p: &Parser) -> (u8, Op) {
// Parses expression with binding power of at least bp. // Parses expression with binding power of at least bp.
fn expr_bp(p: &mut Parser, r: Restrictions, bp: u8) -> BlockLike { fn expr_bp(p: &mut Parser, r: Restrictions, bp: u8) -> BlockLike {
let mut lhs = match lhs(p, r) { let mut lhs = match lhs(p, r) {
Some((lhs, macro_blocklike)) => { Some((lhs, blocklike)) => {
// test stmt_bin_expr_ambiguity // test stmt_bin_expr_ambiguity
// fn foo() { // fn foo() {
// let _ = {1} & 2; // let _ = {1} & 2;
// {1} &2; // {1} &2;
// } // }
if r.prefer_stmt && macro_blocklike.is_block() { if r.prefer_stmt && blocklike.is_block() {
return BlockLike::Block; return BlockLike::Block;
} }
lhs lhs

View file

@ -353,6 +353,7 @@ pub(crate) fn match_arm_list(p: &mut Parser) {
// fn foo() { // fn foo() {
// match () { // match () {
// _ => (), // _ => (),
// _ if Test>{field: 0} => (),
// X | Y if Z => (), // X | Y if Z => (),
// | X | Y if Z => (), // | X | Y if Z => (),
// | X => (), // | X => (),

View file

@ -1,6 +1,7 @@
fn foo() { fn foo() {
match () { match () {
_ => (), _ => (),
_ if Test>{field: 0} => (),
X | Y if Z => (), X | Y if Z => (),
| X | Y if Z => (), | X | Y if Z => (),
| X => (), | X => (),

View file

@ -1,5 +1,5 @@
SOURCE_FILE@[0; 125) SOURCE_FILE@[0; 161)
FN_DEF@[0; 124) FN_DEF@[0; 160)
FN_KW@[0; 2) FN_KW@[0; 2)
WHITESPACE@[2; 3) WHITESPACE@[2; 3)
NAME@[3; 6) NAME@[3; 6)
@ -8,18 +8,18 @@ SOURCE_FILE@[0; 125)
L_PAREN@[6; 7) L_PAREN@[6; 7)
R_PAREN@[7; 8) R_PAREN@[7; 8)
WHITESPACE@[8; 9) WHITESPACE@[8; 9)
BLOCK@[9; 124) BLOCK@[9; 160)
L_CURLY@[9; 10) L_CURLY@[9; 10)
WHITESPACE@[10; 15) WHITESPACE@[10; 15)
EXPR_STMT@[15; 122) EXPR_STMT@[15; 158)
MATCH_EXPR@[15; 121) MATCH_EXPR@[15; 157)
MATCH_KW@[15; 20) MATCH_KW@[15; 20)
WHITESPACE@[20; 21) WHITESPACE@[20; 21)
TUPLE_EXPR@[21; 23) TUPLE_EXPR@[21; 23)
L_PAREN@[21; 22) L_PAREN@[21; 22)
R_PAREN@[22; 23) R_PAREN@[22; 23)
WHITESPACE@[23; 24) WHITESPACE@[23; 24)
MATCH_ARM_LIST@[24; 121) MATCH_ARM_LIST@[24; 157)
L_CURLY@[24; 25) L_CURLY@[24; 25)
WHITESPACE@[25; 34) WHITESPACE@[25; 34)
MATCH_ARM@[34; 41) MATCH_ARM@[34; 41)
@ -33,76 +33,116 @@ SOURCE_FILE@[0; 125)
R_PAREN@[40; 41) R_PAREN@[40; 41)
COMMA@[41; 42) COMMA@[41; 42)
WHITESPACE@[42; 51) WHITESPACE@[42; 51)
MATCH_ARM@[51; 67) MATCH_ARM@[51; 77)
BIND_PAT@[51; 52) PLACEHOLDER_PAT@[51; 52)
NAME@[51; 52) UNDERSCORE@[51; 52)
IDENT@[51; 52) "X"
WHITESPACE@[52; 53) WHITESPACE@[52; 53)
PIPE@[53; 54) IF_KW@[53; 55)
WHITESPACE@[54; 55) WHITESPACE@[55; 56)
BIND_PAT@[55; 56) BIN_EXPR@[56; 71)
NAME@[55; 56) PATH_EXPR@[56; 60)
IDENT@[55; 56) "Y" PATH@[56; 60)
WHITESPACE@[56; 57) PATH_SEGMENT@[56; 60)
IF_KW@[57; 59) NAME_REF@[56; 60)
WHITESPACE@[59; 60) IDENT@[56; 60) "Test"
PATH_EXPR@[60; 61) R_ANGLE@[60; 61)
PATH@[60; 61) BLOCK_EXPR@[61; 71)
PATH_SEGMENT@[60; 61) BLOCK@[61; 71)
NAME_REF@[60; 61) L_CURLY@[61; 62)
IDENT@[60; 61) "Z" EXPR_STMT@[62; 67)
WHITESPACE@[61; 62) PATH_EXPR@[62; 67)
FAT_ARROW@[62; 64) PATH@[62; 67)
WHITESPACE@[64; 65) PATH_SEGMENT@[62; 67)
TUPLE_EXPR@[65; 67) NAME_REF@[62; 67)
L_PAREN@[65; 66) IDENT@[62; 67) "field"
R_PAREN@[66; 67) err: `expected SEMI`
COMMA@[67; 68) err: `expected expression`
WHITESPACE@[68; 77) EXPR_STMT@[67; 68)
MATCH_ARM@[77; 95) ERROR@[67; 68)
PIPE@[77; 78) COLON@[67; 68)
WHITESPACE@[78; 79) err: `expected SEMI`
BIND_PAT@[79; 80) WHITESPACE@[68; 69)
NAME@[79; 80) LITERAL@[69; 70)
IDENT@[79; 80) "X" INT_NUMBER@[69; 70) "0"
WHITESPACE@[80; 81) R_CURLY@[70; 71)
PIPE@[81; 82) WHITESPACE@[71; 72)
WHITESPACE@[82; 83) FAT_ARROW@[72; 74)
BIND_PAT@[83; 84) WHITESPACE@[74; 75)
NAME@[83; 84) TUPLE_EXPR@[75; 77)
IDENT@[83; 84) "Y" L_PAREN@[75; 76)
WHITESPACE@[84; 85) R_PAREN@[76; 77)
IF_KW@[85; 87) COMMA@[77; 78)
WHITESPACE@[87; 88) WHITESPACE@[78; 87)
PATH_EXPR@[88; 89) MATCH_ARM@[87; 103)
PATH@[88; 89) BIND_PAT@[87; 88)
PATH_SEGMENT@[88; 89) NAME@[87; 88)
NAME_REF@[88; 89) IDENT@[87; 88) "X"
IDENT@[88; 89) "Z" WHITESPACE@[88; 89)
WHITESPACE@[89; 90) PIPE@[89; 90)
FAT_ARROW@[90; 92) WHITESPACE@[90; 91)
BIND_PAT@[91; 92)
NAME@[91; 92)
IDENT@[91; 92) "Y"
WHITESPACE@[92; 93) WHITESPACE@[92; 93)
TUPLE_EXPR@[93; 95) IF_KW@[93; 95)
L_PAREN@[93; 94) WHITESPACE@[95; 96)
R_PAREN@[94; 95) PATH_EXPR@[96; 97)
COMMA@[95; 96) PATH@[96; 97)
WHITESPACE@[96; 105) PATH_SEGMENT@[96; 97)
MATCH_ARM@[105; 114) NAME_REF@[96; 97)
PIPE@[105; 106) IDENT@[96; 97) "Z"
WHITESPACE@[106; 107) WHITESPACE@[97; 98)
BIND_PAT@[107; 108) FAT_ARROW@[98; 100)
NAME@[107; 108) WHITESPACE@[100; 101)
IDENT@[107; 108) "X" TUPLE_EXPR@[101; 103)
WHITESPACE@[108; 109) L_PAREN@[101; 102)
FAT_ARROW@[109; 111) R_PAREN@[102; 103)
WHITESPACE@[111; 112) COMMA@[103; 104)
TUPLE_EXPR@[112; 114) WHITESPACE@[104; 113)
L_PAREN@[112; 113) MATCH_ARM@[113; 131)
R_PAREN@[113; 114) PIPE@[113; 114)
COMMA@[114; 115) WHITESPACE@[114; 115)
WHITESPACE@[115; 120) BIND_PAT@[115; 116)
R_CURLY@[120; 121) NAME@[115; 116)
SEMI@[121; 122) IDENT@[115; 116) "X"
WHITESPACE@[122; 123) WHITESPACE@[116; 117)
R_CURLY@[123; 124) PIPE@[117; 118)
WHITESPACE@[124; 125) WHITESPACE@[118; 119)
BIND_PAT@[119; 120)
NAME@[119; 120)
IDENT@[119; 120) "Y"
WHITESPACE@[120; 121)
IF_KW@[121; 123)
WHITESPACE@[123; 124)
PATH_EXPR@[124; 125)
PATH@[124; 125)
PATH_SEGMENT@[124; 125)
NAME_REF@[124; 125)
IDENT@[124; 125) "Z"
WHITESPACE@[125; 126)
FAT_ARROW@[126; 128)
WHITESPACE@[128; 129)
TUPLE_EXPR@[129; 131)
L_PAREN@[129; 130)
R_PAREN@[130; 131)
COMMA@[131; 132)
WHITESPACE@[132; 141)
MATCH_ARM@[141; 150)
PIPE@[141; 142)
WHITESPACE@[142; 143)
BIND_PAT@[143; 144)
NAME@[143; 144)
IDENT@[143; 144) "X"
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; 156)
R_CURLY@[156; 157)
SEMI@[157; 158)
WHITESPACE@[158; 159)
R_CURLY@[159; 160)
WHITESPACE@[160; 161)

View file

@ -6,4 +6,8 @@ fn foo() {
for _ in () {} for _ in () {}
{} {}
{} {}
macro_rules! test {
() => {}
}
test!{}
} }

View file

@ -1,5 +1,5 @@
SOURCE_FILE@[0; 107) SOURCE_FILE@[0; 167)
FN_DEF@[0; 106) FN_DEF@[0; 166)
FN_KW@[0; 2) FN_KW@[0; 2)
WHITESPACE@[2; 3) WHITESPACE@[2; 3)
NAME@[3; 6) NAME@[3; 6)
@ -8,7 +8,7 @@ SOURCE_FILE@[0; 107)
L_PAREN@[6; 7) L_PAREN@[6; 7)
R_PAREN@[7; 8) R_PAREN@[7; 8)
WHITESPACE@[8; 9) WHITESPACE@[8; 9)
BLOCK@[9; 106) BLOCK@[9; 166)
L_CURLY@[9; 10) L_CURLY@[9; 10)
WHITESPACE@[10; 15) WHITESPACE@[10; 15)
EXPR_STMT@[15; 25) EXPR_STMT@[15; 25)
@ -78,10 +78,46 @@ SOURCE_FILE@[0; 107)
L_CURLY@[95; 96) L_CURLY@[95; 96)
R_CURLY@[96; 97) R_CURLY@[96; 97)
WHITESPACE@[97; 102) WHITESPACE@[97; 102)
BLOCK_EXPR@[102; 104) EXPR_STMT@[102; 104)
BLOCK@[102; 104) BLOCK_EXPR@[102; 104)
L_CURLY@[102; 103) BLOCK@[102; 104)
R_CURLY@[103; 104) L_CURLY@[102; 103)
WHITESPACE@[104; 105) R_CURLY@[103; 104)
R_CURLY@[105; 106) WHITESPACE@[104; 109)
WHITESPACE@[106; 107) EXPR_STMT@[109; 152)
MACRO_CALL@[109; 152)
PATH@[109; 120)
PATH_SEGMENT@[109; 120)
NAME_REF@[109; 120)
IDENT@[109; 120) "macro_rules"
EXCL@[120; 121)
WHITESPACE@[121; 122)
IDENT@[122; 126) "test"
WHITESPACE@[126; 127)
TOKEN_TREE@[127; 152)
L_CURLY@[127; 128)
WHITESPACE@[128; 138)
TOKEN_TREE@[138; 140)
L_PAREN@[138; 139)
R_PAREN@[139; 140)
WHITESPACE@[140; 141)
FAT_ARROW@[141; 143)
WHITESPACE@[143; 144)
TOKEN_TREE@[144; 146)
L_CURLY@[144; 145)
R_CURLY@[145; 146)
WHITESPACE@[146; 151)
R_CURLY@[151; 152)
WHITESPACE@[152; 157)
MACRO_CALL@[157; 164)
PATH@[157; 161)
PATH_SEGMENT@[157; 161)
NAME_REF@[157; 161)
IDENT@[157; 161) "test"
EXCL@[161; 162)
TOKEN_TREE@[162; 164)
L_CURLY@[162; 163)
R_CURLY@[163; 164)
WHITESPACE@[164; 165)
R_CURLY@[165; 166)
WHITESPACE@[166; 167)

View file

@ -41,8 +41,10 @@ fn parser_fuzz_tests() {
/// TODO: Use this as a benchmark /// TODO: Use this as a benchmark
#[test] #[test]
fn self_hosting_parsing() { fn self_hosting_parsing() {
use std::ffi::OsStr;
let empty_vec = vec![]; let empty_vec = vec![];
let dir = project_dir(); let dir = project_dir().join("crates");
let mut count = 0;
for entry in walkdir::WalkDir::new(dir) for entry in walkdir::WalkDir::new(dir)
.into_iter() .into_iter()
.filter_entry(|entry| { .filter_entry(|entry| {
@ -52,17 +54,16 @@ fn self_hosting_parsing() {
// TODO: this more neatly // TODO: this more neatly
.any(|component| { .any(|component| {
// Get all files which are not in the crates/ra_syntax/tests/data folder // Get all files which are not in the crates/ra_syntax/tests/data folder
(component == Component::Normal(std::ffi::OsStr::new("data")) component == Component::Normal(OsStr::new("data"))
// or the .git folder
|| component == Component::Normal(std::ffi::OsStr::new(".git")))
}) })
}) })
.map(|e| e.unwrap()) .map(|e| e.unwrap())
.filter(|entry| { .filter(|entry| {
// Get all `.rs ` files // Get all `.rs ` files
!entry.path().is_dir() && (entry.path().extension() == Some(std::ffi::OsStr::new("rs"))) !entry.path().is_dir() && (entry.path().extension() == Some(OsStr::new("rs")))
}) })
{ {
count += 1;
let text = read_text(entry.path()); let text = read_text(entry.path());
let node = SourceFileNode::parse(&text); let node = SourceFileNode::parse(&text);
let errors = node.errors(); let errors = node.errors();
@ -72,6 +73,10 @@ fn self_hosting_parsing() {
entry entry
); );
} }
assert!(
count > 30,
"self_hosting_parsing found too few files - is it running in the right directory?"
)
} }
/// Read file and normalize newlines. /// Read file and normalize newlines.
/// ///