aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2020-05-02 13:36:52 +0100
committerGitHub <noreply@github.com>2020-05-02 13:36:52 +0100
commita2ae2bbb833be6874a420eaa33dcb28c89f7590d (patch)
tree73f335deb44a8ef894deb7394445d6f1166e28a6
parentfb8fb65131c8d3e6335efd401e4e83287be49357 (diff)
parent359d3be308cab2415218200f5799c5031213c250 (diff)
Merge #4261
4261: Fix parsing of blocks without `{` r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
-rw-r--r--crates/ra_parser/src/grammar.rs4
-rw-r--r--crates/ra_parser/src/grammar/expressions.rs15
-rw-r--r--crates/ra_parser/src/grammar/expressions/atom.rs41
-rw-r--r--crates/ra_parser/src/grammar/items.rs2
-rw-r--r--crates/ra_parser/src/grammar/type_args.rs2
-rw-r--r--crates/ra_parser/src/lib.rs2
-rw-r--r--crates/ra_syntax/test_data/parser/err/0010_unsafe_lambda_block.rast2
-rw-r--r--crates/ra_syntax/test_data/parser/err/0163_weird_blocks.rast71
-rw-r--r--crates/ra_syntax/test_data/parser/err/0163_weird_blocks.rs6
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0105_block_expr.rast21
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0105_block_expr.rs3
11 files changed, 107 insertions, 62 deletions
diff --git a/crates/ra_parser/src/grammar.rs b/crates/ra_parser/src/grammar.rs
index d9824ff9b..be0cd5661 100644
--- a/crates/ra_parser/src/grammar.rs
+++ b/crates/ra_parser/src/grammar.rs
@@ -54,7 +54,7 @@ pub(crate) mod fragments {
54 use super::*; 54 use super::*;
55 55
56 pub(crate) use super::{ 56 pub(crate) use super::{
57 expressions::block, paths::type_path as path, patterns::pattern, types::type_, 57 expressions::block_expr, paths::type_path as path, patterns::pattern, types::type_,
58 }; 58 };
59 59
60 pub(crate) fn expr(p: &mut Parser) { 60 pub(crate) fn expr(p: &mut Parser) {
@@ -143,7 +143,7 @@ pub(crate) fn reparser(
143 parent: Option<SyntaxKind>, 143 parent: Option<SyntaxKind>,
144) -> Option<fn(&mut Parser)> { 144) -> Option<fn(&mut Parser)> {
145 let res = match node { 145 let res = match node {
146 BLOCK_EXPR => expressions::block, 146 BLOCK_EXPR => expressions::block_expr,
147 RECORD_FIELD_DEF_LIST => items::record_field_def_list, 147 RECORD_FIELD_DEF_LIST => items::record_field_def_list,
148 RECORD_FIELD_LIST => items::record_field_list, 148 RECORD_FIELD_LIST => items::record_field_list,
149 ENUM_VARIANT_LIST => items::enum_variant_list, 149 ENUM_VARIANT_LIST => items::enum_variant_list,
diff --git a/crates/ra_parser/src/grammar/expressions.rs b/crates/ra_parser/src/grammar/expressions.rs
index a23dbcacf..34f039768 100644
--- a/crates/ra_parser/src/grammar/expressions.rs
+++ b/crates/ra_parser/src/grammar/expressions.rs
@@ -2,7 +2,7 @@
2 2
3mod atom; 3mod atom;
4 4
5pub(crate) use self::atom::match_arm_list; 5pub(crate) use self::atom::{block_expr, match_arm_list};
6pub(super) use self::atom::{literal, LITERAL_FIRST}; 6pub(super) use self::atom::{literal, LITERAL_FIRST};
7use super::*; 7use super::*;
8 8
@@ -49,19 +49,6 @@ fn expr_no_struct(p: &mut Parser) {
49 expr_bp(p, r, 1); 49 expr_bp(p, r, 1);
50} 50}
51 51
52// test block
53// fn a() {}
54// fn b() { let _ = 1; }
55// fn c() { 1; 2; }
56// fn d() { 1; 2 }
57pub(crate) fn block(p: &mut Parser) {
58 if !p.at(T!['{']) {
59 p.error("expected a block");
60 return;
61 }
62 atom::block_expr(p);
63}
64
65fn is_expr_stmt_attr_allowed(kind: SyntaxKind) -> bool { 52fn is_expr_stmt_attr_allowed(kind: SyntaxKind) -> bool {
66 match kind { 53 match kind {
67 BIN_EXPR | RANGE_EXPR | IF_EXPR => false, 54 BIN_EXPR | RANGE_EXPR | IF_EXPR => false,
diff --git a/crates/ra_parser/src/grammar/expressions/atom.rs b/crates/ra_parser/src/grammar/expressions/atom.rs
index efb424dae..706a2f796 100644
--- a/crates/ra_parser/src/grammar/expressions/atom.rs
+++ b/crates/ra_parser/src/grammar/expressions/atom.rs
@@ -132,7 +132,7 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
132 // break; 132 // break;
133 // } 133 // }
134 // } 134 // }
135 block_expr(p) 135 block_expr_unchecked(p)
136 } 136 }
137 T![return] => return_expr(p), 137 T![return] => return_expr(p),
138 T![continue] => continue_expr(p), 138 T![continue] => continue_expr(p),
@@ -240,13 +240,9 @@ fn lambda_expr(p: &mut Parser) -> CompletedMarker {
240 p.eat(T![move]); 240 p.eat(T![move]);
241 params::param_list_closure(p); 241 params::param_list_closure(p);
242 if opt_fn_ret_type(p) { 242 if opt_fn_ret_type(p) {
243 if p.at(T!['{']) { 243 // test lambda_ret_block
244 // test lambda_ret_block 244 // fn main() { || -> i32 { 92 }(); }
245 // fn main() { || -> i32 { 92 }(); } 245 block_expr(p);
246 block_expr(p);
247 } else {
248 p.error("expected `{`");
249 }
250 } else { 246 } else {
251 if p.at_ts(EXPR_FIRST) { 247 if p.at_ts(EXPR_FIRST) {
252 expr(p); 248 expr(p);
@@ -270,13 +266,13 @@ fn if_expr(p: &mut Parser) -> CompletedMarker {
270 let m = p.start(); 266 let m = p.start();
271 p.bump(T![if]); 267 p.bump(T![if]);
272 cond(p); 268 cond(p);
273 block(p); 269 block_expr(p);
274 if p.at(T![else]) { 270 if p.at(T![else]) {
275 p.bump(T![else]); 271 p.bump(T![else]);
276 if p.at(T![if]) { 272 if p.at(T![if]) {
277 if_expr(p); 273 if_expr(p);
278 } else { 274 } else {
279 block(p); 275 block_expr(p);
280 } 276 }
281 } 277 }
282 m.complete(p, IF_EXPR) 278 m.complete(p, IF_EXPR)
@@ -304,7 +300,7 @@ fn loop_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
304 assert!(p.at(T![loop])); 300 assert!(p.at(T![loop]));
305 let m = m.unwrap_or_else(|| p.start()); 301 let m = m.unwrap_or_else(|| p.start());
306 p.bump(T![loop]); 302 p.bump(T![loop]);
307 block(p); 303 block_expr(p);
308 m.complete(p, LOOP_EXPR) 304 m.complete(p, LOOP_EXPR)
309} 305}
310 306
@@ -319,7 +315,7 @@ fn while_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
319 let m = m.unwrap_or_else(|| p.start()); 315 let m = m.unwrap_or_else(|| p.start());
320 p.bump(T![while]); 316 p.bump(T![while]);
321 cond(p); 317 cond(p);
322 block(p); 318 block_expr(p);
323 m.complete(p, WHILE_EXPR) 319 m.complete(p, WHILE_EXPR)
324} 320}
325 321
@@ -334,7 +330,7 @@ fn for_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
334 patterns::pattern(p); 330 patterns::pattern(p);
335 p.expect(T![in]); 331 p.expect(T![in]);
336 expr_no_struct(p); 332 expr_no_struct(p);
337 block(p); 333 block_expr(p);
338 m.complete(p, FOR_EXPR) 334 m.complete(p, FOR_EXPR)
339} 335}
340 336
@@ -467,11 +463,20 @@ fn match_guard(p: &mut Parser) -> CompletedMarker {
467 m.complete(p, MATCH_GUARD) 463 m.complete(p, MATCH_GUARD)
468} 464}
469 465
470// test block_expr 466// test block
471// fn foo() { 467// fn a() {}
472// {}; 468// fn b() { let _ = 1; }
473// } 469// fn c() { 1; 2; }
474pub(super) fn block_expr(p: &mut Parser) -> CompletedMarker { 470// fn d() { 1; 2 }
471pub(crate) fn block_expr(p: &mut Parser) {
472 if !p.at(T!['{']) {
473 p.error("expected a block");
474 return;
475 }
476 block_expr_unchecked(p);
477}
478
479fn block_expr_unchecked(p: &mut Parser) -> CompletedMarker {
475 assert!(p.at(T!['{'])); 480 assert!(p.at(T!['{']));
476 let m = p.start(); 481 let m = p.start();
477 p.bump(T!['{']); 482 p.bump(T!['{']);
diff --git a/crates/ra_parser/src/grammar/items.rs b/crates/ra_parser/src/grammar/items.rs
index 1503a8730..67a924de5 100644
--- a/crates/ra_parser/src/grammar/items.rs
+++ b/crates/ra_parser/src/grammar/items.rs
@@ -329,7 +329,7 @@ fn fn_def(p: &mut Parser) {
329 if p.at(T![;]) { 329 if p.at(T![;]) {
330 p.bump(T![;]); 330 p.bump(T![;]);
331 } else { 331 } else {
332 expressions::block(p) 332 expressions::block_expr(p)
333 } 333 }
334} 334}
335 335
diff --git a/crates/ra_parser/src/grammar/type_args.rs b/crates/ra_parser/src/grammar/type_args.rs
index 33d9973e9..2d61f9d80 100644
--- a/crates/ra_parser/src/grammar/type_args.rs
+++ b/crates/ra_parser/src/grammar/type_args.rs
@@ -48,7 +48,7 @@ fn type_arg(p: &mut Parser) {
48 m.complete(p, ASSOC_TYPE_ARG); 48 m.complete(p, ASSOC_TYPE_ARG);
49 } 49 }
50 T!['{'] => { 50 T!['{'] => {
51 expressions::block(p); 51 expressions::block_expr(p);
52 m.complete(p, CONST_ARG); 52 m.complete(p, CONST_ARG);
53 } 53 }
54 k if k.is_literal() => { 54 k if k.is_literal() => {
diff --git a/crates/ra_parser/src/lib.rs b/crates/ra_parser/src/lib.rs
index 652492c1e..e08ad4dae 100644
--- a/crates/ra_parser/src/lib.rs
+++ b/crates/ra_parser/src/lib.rs
@@ -112,7 +112,7 @@ pub fn parse_fragment(
112 FragmentKind::Type => grammar::fragments::type_, 112 FragmentKind::Type => grammar::fragments::type_,
113 FragmentKind::Pattern => grammar::fragments::pattern, 113 FragmentKind::Pattern => grammar::fragments::pattern,
114 FragmentKind::Item => grammar::fragments::item, 114 FragmentKind::Item => grammar::fragments::item,
115 FragmentKind::Block => grammar::fragments::block, 115 FragmentKind::Block => grammar::fragments::block_expr,
116 FragmentKind::Visibility => grammar::fragments::opt_visibility, 116 FragmentKind::Visibility => grammar::fragments::opt_visibility,
117 FragmentKind::MetaItem => grammar::fragments::meta_item, 117 FragmentKind::MetaItem => grammar::fragments::meta_item,
118 FragmentKind::Statement => grammar::fragments::stmt, 118 FragmentKind::Statement => grammar::fragments::stmt,
diff --git a/crates/ra_syntax/test_data/parser/err/0010_unsafe_lambda_block.rast b/crates/ra_syntax/test_data/parser/err/0010_unsafe_lambda_block.rast
index 06a326d26..3bf57eacc 100644
--- a/crates/ra_syntax/test_data/parser/err/0010_unsafe_lambda_block.rast
+++ b/crates/ra_syntax/test_data/parser/err/0010_unsafe_lambda_block.rast
@@ -40,5 +40,5 @@ SOURCE_FILE@0..42
40 WHITESPACE@39..40 "\n" 40 WHITESPACE@39..40 "\n"
41 R_CURLY@40..41 "}" 41 R_CURLY@40..41 "}"
42 WHITESPACE@41..42 "\n" 42 WHITESPACE@41..42 "\n"
43error 24..24: expected `{` 43error 24..24: expected a block
44error 24..24: expected SEMICOLON 44error 24..24: expected SEMICOLON
diff --git a/crates/ra_syntax/test_data/parser/err/0163_weird_blocks.rast b/crates/ra_syntax/test_data/parser/err/0163_weird_blocks.rast
new file mode 100644
index 000000000..e46456384
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/err/0163_weird_blocks.rast
@@ -0,0 +1,71 @@
1SOURCE_FILE@0..83
2 FN_DEF@0..82
3 FN_KW@0..2 "fn"
4 WHITESPACE@2..3 " "
5 NAME@3..7
6 IDENT@3..7 "main"
7 PARAM_LIST@7..9
8 L_PAREN@7..8 "("
9 R_PAREN@8..9 ")"
10 WHITESPACE@9..10 " "
11 BLOCK_EXPR@10..82
12 L_CURLY@10..11 "{"
13 WHITESPACE@11..16 "\n "
14 EXPR_STMT@16..29
15 BLOCK_EXPR@16..29
16 L_CURLY@16..17 "{"
17 WHITESPACE@17..18 " "
18 ERROR@18..24
19 UNSAFE_KW@18..24 "unsafe"
20 WHITESPACE@24..25 " "
21 LITERAL@25..27
22 INT_NUMBER@25..27 "92"
23 WHITESPACE@27..28 " "
24 R_CURLY@28..29 "}"
25 WHITESPACE@29..34 "\n "
26 EXPR_STMT@34..46
27 BLOCK_EXPR@34..46
28 L_CURLY@34..35 "{"
29 WHITESPACE@35..36 " "
30 ERROR@36..41
31 ASYNC_KW@36..41 "async"
32 WHITESPACE@41..42 " "
33 LITERAL@42..44
34 INT_NUMBER@42..44 "92"
35 WHITESPACE@44..45 " "
36 R_CURLY@45..46 "}"
37 WHITESPACE@46..51 "\n "
38 EXPR_STMT@51..61
39 BLOCK_EXPR@51..61
40 L_CURLY@51..52 "{"
41 WHITESPACE@52..53 " "
42 EXPR_STMT@53..56
43 EFFECT_EXPR@53..56
44 TRY_KW@53..56 "try"
45 WHITESPACE@56..57 " "
46 LITERAL@57..59
47 INT_NUMBER@57..59 "92"
48 WHITESPACE@59..60 " "
49 R_CURLY@60..61 "}"
50 WHITESPACE@61..66 "\n "
51 BLOCK_EXPR@66..80
52 L_CURLY@66..67 "{"
53 WHITESPACE@67..68 " "
54 EXPR_STMT@68..75
55 ERROR@68..75
56 LABEL@68..75
57 LIFETIME@68..74 "\'label"
58 COLON@74..75 ":"
59 WHITESPACE@75..76 " "
60 LITERAL@76..78
61 INT_NUMBER@76..78 "92"
62 WHITESPACE@78..79 " "
63 R_CURLY@79..80 "}"
64 WHITESPACE@80..81 "\n"
65 R_CURLY@81..82 "}"
66 WHITESPACE@82..83 "\n"
67error 24..24: expected existential, fn, trait or impl
68error 41..41: expected existential, fn, trait or impl
69error 56..56: expected a block
70error 75..75: expected a loop
71error 75..75: expected SEMICOLON
diff --git a/crates/ra_syntax/test_data/parser/err/0163_weird_blocks.rs b/crates/ra_syntax/test_data/parser/err/0163_weird_blocks.rs
new file mode 100644
index 000000000..8fa324c1a
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/err/0163_weird_blocks.rs
@@ -0,0 +1,6 @@
1fn main() {
2 { unsafe 92 }
3 { async 92 }
4 { try 92 }
5 { 'label: 92 }
6}
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0105_block_expr.rast b/crates/ra_syntax/test_data/parser/inline/ok/0105_block_expr.rast
deleted file mode 100644
index f3a5e3096..000000000
--- a/crates/ra_syntax/test_data/parser/inline/ok/0105_block_expr.rast
+++ /dev/null
@@ -1,21 +0,0 @@
1SOURCE_FILE@0..21
2 FN_DEF@0..20
3 FN_KW@0..2 "fn"
4 WHITESPACE@2..3 " "
5 NAME@3..6
6 IDENT@3..6 "foo"
7 PARAM_LIST@6..8
8 L_PAREN@6..7 "("
9 R_PAREN@7..8 ")"
10 WHITESPACE@8..9 " "
11 BLOCK_EXPR@9..20
12 L_CURLY@9..10 "{"
13 WHITESPACE@10..15 "\n "
14 EXPR_STMT@15..18
15 BLOCK_EXPR@15..17
16 L_CURLY@15..16 "{"
17 R_CURLY@16..17 "}"
18 SEMICOLON@17..18 ";"
19 WHITESPACE@18..19 "\n"
20 R_CURLY@19..20 "}"
21 WHITESPACE@20..21 "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0105_block_expr.rs b/crates/ra_syntax/test_data/parser/inline/ok/0105_block_expr.rs
deleted file mode 100644
index 9c6019fb1..000000000
--- a/crates/ra_syntax/test_data/parser/inline/ok/0105_block_expr.rs
+++ /dev/null
@@ -1,3 +0,0 @@
1fn foo() {
2 {};
3}