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

View File

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

View File

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

View File

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

View File

@ -1,5 +1,5 @@
SOURCE_FILE@[0; 107)
FN_DEF@[0; 106)
SOURCE_FILE@[0; 167)
FN_DEF@[0; 166)
FN_KW@[0; 2)
WHITESPACE@[2; 3)
NAME@[3; 6)
@ -8,7 +8,7 @@ SOURCE_FILE@[0; 107)
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
BLOCK@[9; 106)
BLOCK@[9; 166)
L_CURLY@[9; 10)
WHITESPACE@[10; 15)
EXPR_STMT@[15; 25)
@ -78,10 +78,46 @@ SOURCE_FILE@[0; 107)
L_CURLY@[95; 96)
R_CURLY@[96; 97)
WHITESPACE@[97; 102)
BLOCK_EXPR@[102; 104)
BLOCK@[102; 104)
L_CURLY@[102; 103)
R_CURLY@[103; 104)
WHITESPACE@[104; 105)
R_CURLY@[105; 106)
WHITESPACE@[106; 107)
EXPR_STMT@[102; 104)
BLOCK_EXPR@[102; 104)
BLOCK@[102; 104)
L_CURLY@[102; 103)
R_CURLY@[103; 104)
WHITESPACE@[104; 109)
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
#[test]
fn self_hosting_parsing() {
use std::ffi::OsStr;
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)
.into_iter()
.filter_entry(|entry| {
@ -52,17 +54,16 @@ fn self_hosting_parsing() {
// TODO: this more neatly
.any(|component| {
// Get all files which are not in the crates/ra_syntax/tests/data folder
(component == Component::Normal(std::ffi::OsStr::new("data"))
// or the .git folder
|| component == Component::Normal(std::ffi::OsStr::new(".git")))
component == Component::Normal(OsStr::new("data"))
})
})
.map(|e| e.unwrap())
.filter(|entry| {
// 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 node = SourceFileNode::parse(&text);
let errors = node.errors();
@ -72,6 +73,10 @@ fn self_hosting_parsing() {
entry
);
}
assert!(
count > 30,
"self_hosting_parsing found too few files - is it running in the right directory?"
)
}
/// Read file and normalize newlines.
///