From 2bebdf0b372b23c3766fc08b345012870ae768c9 Mon Sep 17 00:00:00 2001 From: bravomikekilo Date: Wed, 14 Aug 2019 11:55:21 +0800 Subject: fix error of RangeFrom in for-loop --- crates/ra_parser/src/grammar/expressions/atom.rs | 18 +++- .../parser/inline/ok/0142_for_range_block.rs | 8 ++ .../parser/inline/ok/0142_for_range_block.txt | 105 +++++++++++++++++++++ 3 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.rs create mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.txt diff --git a/crates/ra_parser/src/grammar/expressions/atom.rs b/crates/ra_parser/src/grammar/expressions/atom.rs index d98953a7e..6e25e3cb4 100644 --- a/crates/ra_parser/src/grammar/expressions/atom.rs +++ b/crates/ra_parser/src/grammar/expressions/atom.rs @@ -110,7 +110,13 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar p.bump(); block_expr(p, Some(m)) } - T!['{'] => block_expr(p, None), + T!['{'] => { + if r.forbid_structs { + return None; + } else { + block_expr(p, None) + } + } T![return] => return_expr(p), T![continue] => continue_expr(p), T![break] => break_expr(p, r), @@ -307,6 +313,16 @@ fn while_expr(p: &mut Parser, m: Option) -> CompletedMarker { // fn foo() { // for x in [] {}; // } + +// test for_range_block +// fn foo() { +// for x in 0 .. { +// break; +// } +// for _x in 0 .. (0 .. {1 + 2}).sum::() { +// break; +// } +// } fn for_expr(p: &mut Parser, m: Option) -> CompletedMarker { assert!(p.at(T![for])); let m = m.unwrap_or_else(|| p.start()); diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.rs b/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.rs new file mode 100644 index 000000000..33af70026 --- /dev/null +++ b/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.rs @@ -0,0 +1,8 @@ +fn foo() { + for x in 0 .. { + break; + }; + for _x in 0 .. (0 .. {1 + 2}).sum::() { + break; + }; +} diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.txt b/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.txt new file mode 100644 index 000000000..7da4dbb8b --- /dev/null +++ b/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.txt @@ -0,0 +1,105 @@ +SOURCE_FILE@[0; 118) + FN_DEF@[0; 117) + FN_KW@[0; 2) "fn" + 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; 117) + L_CURLY@[9; 10) "{" + WHITESPACE@[10; 14) "\n " + EXPR_STMT@[14; 48) + FOR_EXPR@[14; 48) + FOR_KW@[14; 17) "for" + WHITESPACE@[17; 18) " " + BIND_PAT@[18; 19) + NAME@[18; 19) + IDENT@[18; 19) "x" + WHITESPACE@[19; 20) " " + IN_KW@[20; 22) "in" + WHITESPACE@[22; 23) " " + RANGE_EXPR@[23; 27) + LITERAL@[23; 24) + INT_NUMBER@[23; 24) "0" + WHITESPACE@[24; 25) " " + DOTDOT@[25; 27) ".." + WHITESPACE@[27; 28) " " + BLOCK@[28; 48) + L_CURLY@[28; 29) "{" + WHITESPACE@[29; 37) "\n " + EXPR_STMT@[37; 43) + BREAK_EXPR@[37; 42) + BREAK_KW@[37; 42) "break" + SEMI@[42; 43) ";" + WHITESPACE@[43; 47) "\n " + R_CURLY@[47; 48) "}" + WHITESPACE@[48; 52) "\n " + FOR_EXPR@[52; 115) + FOR_KW@[52; 55) "for" + WHITESPACE@[55; 56) " " + BIND_PAT@[56; 58) + NAME@[56; 58) + IDENT@[56; 58) "_x" + WHITESPACE@[58; 59) " " + IN_KW@[59; 61) "in" + WHITESPACE@[61; 62) " " + RANGE_EXPR@[62; 94) + LITERAL@[62; 63) + INT_NUMBER@[62; 63) "0" + WHITESPACE@[63; 64) " " + DOTDOT@[64; 66) ".." + WHITESPACE@[66; 67) " " + METHOD_CALL_EXPR@[67; 94) + PAREN_EXPR@[67; 81) + L_PAREN@[67; 68) "(" + RANGE_EXPR@[68; 80) + LITERAL@[68; 69) + INT_NUMBER@[68; 69) "0" + WHITESPACE@[69; 70) " " + DOTDOT@[70; 72) ".." + WHITESPACE@[72; 73) " " + BLOCK_EXPR@[73; 80) + BLOCK@[73; 80) + L_CURLY@[73; 74) "{" + BIN_EXPR@[74; 79) + LITERAL@[74; 75) + INT_NUMBER@[74; 75) "1" + WHITESPACE@[75; 76) " " + PLUS@[76; 77) "+" + WHITESPACE@[77; 78) " " + LITERAL@[78; 79) + INT_NUMBER@[78; 79) "2" + R_CURLY@[79; 80) "}" + R_PAREN@[80; 81) ")" + DOT@[81; 82) "." + NAME_REF@[82; 85) + IDENT@[82; 85) "sum" + TYPE_ARG_LIST@[85; 92) + COLONCOLON@[85; 87) "::" + L_ANGLE@[87; 88) "<" + TYPE_ARG@[88; 91) + PATH_TYPE@[88; 91) + PATH@[88; 91) + PATH_SEGMENT@[88; 91) + NAME_REF@[88; 91) + IDENT@[88; 91) "u32" + R_ANGLE@[91; 92) ">" + ARG_LIST@[92; 94) + L_PAREN@[92; 93) "(" + R_PAREN@[93; 94) ")" + WHITESPACE@[94; 95) " " + BLOCK@[95; 115) + L_CURLY@[95; 96) "{" + WHITESPACE@[96; 104) "\n " + EXPR_STMT@[104; 110) + BREAK_EXPR@[104; 109) + BREAK_KW@[104; 109) "break" + SEMI@[109; 110) ";" + WHITESPACE@[110; 114) "\n " + R_CURLY@[114; 115) "}" + WHITESPACE@[115; 116) "\n" + R_CURLY@[116; 117) "}" + WHITESPACE@[117; 118) "\n" -- cgit v1.2.3 From 3fce56280feeb7d621cd98a61c6157393be72c00 Mon Sep 17 00:00:00 2001 From: bravomikekilo Date: Wed, 14 Aug 2019 12:42:58 +0800 Subject: fix test --- crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.rs b/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.rs index 33af70026..eb745767b 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.rs +++ b/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.rs @@ -1,8 +1,8 @@ fn foo() { for x in 0 .. { break; - }; + } for _x in 0 .. (0 .. {1 + 2}).sum::() { break; - }; + } } -- cgit v1.2.3 From 4f31fed362e1bb08f748b188eedc0bdc5a070bee Mon Sep 17 00:00:00 2001 From: bravomikekilo Date: Wed, 14 Aug 2019 21:20:04 +0800 Subject: fix test position --- crates/ra_parser/src/grammar/expressions/atom.rs | 16 ++-- .../parser/inline/ok/0142_for_range_block.rs | 8 -- .../parser/inline/ok/0142_for_range_block.txt | 105 --------------------- .../parser/inline/ok/0142_for_range_from.rs | 5 + .../parser/inline/ok/0142_for_range_from.txt | 40 ++++++++ .../test_data/parser/ok/0052_for_range_block.rs | 5 + .../test_data/parser/ok/0052_for_range_block.txt | 79 ++++++++++++++++ 7 files changed, 135 insertions(+), 123 deletions(-) delete mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.rs delete mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.txt create mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_from.rs create mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_from.txt create mode 100644 crates/ra_syntax/test_data/parser/ok/0052_for_range_block.rs create mode 100644 crates/ra_syntax/test_data/parser/ok/0052_for_range_block.txt diff --git a/crates/ra_parser/src/grammar/expressions/atom.rs b/crates/ra_parser/src/grammar/expressions/atom.rs index 6e25e3cb4..50c70b3b3 100644 --- a/crates/ra_parser/src/grammar/expressions/atom.rs +++ b/crates/ra_parser/src/grammar/expressions/atom.rs @@ -111,6 +111,12 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar block_expr(p, Some(m)) } T!['{'] => { + // test for_range_from + // fn foo() { + // for x in 0 .. { + // break; + // } + // } if r.forbid_structs { return None; } else { @@ -313,16 +319,6 @@ fn while_expr(p: &mut Parser, m: Option) -> CompletedMarker { // fn foo() { // for x in [] {}; // } - -// test for_range_block -// fn foo() { -// for x in 0 .. { -// break; -// } -// for _x in 0 .. (0 .. {1 + 2}).sum::() { -// break; -// } -// } fn for_expr(p: &mut Parser, m: Option) -> CompletedMarker { assert!(p.at(T![for])); let m = m.unwrap_or_else(|| p.start()); diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.rs b/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.rs deleted file mode 100644 index eb745767b..000000000 --- a/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.rs +++ /dev/null @@ -1,8 +0,0 @@ -fn foo() { - for x in 0 .. { - break; - } - for _x in 0 .. (0 .. {1 + 2}).sum::() { - break; - } -} diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.txt b/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.txt deleted file mode 100644 index 7da4dbb8b..000000000 --- a/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_block.txt +++ /dev/null @@ -1,105 +0,0 @@ -SOURCE_FILE@[0; 118) - FN_DEF@[0; 117) - FN_KW@[0; 2) "fn" - 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; 117) - L_CURLY@[9; 10) "{" - WHITESPACE@[10; 14) "\n " - EXPR_STMT@[14; 48) - FOR_EXPR@[14; 48) - FOR_KW@[14; 17) "for" - WHITESPACE@[17; 18) " " - BIND_PAT@[18; 19) - NAME@[18; 19) - IDENT@[18; 19) "x" - WHITESPACE@[19; 20) " " - IN_KW@[20; 22) "in" - WHITESPACE@[22; 23) " " - RANGE_EXPR@[23; 27) - LITERAL@[23; 24) - INT_NUMBER@[23; 24) "0" - WHITESPACE@[24; 25) " " - DOTDOT@[25; 27) ".." - WHITESPACE@[27; 28) " " - BLOCK@[28; 48) - L_CURLY@[28; 29) "{" - WHITESPACE@[29; 37) "\n " - EXPR_STMT@[37; 43) - BREAK_EXPR@[37; 42) - BREAK_KW@[37; 42) "break" - SEMI@[42; 43) ";" - WHITESPACE@[43; 47) "\n " - R_CURLY@[47; 48) "}" - WHITESPACE@[48; 52) "\n " - FOR_EXPR@[52; 115) - FOR_KW@[52; 55) "for" - WHITESPACE@[55; 56) " " - BIND_PAT@[56; 58) - NAME@[56; 58) - IDENT@[56; 58) "_x" - WHITESPACE@[58; 59) " " - IN_KW@[59; 61) "in" - WHITESPACE@[61; 62) " " - RANGE_EXPR@[62; 94) - LITERAL@[62; 63) - INT_NUMBER@[62; 63) "0" - WHITESPACE@[63; 64) " " - DOTDOT@[64; 66) ".." - WHITESPACE@[66; 67) " " - METHOD_CALL_EXPR@[67; 94) - PAREN_EXPR@[67; 81) - L_PAREN@[67; 68) "(" - RANGE_EXPR@[68; 80) - LITERAL@[68; 69) - INT_NUMBER@[68; 69) "0" - WHITESPACE@[69; 70) " " - DOTDOT@[70; 72) ".." - WHITESPACE@[72; 73) " " - BLOCK_EXPR@[73; 80) - BLOCK@[73; 80) - L_CURLY@[73; 74) "{" - BIN_EXPR@[74; 79) - LITERAL@[74; 75) - INT_NUMBER@[74; 75) "1" - WHITESPACE@[75; 76) " " - PLUS@[76; 77) "+" - WHITESPACE@[77; 78) " " - LITERAL@[78; 79) - INT_NUMBER@[78; 79) "2" - R_CURLY@[79; 80) "}" - R_PAREN@[80; 81) ")" - DOT@[81; 82) "." - NAME_REF@[82; 85) - IDENT@[82; 85) "sum" - TYPE_ARG_LIST@[85; 92) - COLONCOLON@[85; 87) "::" - L_ANGLE@[87; 88) "<" - TYPE_ARG@[88; 91) - PATH_TYPE@[88; 91) - PATH@[88; 91) - PATH_SEGMENT@[88; 91) - NAME_REF@[88; 91) - IDENT@[88; 91) "u32" - R_ANGLE@[91; 92) ">" - ARG_LIST@[92; 94) - L_PAREN@[92; 93) "(" - R_PAREN@[93; 94) ")" - WHITESPACE@[94; 95) " " - BLOCK@[95; 115) - L_CURLY@[95; 96) "{" - WHITESPACE@[96; 104) "\n " - EXPR_STMT@[104; 110) - BREAK_EXPR@[104; 109) - BREAK_KW@[104; 109) "break" - SEMI@[109; 110) ";" - WHITESPACE@[110; 114) "\n " - R_CURLY@[114; 115) "}" - WHITESPACE@[115; 116) "\n" - R_CURLY@[116; 117) "}" - WHITESPACE@[117; 118) "\n" diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_from.rs b/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_from.rs new file mode 100644 index 000000000..af0d40a7a --- /dev/null +++ b/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_from.rs @@ -0,0 +1,5 @@ +fn foo() { + for x in 0 .. { + break; + } +} diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_from.txt b/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_from.txt new file mode 100644 index 000000000..9e5836233 --- /dev/null +++ b/crates/ra_syntax/test_data/parser/inline/ok/0142_for_range_from.txt @@ -0,0 +1,40 @@ +SOURCE_FILE@[0; 51) + FN_DEF@[0; 50) + FN_KW@[0; 2) "fn" + 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; 50) + L_CURLY@[9; 10) "{" + WHITESPACE@[10; 14) "\n " + FOR_EXPR@[14; 48) + FOR_KW@[14; 17) "for" + WHITESPACE@[17; 18) " " + BIND_PAT@[18; 19) + NAME@[18; 19) + IDENT@[18; 19) "x" + WHITESPACE@[19; 20) " " + IN_KW@[20; 22) "in" + WHITESPACE@[22; 23) " " + RANGE_EXPR@[23; 27) + LITERAL@[23; 24) + INT_NUMBER@[23; 24) "0" + WHITESPACE@[24; 25) " " + DOTDOT@[25; 27) ".." + WHITESPACE@[27; 28) " " + BLOCK@[28; 48) + L_CURLY@[28; 29) "{" + WHITESPACE@[29; 37) "\n " + EXPR_STMT@[37; 43) + BREAK_EXPR@[37; 42) + BREAK_KW@[37; 42) "break" + SEMI@[42; 43) ";" + WHITESPACE@[43; 47) "\n " + R_CURLY@[47; 48) "}" + WHITESPACE@[48; 49) "\n" + R_CURLY@[49; 50) "}" + WHITESPACE@[50; 51) "\n" diff --git a/crates/ra_syntax/test_data/parser/ok/0052_for_range_block.rs b/crates/ra_syntax/test_data/parser/ok/0052_for_range_block.rs new file mode 100644 index 000000000..b51b19630 --- /dev/null +++ b/crates/ra_syntax/test_data/parser/ok/0052_for_range_block.rs @@ -0,0 +1,5 @@ +fn foo() { + for _x in 0 .. (0 .. {1 + 2}).sum::() { + break; + } +} diff --git a/crates/ra_syntax/test_data/parser/ok/0052_for_range_block.txt b/crates/ra_syntax/test_data/parser/ok/0052_for_range_block.txt new file mode 100644 index 000000000..858f042c6 --- /dev/null +++ b/crates/ra_syntax/test_data/parser/ok/0052_for_range_block.txt @@ -0,0 +1,79 @@ +SOURCE_FILE@[0; 80) + FN_DEF@[0; 79) + FN_KW@[0; 2) "fn" + 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; 79) + L_CURLY@[9; 10) "{" + WHITESPACE@[10; 14) "\n " + FOR_EXPR@[14; 77) + FOR_KW@[14; 17) "for" + WHITESPACE@[17; 18) " " + BIND_PAT@[18; 20) + NAME@[18; 20) + IDENT@[18; 20) "_x" + WHITESPACE@[20; 21) " " + IN_KW@[21; 23) "in" + WHITESPACE@[23; 24) " " + RANGE_EXPR@[24; 56) + LITERAL@[24; 25) + INT_NUMBER@[24; 25) "0" + WHITESPACE@[25; 26) " " + DOTDOT@[26; 28) ".." + WHITESPACE@[28; 29) " " + METHOD_CALL_EXPR@[29; 56) + PAREN_EXPR@[29; 43) + L_PAREN@[29; 30) "(" + RANGE_EXPR@[30; 42) + LITERAL@[30; 31) + INT_NUMBER@[30; 31) "0" + WHITESPACE@[31; 32) " " + DOTDOT@[32; 34) ".." + WHITESPACE@[34; 35) " " + BLOCK_EXPR@[35; 42) + BLOCK@[35; 42) + L_CURLY@[35; 36) "{" + BIN_EXPR@[36; 41) + LITERAL@[36; 37) + INT_NUMBER@[36; 37) "1" + WHITESPACE@[37; 38) " " + PLUS@[38; 39) "+" + WHITESPACE@[39; 40) " " + LITERAL@[40; 41) + INT_NUMBER@[40; 41) "2" + R_CURLY@[41; 42) "}" + R_PAREN@[42; 43) ")" + DOT@[43; 44) "." + NAME_REF@[44; 47) + IDENT@[44; 47) "sum" + TYPE_ARG_LIST@[47; 54) + COLONCOLON@[47; 49) "::" + L_ANGLE@[49; 50) "<" + TYPE_ARG@[50; 53) + PATH_TYPE@[50; 53) + PATH@[50; 53) + PATH_SEGMENT@[50; 53) + NAME_REF@[50; 53) + IDENT@[50; 53) "u32" + R_ANGLE@[53; 54) ">" + ARG_LIST@[54; 56) + L_PAREN@[54; 55) "(" + R_PAREN@[55; 56) ")" + WHITESPACE@[56; 57) " " + BLOCK@[57; 77) + L_CURLY@[57; 58) "{" + WHITESPACE@[58; 66) "\n " + EXPR_STMT@[66; 72) + BREAK_EXPR@[66; 71) + BREAK_KW@[66; 71) "break" + SEMI@[71; 72) ";" + WHITESPACE@[72; 76) "\n " + R_CURLY@[76; 77) "}" + WHITESPACE@[77; 78) "\n" + R_CURLY@[78; 79) "}" + WHITESPACE@[79; 80) "\n" -- cgit v1.2.3