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