aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-08-01 08:51:42 +0100
committerAleksey Kladov <[email protected]>2018-08-01 08:56:00 +0100
commit53485030dc49aa7cd66e36c8a1e1abf1bf08020c (patch)
tree26824b67deabd0a4a82bfb948f2a203fdc1814ff
parent490f8ba5b79049dd78c2e7895e8957b36dae3854 (diff)
block expr
-rw-r--r--src/grammar.ron4
-rw-r--r--src/grammar/expressions.rs66
-rw-r--r--src/grammar/items/mod.rs2
-rw-r--r--src/lib.rs1
-rw-r--r--src/syntax_kinds/generated.rs8
-rw-r--r--tests/data/parser/err/0005_attribute_recover.txt4
-rw-r--r--tests/data/parser/err/0007_stray_curly_in_file.txt2
-rw-r--r--tests/data/parser/err/0008_item_block_recovery.txt4
-rw-r--r--tests/data/parser/err/0010_unsafe_lambda_block.rs3
-rw-r--r--tests/data/parser/err/0010_unsafe_lambda_block.txt40
-rw-r--r--tests/data/parser/inline/0001_const_unsafe_fn.txt2
-rw-r--r--tests/data/parser/inline/0002_const_fn.txt2
-rw-r--r--tests/data/parser/inline/0003_extern_block.txt2
-rw-r--r--tests/data/parser/inline/0004_extern_fn.txt2
-rw-r--r--tests/data/parser/inline/0011_unsafe_fn.txt2
-rw-r--r--tests/data/parser/inline/0012_unsafe_extern_fn.txt2
-rw-r--r--tests/data/parser/inline/0013_unsafe_block_in_mod.txt4
-rw-r--r--tests/data/parser/inline/0034_bind_pat.txt2
-rw-r--r--tests/data/parser/inline/0035_ref_pat.txt2
-rw-r--r--tests/data/parser/inline/0036_placeholder_pat.txt2
-rw-r--r--tests/data/parser/inline/0038_fn_item_ret_type.txt4
-rw-r--r--tests/data/parser/inline/0039_path_expr.txt2
-rw-r--r--tests/data/parser/inline/0040_expr_literals.txt2
-rw-r--r--tests/data/parser/inline/0043_call_expr.txt2
-rw-r--r--tests/data/parser/inline/0044_ref_expr.txt2
-rw-r--r--tests/data/parser/inline/0045_block.txt8
-rw-r--r--tests/data/parser/inline/0050_let_stmt;.txt2
-rw-r--r--tests/data/parser/inline/0051_method_call_expr.txt2
-rw-r--r--tests/data/parser/inline/0052_field_expr.txt2
-rw-r--r--tests/data/parser/inline/0053_block_items.txt4
-rw-r--r--tests/data/parser/inline/0054_impl_item_items.txt4
-rw-r--r--tests/data/parser/inline/0055_self_param.txt8
-rw-r--r--tests/data/parser/inline/0059_fn_item_where_clause.txt2
-rw-r--r--tests/data/parser/inline/0060_fn_item_type_params.txt2
-rw-r--r--tests/data/parser/inline/0061_struct_lit.txt2
-rw-r--r--tests/data/parser/inline/0062_deref_expr.txt2
-rw-r--r--tests/data/parser/inline/0063_lambda_expr.txt4
-rw-r--r--tests/data/parser/inline/0064_param_list.txt8
-rw-r--r--tests/data/parser/inline/0065_if_expr.txt14
-rw-r--r--tests/data/parser/inline/0066_lambda_expr.txt4
-rw-r--r--tests/data/parser/inline/0066_not_expr.txt2
-rw-r--r--tests/data/parser/inline/0067_block_expr.rs4
-rw-r--r--tests/data/parser/inline/0067_block_expr.txt29
-rw-r--r--tests/data/parser/ok/0005_fn_item.txt2
-rw-r--r--tests/data/parser/ok/0008_mod_item.txt2
-rw-r--r--tests/data/parser/ok/0011_outer_attribute.txt2
-rw-r--r--tests/data/parser/ok/0012_visibility.txt10
-rw-r--r--tests/data/parser/ok/0017_attr_trailing_comma.txt2
-rw-r--r--tests/data/parser/ok/0021_extern_fn.txt6
-rw-r--r--tests/data/parser/ok/0022_empty_extern_block.txt4
50 files changed, 195 insertions, 104 deletions
diff --git a/src/grammar.ron b/src/grammar.ron
index b4c121f4d..109556561 100644
--- a/src/grammar.ron
+++ b/src/grammar.ron
@@ -139,7 +139,7 @@ Grammar(
139 "STRUCT_LIT_FIELD", 139 "STRUCT_LIT_FIELD",
140 "IF_EXPR", 140 "IF_EXPR",
141 141
142 "EXTERN_BLOCK", 142 "EXTERN_BLOCK_EXPR",
143 "ENUM_VARIANT", 143 "ENUM_VARIANT",
144 "NAMED_FIELD", 144 "NAMED_FIELD",
145 "POS_FIELD", 145 "POS_FIELD",
@@ -155,7 +155,7 @@ Grammar(
155 "ABI", 155 "ABI",
156 "NAME", 156 "NAME",
157 "NAME_REF", 157 "NAME_REF",
158 "BLOCK", 158 "BLOCK_EXPR",
159 159
160 "LET_STMT", 160 "LET_STMT",
161 "EXPR_STMT", 161 "EXPR_STMT",
diff --git a/src/grammar/expressions.rs b/src/grammar/expressions.rs
index c0eb0e756..5c59843a4 100644
--- a/src/grammar/expressions.rs
+++ b/src/grammar/expressions.rs
@@ -53,31 +53,9 @@ pub(super) fn expr(p: &mut Parser) {
53pub(super) fn block(p: &mut Parser) { 53pub(super) fn block(p: &mut Parser) {
54 if !p.at(L_CURLY) { 54 if !p.at(L_CURLY) {
55 p.error("expected block"); 55 p.error("expected block");
56 return;
56 } 57 }
57 let m = p.start(); 58 block_expr(p);
58 p.bump();
59 while !p.at(EOF) && !p.at(R_CURLY) {
60 match p.current() {
61 LET_KW => let_stmt(p),
62 c => {
63 // test block_items
64 // fn a() { fn b() {} }
65 if items::ITEM_FIRST.contains(c) {
66 items::item(p)
67 } else {
68 let expr_stmt = p.start();
69 expressions::expr(p);
70 if p.eat(SEMI) {
71 expr_stmt.complete(p, EXPR_STMT);
72 } else {
73 expr_stmt.abandon(p);
74 }
75 }
76 }
77 }
78 }
79 p.expect(R_CURLY);
80 m.complete(p, BLOCK);
81} 59}
82 60
83// test let_stmt; 61// test let_stmt;
@@ -158,12 +136,14 @@ fn atom_expr(p: &mut Parser) -> Option<CompletedMarker> {
158 if paths::is_path_start(p) { 136 if paths::is_path_start(p) {
159 return Some(path_expr(p)); 137 return Some(path_expr(p));
160 } 138 }
161 139 let la = p.nth(1);
162 let done = match p.current() { 140 let done = match p.current() {
163 L_PAREN => tuple_expr(p), 141 L_PAREN => tuple_expr(p),
164 PIPE => lambda_expr(p), 142 PIPE => lambda_expr(p),
165 MOVE_KW if p.nth(1) == PIPE => lambda_expr(p), 143 MOVE_KW if la == PIPE => lambda_expr(p),
166 IF_KW => if_expr(p), 144 IF_KW => if_expr(p),
145 UNSAFE_KW if la == L_CURLY => block_expr(p),
146 L_CURLY => block_expr(p),
167 _ => { 147 _ => {
168 p.err_and_bump("expected expression"); 148 p.err_and_bump("expected expression");
169 return None; 149 return None;
@@ -223,6 +203,40 @@ fn if_expr(p: &mut Parser) -> CompletedMarker {
223 m.complete(p, IF_EXPR) 203 m.complete(p, IF_EXPR)
224} 204}
225 205
206// test block_expr
207// fn foo() {
208// {};
209// unsafe {};
210// }
211fn block_expr(p: &mut Parser) -> CompletedMarker {
212 assert!(p.at(L_CURLY) || p.at(UNSAFE_KW) && p.nth(1) == L_CURLY);
213 let m = p.start();
214 p.eat(UNSAFE_KW);
215 p.bump();
216 while !p.at(EOF) && !p.at(R_CURLY) {
217 match p.current() {
218 LET_KW => let_stmt(p),
219 c => {
220 // test block_items
221 // fn a() { fn b() {} }
222 if items::ITEM_FIRST.contains(c) {
223 items::item(p)
224 } else {
225 let expr_stmt = p.start();
226 expressions::expr(p);
227 if p.eat(SEMI) {
228 expr_stmt.complete(p, EXPR_STMT);
229 } else {
230 expr_stmt.abandon(p);
231 }
232 }
233 }
234 }
235 }
236 p.expect(R_CURLY);
237 m.complete(p, BLOCK_EXPR)
238}
239
226// test call_expr 240// test call_expr
227// fn foo() { 241// fn foo() {
228// let _ = f(); 242// let _ = f();
diff --git a/src/grammar/items/mod.rs b/src/grammar/items/mod.rs
index d5f75f13d..a1150e2ac 100644
--- a/src/grammar/items/mod.rs
+++ b/src/grammar/items/mod.rs
@@ -44,7 +44,7 @@ pub(super) fn item(p: &mut Parser) {
44 // extern {} 44 // extern {}
45 L_CURLY => { 45 L_CURLY => {
46 extern_block(p); 46 extern_block(p);
47 EXTERN_BLOCK 47 EXTERN_BLOCK_EXPR
48 } 48 }
49 // test extern_struct 49 // test extern_struct
50 // extern struct Foo; 50 // extern struct Foo;
diff --git a/src/lib.rs b/src/lib.rs
index 611b87492..1cd45690a 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -45,6 +45,7 @@ pub use {
45 yellow::{SyntaxNode, SyntaxNodeRef, SyntaxRoot, TreeRoot}, 45 yellow::{SyntaxNode, SyntaxNodeRef, SyntaxRoot, TreeRoot},
46}; 46};
47 47
48
48pub fn parse(text: &str) -> SyntaxNode { 49pub fn parse(text: &str) -> SyntaxNode {
49 let tokens = tokenize(&text); 50 let tokens = tokenize(&text);
50 parser_impl::parse::<yellow::GreenBuilder>(text, &tokens) 51 parser_impl::parse::<yellow::GreenBuilder>(text, &tokens)
diff --git a/src/syntax_kinds/generated.rs b/src/syntax_kinds/generated.rs
index cbcd0c4e1..5f26cbf0a 100644
--- a/src/syntax_kinds/generated.rs
+++ b/src/syntax_kinds/generated.rs
@@ -129,7 +129,7 @@ pub enum SyntaxKind {
129 STRUCT_LIT, 129 STRUCT_LIT,
130 STRUCT_LIT_FIELD, 130 STRUCT_LIT_FIELD,
131 IF_EXPR, 131 IF_EXPR,
132 EXTERN_BLOCK, 132 EXTERN_BLOCK_EXPR,
133 ENUM_VARIANT, 133 ENUM_VARIANT,
134 NAMED_FIELD, 134 NAMED_FIELD,
135 POS_FIELD, 135 POS_FIELD,
@@ -145,7 +145,7 @@ pub enum SyntaxKind {
145 ABI, 145 ABI,
146 NAME, 146 NAME,
147 NAME_REF, 147 NAME_REF,
148 BLOCK, 148 BLOCK_EXPR,
149 LET_STMT, 149 LET_STMT,
150 EXPR_STMT, 150 EXPR_STMT,
151 TYPE_PARAM_LIST, 151 TYPE_PARAM_LIST,
@@ -336,7 +336,7 @@ impl SyntaxKind {
336 STRUCT_LIT => &SyntaxInfo { name: "STRUCT_LIT" }, 336 STRUCT_LIT => &SyntaxInfo { name: "STRUCT_LIT" },
337 STRUCT_LIT_FIELD => &SyntaxInfo { name: "STRUCT_LIT_FIELD" }, 337 STRUCT_LIT_FIELD => &SyntaxInfo { name: "STRUCT_LIT_FIELD" },
338 IF_EXPR => &SyntaxInfo { name: "IF_EXPR" }, 338 IF_EXPR => &SyntaxInfo { name: "IF_EXPR" },
339 EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" }, 339 EXTERN_BLOCK_EXPR => &SyntaxInfo { name: "EXTERN_BLOCK_EXPR" },
340 ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" }, 340 ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" },
341 NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" }, 341 NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },
342 POS_FIELD => &SyntaxInfo { name: "POS_FIELD" }, 342 POS_FIELD => &SyntaxInfo { name: "POS_FIELD" },
@@ -352,7 +352,7 @@ impl SyntaxKind {
352 ABI => &SyntaxInfo { name: "ABI" }, 352 ABI => &SyntaxInfo { name: "ABI" },
353 NAME => &SyntaxInfo { name: "NAME" }, 353 NAME => &SyntaxInfo { name: "NAME" },
354 NAME_REF => &SyntaxInfo { name: "NAME_REF" }, 354 NAME_REF => &SyntaxInfo { name: "NAME_REF" },
355 BLOCK => &SyntaxInfo { name: "BLOCK" }, 355 BLOCK_EXPR => &SyntaxInfo { name: "BLOCK_EXPR" },
356 LET_STMT => &SyntaxInfo { name: "LET_STMT" }, 356 LET_STMT => &SyntaxInfo { name: "LET_STMT" },
357 EXPR_STMT => &SyntaxInfo { name: "EXPR_STMT" }, 357 EXPR_STMT => &SyntaxInfo { name: "EXPR_STMT" },
358 TYPE_PARAM_LIST => &SyntaxInfo { name: "TYPE_PARAM_LIST" }, 358 TYPE_PARAM_LIST => &SyntaxInfo { name: "TYPE_PARAM_LIST" },
diff --git a/tests/data/parser/err/0005_attribute_recover.txt b/tests/data/parser/err/0005_attribute_recover.txt
index 9dea0f7d9..0ab73b46d 100644
--- a/tests/data/parser/err/0005_attribute_recover.txt
+++ b/tests/data/parser/err/0005_attribute_recover.txt
@@ -30,7 +30,7 @@ FILE@[0; 54)
30 L_PAREN@[25; 26) 30 L_PAREN@[25; 26)
31 R_PAREN@[26; 27) 31 R_PAREN@[26; 27)
32 WHITESPACE@[27; 28) 32 WHITESPACE@[27; 28)
33 BLOCK@[28; 34) 33 BLOCK_EXPR@[28; 34)
34 L_CURLY@[28; 29) 34 L_CURLY@[28; 29)
35 WHITESPACE@[29; 30) 35 WHITESPACE@[29; 30)
36 R_CURLY@[30; 31) 36 R_CURLY@[30; 31)
@@ -53,7 +53,7 @@ FILE@[0; 54)
53 L_PAREN@[47; 48) 53 L_PAREN@[47; 48)
54 R_PAREN@[48; 49) 54 R_PAREN@[48; 49)
55 WHITESPACE@[49; 50) 55 WHITESPACE@[49; 50)
56 BLOCK@[50; 54) 56 BLOCK_EXPR@[50; 54)
57 L_CURLY@[50; 51) 57 L_CURLY@[50; 51)
58 WHITESPACE@[51; 52) 58 WHITESPACE@[51; 52)
59 R_CURLY@[52; 53) 59 R_CURLY@[52; 53)
diff --git a/tests/data/parser/err/0007_stray_curly_in_file.txt b/tests/data/parser/err/0007_stray_curly_in_file.txt
index 07c99e9fc..9758a969f 100644
--- a/tests/data/parser/err/0007_stray_curly_in_file.txt
+++ b/tests/data/parser/err/0007_stray_curly_in_file.txt
@@ -22,7 +22,7 @@ FILE@[0; 31)
22 PARAM_LIST@[23; 25) 22 PARAM_LIST@[23; 25)
23 L_PAREN@[23; 24) 23 L_PAREN@[23; 24)
24 R_PAREN@[24; 25) 24 R_PAREN@[24; 25)
25 BLOCK@[25; 29) 25 BLOCK_EXPR@[25; 29)
26 L_CURLY@[25; 26) 26 L_CURLY@[25; 26)
27 R_CURLY@[26; 27) 27 R_CURLY@[26; 27)
28 WHITESPACE@[27; 29) 28 WHITESPACE@[27; 29)
diff --git a/tests/data/parser/err/0008_item_block_recovery.txt b/tests/data/parser/err/0008_item_block_recovery.txt
index 81a5dd4c3..5bc62b6e1 100644
--- a/tests/data/parser/err/0008_item_block_recovery.txt
+++ b/tests/data/parser/err/0008_item_block_recovery.txt
@@ -8,7 +8,7 @@ FILE@[0; 95)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 14) 11 BLOCK_EXPR@[9; 14)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 WHITESPACE@[10; 11) 13 WHITESPACE@[10; 11)
14 R_CURLY@[11; 12) 14 R_CURLY@[11; 12)
@@ -60,7 +60,7 @@ FILE@[0; 95)
60 L_PAREN@[88; 89) 60 L_PAREN@[88; 89)
61 R_PAREN@[89; 90) 61 R_PAREN@[89; 90)
62 WHITESPACE@[90; 91) 62 WHITESPACE@[90; 91)
63 BLOCK@[91; 95) 63 BLOCK_EXPR@[91; 95)
64 L_CURLY@[91; 92) 64 L_CURLY@[91; 92)
65 WHITESPACE@[92; 93) 65 WHITESPACE@[92; 93)
66 R_CURLY@[93; 94) 66 R_CURLY@[93; 94)
diff --git a/tests/data/parser/err/0010_unsafe_lambda_block.rs b/tests/data/parser/err/0010_unsafe_lambda_block.rs
new file mode 100644
index 000000000..985775282
--- /dev/null
+++ b/tests/data/parser/err/0010_unsafe_lambda_block.rs
@@ -0,0 +1,3 @@
1fn main() {
2 || -> () unsafe { () };
3}
diff --git a/tests/data/parser/err/0010_unsafe_lambda_block.txt b/tests/data/parser/err/0010_unsafe_lambda_block.txt
new file mode 100644
index 000000000..a8791a595
--- /dev/null
+++ b/tests/data/parser/err/0010_unsafe_lambda_block.txt
@@ -0,0 +1,40 @@
1FILE@[0; 42)
2 FN_ITEM@[0; 42)
3 FN_KW@[0; 2)
4 NAME@[2; 7)
5 WHITESPACE@[2; 3)
6 IDENT@[3; 7) "main"
7 PARAM_LIST@[7; 10)
8 L_PAREN@[7; 8)
9 R_PAREN@[8; 9)
10 WHITESPACE@[9; 10)
11 BLOCK_EXPR@[10; 42)
12 L_CURLY@[10; 11)
13 LAMBDA_EXPR@[11; 25)
14 PARAM_LIST@[11; 19)
15 WHITESPACE@[11; 16)
16 PIPE@[16; 17)
17 PIPE@[17; 18)
18 WHITESPACE@[18; 19)
19 THIN_ARROW@[19; 21)
20 TUPLE_TYPE@[21; 25)
21 WHITESPACE@[21; 22)
22 L_PAREN@[22; 23)
23 R_PAREN@[23; 24)
24 WHITESPACE@[24; 25)
25 err: `expected block`
26 EXPR_STMT@[25; 40)
27 BLOCK_EXPR@[25; 38)
28 UNSAFE_KW@[25; 31)
29 WHITESPACE@[31; 32)
30 L_CURLY@[32; 33)
31 TUPLE_EXPR@[33; 37)
32 WHITESPACE@[33; 34)
33 L_PAREN@[34; 35)
34 R_PAREN@[35; 36)
35 WHITESPACE@[36; 37)
36 R_CURLY@[37; 38)
37 SEMI@[38; 39)
38 WHITESPACE@[39; 40)
39 R_CURLY@[40; 41)
40 WHITESPACE@[41; 42)
diff --git a/tests/data/parser/inline/0001_const_unsafe_fn.txt b/tests/data/parser/inline/0001_const_unsafe_fn.txt
index a06674e61..e5819919f 100644
--- a/tests/data/parser/inline/0001_const_unsafe_fn.txt
+++ b/tests/data/parser/inline/0001_const_unsafe_fn.txt
@@ -12,7 +12,7 @@ FILE@[0; 25)
12 L_PAREN@[19; 20) 12 L_PAREN@[19; 20)
13 R_PAREN@[20; 21) 13 R_PAREN@[20; 21)
14 WHITESPACE@[21; 22) 14 WHITESPACE@[21; 22)
15 BLOCK@[22; 25) 15 BLOCK_EXPR@[22; 25)
16 L_CURLY@[22; 23) 16 L_CURLY@[22; 23)
17 R_CURLY@[23; 24) 17 R_CURLY@[23; 24)
18 WHITESPACE@[24; 25) 18 WHITESPACE@[24; 25)
diff --git a/tests/data/parser/inline/0002_const_fn.txt b/tests/data/parser/inline/0002_const_fn.txt
index 8feacb191..aa7747f51 100644
--- a/tests/data/parser/inline/0002_const_fn.txt
+++ b/tests/data/parser/inline/0002_const_fn.txt
@@ -10,7 +10,7 @@ FILE@[0; 18)
10 L_PAREN@[12; 13) 10 L_PAREN@[12; 13)
11 R_PAREN@[13; 14) 11 R_PAREN@[13; 14)
12 WHITESPACE@[14; 15) 12 WHITESPACE@[14; 15)
13 BLOCK@[15; 18) 13 BLOCK_EXPR@[15; 18)
14 L_CURLY@[15; 16) 14 L_CURLY@[15; 16)
15 R_CURLY@[16; 17) 15 R_CURLY@[16; 17)
16 WHITESPACE@[17; 18) 16 WHITESPACE@[17; 18)
diff --git a/tests/data/parser/inline/0003_extern_block.txt b/tests/data/parser/inline/0003_extern_block.txt
index 588502932..24ef8f5ac 100644
--- a/tests/data/parser/inline/0003_extern_block.txt
+++ b/tests/data/parser/inline/0003_extern_block.txt
@@ -1,5 +1,5 @@
1FILE@[0; 10) 1FILE@[0; 10)
2 EXTERN_BLOCK@[0; 10) 2 EXTERN_BLOCK_EXPR@[0; 10)
3 ABI@[0; 7) 3 ABI@[0; 7)
4 EXTERN_KW@[0; 6) 4 EXTERN_KW@[0; 6)
5 WHITESPACE@[6; 7) 5 WHITESPACE@[6; 7)
diff --git a/tests/data/parser/inline/0004_extern_fn.txt b/tests/data/parser/inline/0004_extern_fn.txt
index ca79112b9..3c4663da9 100644
--- a/tests/data/parser/inline/0004_extern_fn.txt
+++ b/tests/data/parser/inline/0004_extern_fn.txt
@@ -11,7 +11,7 @@ FILE@[0; 19)
11 L_PAREN@[13; 14) 11 L_PAREN@[13; 14)
12 R_PAREN@[14; 15) 12 R_PAREN@[14; 15)
13 WHITESPACE@[15; 16) 13 WHITESPACE@[15; 16)
14 BLOCK@[16; 19) 14 BLOCK_EXPR@[16; 19)
15 L_CURLY@[16; 17) 15 L_CURLY@[16; 17)
16 R_CURLY@[17; 18) 16 R_CURLY@[17; 18)
17 WHITESPACE@[18; 19) 17 WHITESPACE@[18; 19)
diff --git a/tests/data/parser/inline/0011_unsafe_fn.txt b/tests/data/parser/inline/0011_unsafe_fn.txt
index b0ef1e2cd..1fdff8d4b 100644
--- a/tests/data/parser/inline/0011_unsafe_fn.txt
+++ b/tests/data/parser/inline/0011_unsafe_fn.txt
@@ -10,7 +10,7 @@ FILE@[0; 19)
10 L_PAREN@[13; 14) 10 L_PAREN@[13; 14)
11 R_PAREN@[14; 15) 11 R_PAREN@[14; 15)
12 WHITESPACE@[15; 16) 12 WHITESPACE@[15; 16)
13 BLOCK@[16; 19) 13 BLOCK_EXPR@[16; 19)
14 L_CURLY@[16; 17) 14 L_CURLY@[16; 17)
15 R_CURLY@[17; 18) 15 R_CURLY@[17; 18)
16 WHITESPACE@[18; 19) 16 WHITESPACE@[18; 19)
diff --git a/tests/data/parser/inline/0012_unsafe_extern_fn.txt b/tests/data/parser/inline/0012_unsafe_extern_fn.txt
index 3fef8ec22..ad3bd8542 100644
--- a/tests/data/parser/inline/0012_unsafe_extern_fn.txt
+++ b/tests/data/parser/inline/0012_unsafe_extern_fn.txt
@@ -15,7 +15,7 @@ FILE@[0; 30)
15 L_PAREN@[24; 25) 15 L_PAREN@[24; 25)
16 R_PAREN@[25; 26) 16 R_PAREN@[25; 26)
17 WHITESPACE@[26; 27) 17 WHITESPACE@[26; 27)
18 BLOCK@[27; 30) 18 BLOCK_EXPR@[27; 30)
19 L_CURLY@[27; 28) 19 L_CURLY@[27; 28)
20 R_CURLY@[28; 29) 20 R_CURLY@[28; 29)
21 WHITESPACE@[29; 30) 21 WHITESPACE@[29; 30)
diff --git a/tests/data/parser/inline/0013_unsafe_block_in_mod.txt b/tests/data/parser/inline/0013_unsafe_block_in_mod.txt
index 77644d52c..e5581d615 100644
--- a/tests/data/parser/inline/0013_unsafe_block_in_mod.txt
+++ b/tests/data/parser/inline/0013_unsafe_block_in_mod.txt
@@ -7,7 +7,7 @@ FILE@[0; 33)
7 PARAM_LIST@[6; 8) 7 PARAM_LIST@[6; 8)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 BLOCK@[8; 11) 10 BLOCK_EXPR@[8; 11)
11 L_CURLY@[8; 9) 11 L_CURLY@[8; 9)
12 R_CURLY@[9; 10) 12 R_CURLY@[9; 10)
13 WHITESPACE@[10; 11) 13 WHITESPACE@[10; 11)
@@ -27,7 +27,7 @@ FILE@[0; 33)
27 PARAM_LIST@[28; 30) 27 PARAM_LIST@[28; 30)
28 L_PAREN@[28; 29) 28 L_PAREN@[28; 29)
29 R_PAREN@[29; 30) 29 R_PAREN@[29; 30)
30 BLOCK@[30; 33) 30 BLOCK_EXPR@[30; 33)
31 L_CURLY@[30; 31) 31 L_CURLY@[30; 31)
32 R_CURLY@[31; 32) 32 R_CURLY@[31; 32)
33 WHITESPACE@[32; 33) 33 WHITESPACE@[32; 33)
diff --git a/tests/data/parser/inline/0034_bind_pat.txt b/tests/data/parser/inline/0034_bind_pat.txt
index f4eb8bc4d..d23678fbe 100644
--- a/tests/data/parser/inline/0034_bind_pat.txt
+++ b/tests/data/parser/inline/0034_bind_pat.txt
@@ -8,7 +8,7 @@ FILE@[0; 146)
8 L_PAREN@[7; 8) 8 L_PAREN@[7; 8)
9 R_PAREN@[8; 9) 9 R_PAREN@[8; 9)
10 WHITESPACE@[9; 10) 10 WHITESPACE@[9; 10)
11 BLOCK@[10; 146) 11 BLOCK_EXPR@[10; 146)
12 L_CURLY@[10; 11) 12 L_CURLY@[10; 11)
13 LET_STMT@[11; 32) 13 LET_STMT@[11; 32)
14 WHITESPACE@[11; 16) 14 WHITESPACE@[11; 16)
diff --git a/tests/data/parser/inline/0035_ref_pat.txt b/tests/data/parser/inline/0035_ref_pat.txt
index 83700c1d8..27a31d2ab 100644
--- a/tests/data/parser/inline/0035_ref_pat.txt
+++ b/tests/data/parser/inline/0035_ref_pat.txt
@@ -8,7 +8,7 @@ FILE@[0; 52)
8 L_PAREN@[7; 8) 8 L_PAREN@[7; 8)
9 R_PAREN@[8; 9) 9 R_PAREN@[8; 9)
10 WHITESPACE@[9; 10) 10 WHITESPACE@[9; 10)
11 BLOCK@[10; 52) 11 BLOCK_EXPR@[10; 52)
12 L_CURLY@[10; 11) 12 L_CURLY@[10; 11)
13 LET_STMT@[11; 33) 13 LET_STMT@[11; 33)
14 WHITESPACE@[11; 16) 14 WHITESPACE@[11; 16)
diff --git a/tests/data/parser/inline/0036_placeholder_pat.txt b/tests/data/parser/inline/0036_placeholder_pat.txt
index 8bc547510..2d7fd0627 100644
--- a/tests/data/parser/inline/0036_placeholder_pat.txt
+++ b/tests/data/parser/inline/0036_placeholder_pat.txt
@@ -8,7 +8,7 @@ FILE@[0; 26)
8 L_PAREN@[7; 8) 8 L_PAREN@[7; 8)
9 R_PAREN@[8; 9) 9 R_PAREN@[8; 9)
10 WHITESPACE@[9; 10) 10 WHITESPACE@[9; 10)
11 BLOCK@[10; 26) 11 BLOCK_EXPR@[10; 26)
12 L_CURLY@[10; 11) 12 L_CURLY@[10; 11)
13 LET_STMT@[11; 24) 13 LET_STMT@[11; 24)
14 WHITESPACE@[11; 12) 14 WHITESPACE@[11; 12)
diff --git a/tests/data/parser/inline/0038_fn_item_ret_type.txt b/tests/data/parser/inline/0038_fn_item_ret_type.txt
index 5f77cf595..391971721 100644
--- a/tests/data/parser/inline/0038_fn_item_ret_type.txt
+++ b/tests/data/parser/inline/0038_fn_item_ret_type.txt
@@ -8,7 +8,7 @@ FILE@[0; 30)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 12) 11 BLOCK_EXPR@[9; 12)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 R_CURLY@[10; 11) 13 R_CURLY@[10; 11)
14 WHITESPACE@[11; 12) 14 WHITESPACE@[11; 12)
@@ -27,7 +27,7 @@ FILE@[0; 30)
27 L_PAREN@[24; 25) 27 L_PAREN@[24; 25)
28 R_PAREN@[25; 26) 28 R_PAREN@[25; 26)
29 WHITESPACE@[26; 27) 29 WHITESPACE@[26; 27)
30 BLOCK@[27; 30) 30 BLOCK_EXPR@[27; 30)
31 L_CURLY@[27; 28) 31 L_CURLY@[27; 28)
32 R_CURLY@[28; 29) 32 R_CURLY@[28; 29)
33 WHITESPACE@[29; 30) 33 WHITESPACE@[29; 30)
diff --git a/tests/data/parser/inline/0039_path_expr.txt b/tests/data/parser/inline/0039_path_expr.txt
index c3fc0c4bf..a646f523f 100644
--- a/tests/data/parser/inline/0039_path_expr.txt
+++ b/tests/data/parser/inline/0039_path_expr.txt
@@ -8,7 +8,7 @@ FILE@[0; 68)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 68) 11 BLOCK_EXPR@[9; 68)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 LET_STMT@[10; 30) 13 LET_STMT@[10; 30)
14 WHITESPACE@[10; 15) 14 WHITESPACE@[10; 15)
diff --git a/tests/data/parser/inline/0040_expr_literals.txt b/tests/data/parser/inline/0040_expr_literals.txt
index 94f738397..f6a843a48 100644
--- a/tests/data/parser/inline/0040_expr_literals.txt
+++ b/tests/data/parser/inline/0040_expr_literals.txt
@@ -8,7 +8,7 @@ FILE@[0; 189)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 189) 11 BLOCK_EXPR@[9; 189)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 LET_STMT@[10; 33) 13 LET_STMT@[10; 33)
14 WHITESPACE@[10; 15) 14 WHITESPACE@[10; 15)
diff --git a/tests/data/parser/inline/0043_call_expr.txt b/tests/data/parser/inline/0043_call_expr.txt
index fe5380cab..5df6bb6d5 100644
--- a/tests/data/parser/inline/0043_call_expr.txt
+++ b/tests/data/parser/inline/0043_call_expr.txt
@@ -8,7 +8,7 @@ FILE@[0; 57)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 57) 11 BLOCK_EXPR@[9; 57)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 LET_STMT@[10; 32) 13 LET_STMT@[10; 32)
14 WHITESPACE@[10; 15) 14 WHITESPACE@[10; 15)
diff --git a/tests/data/parser/inline/0044_ref_expr.txt b/tests/data/parser/inline/0044_ref_expr.txt
index b25769972..65cdfb665 100644
--- a/tests/data/parser/inline/0044_ref_expr.txt
+++ b/tests/data/parser/inline/0044_ref_expr.txt
@@ -8,7 +8,7 @@ FILE@[0; 52)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 52) 11 BLOCK_EXPR@[9; 52)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 LET_STMT@[10; 31) 13 LET_STMT@[10; 31)
14 WHITESPACE@[10; 15) 14 WHITESPACE@[10; 15)
diff --git a/tests/data/parser/inline/0045_block.txt b/tests/data/parser/inline/0045_block.txt
index 1f65cf92c..25ed3fe5a 100644
--- a/tests/data/parser/inline/0045_block.txt
+++ b/tests/data/parser/inline/0045_block.txt
@@ -8,7 +8,7 @@ FILE@[0; 65)
8 L_PAREN@[4; 5) 8 L_PAREN@[4; 5)
9 R_PAREN@[5; 6) 9 R_PAREN@[5; 6)
10 WHITESPACE@[6; 7) 10 WHITESPACE@[6; 7)
11 BLOCK@[7; 10) 11 BLOCK_EXPR@[7; 10)
12 L_CURLY@[7; 8) 12 L_CURLY@[7; 8)
13 R_CURLY@[8; 9) 13 R_CURLY@[8; 9)
14 WHITESPACE@[9; 10) 14 WHITESPACE@[9; 10)
@@ -21,7 +21,7 @@ FILE@[0; 65)
21 L_PAREN@[14; 15) 21 L_PAREN@[14; 15)
22 R_PAREN@[15; 16) 22 R_PAREN@[15; 16)
23 WHITESPACE@[16; 17) 23 WHITESPACE@[16; 17)
24 BLOCK@[17; 32) 24 BLOCK_EXPR@[17; 32)
25 L_CURLY@[17; 18) 25 L_CURLY@[17; 18)
26 LET_STMT@[18; 30) 26 LET_STMT@[18; 30)
27 WHITESPACE@[18; 19) 27 WHITESPACE@[18; 19)
@@ -47,7 +47,7 @@ FILE@[0; 65)
47 L_PAREN@[36; 37) 47 L_PAREN@[36; 37)
48 R_PAREN@[37; 38) 48 R_PAREN@[37; 38)
49 WHITESPACE@[38; 39) 49 WHITESPACE@[38; 39)
50 BLOCK@[39; 49) 50 BLOCK_EXPR@[39; 49)
51 L_CURLY@[39; 40) 51 L_CURLY@[39; 40)
52 EXPR_STMT@[40; 44) 52 EXPR_STMT@[40; 44)
53 LITERAL@[40; 42) 53 LITERAL@[40; 42)
@@ -71,7 +71,7 @@ FILE@[0; 65)
71 L_PAREN@[53; 54) 71 L_PAREN@[53; 54)
72 R_PAREN@[54; 55) 72 R_PAREN@[54; 55)
73 WHITESPACE@[55; 56) 73 WHITESPACE@[55; 56)
74 BLOCK@[56; 65) 74 BLOCK_EXPR@[56; 65)
75 L_CURLY@[56; 57) 75 L_CURLY@[56; 57)
76 EXPR_STMT@[57; 61) 76 EXPR_STMT@[57; 61)
77 LITERAL@[57; 59) 77 LITERAL@[57; 59)
diff --git a/tests/data/parser/inline/0050_let_stmt;.txt b/tests/data/parser/inline/0050_let_stmt;.txt
index c909302bb..de218cb8d 100644
--- a/tests/data/parser/inline/0050_let_stmt;.txt
+++ b/tests/data/parser/inline/0050_let_stmt;.txt
@@ -8,7 +8,7 @@ FILE@[0; 77)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 77) 11 BLOCK_EXPR@[9; 77)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 LET_STMT@[10; 26) 13 LET_STMT@[10; 26)
14 WHITESPACE@[10; 15) 14 WHITESPACE@[10; 15)
diff --git a/tests/data/parser/inline/0051_method_call_expr.txt b/tests/data/parser/inline/0051_method_call_expr.txt
index 319d142e0..bf3705878 100644
--- a/tests/data/parser/inline/0051_method_call_expr.txt
+++ b/tests/data/parser/inline/0051_method_call_expr.txt
@@ -8,7 +8,7 @@ FILE@[0; 44)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 44) 11 BLOCK_EXPR@[9; 44)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 EXPR_STMT@[10; 28) 13 EXPR_STMT@[10; 28)
14 METHOD_CALL_EXPR@[10; 22) 14 METHOD_CALL_EXPR@[10; 22)
diff --git a/tests/data/parser/inline/0052_field_expr.txt b/tests/data/parser/inline/0052_field_expr.txt
index 7e79c396c..79d2fbc19 100644
--- a/tests/data/parser/inline/0052_field_expr.txt
+++ b/tests/data/parser/inline/0052_field_expr.txt
@@ -8,7 +8,7 @@ FILE@[0; 37)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 37) 11 BLOCK_EXPR@[9; 37)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 EXPR_STMT@[10; 26) 13 EXPR_STMT@[10; 26)
14 FIELD_EXPR@[10; 20) 14 FIELD_EXPR@[10; 20)
diff --git a/tests/data/parser/inline/0053_block_items.txt b/tests/data/parser/inline/0053_block_items.txt
index 1b1158aa5..3d14144d8 100644
--- a/tests/data/parser/inline/0053_block_items.txt
+++ b/tests/data/parser/inline/0053_block_items.txt
@@ -8,7 +8,7 @@ FILE@[0; 21)
8 L_PAREN@[4; 5) 8 L_PAREN@[4; 5)
9 R_PAREN@[5; 6) 9 R_PAREN@[5; 6)
10 WHITESPACE@[6; 7) 10 WHITESPACE@[6; 7)
11 BLOCK@[7; 21) 11 BLOCK_EXPR@[7; 21)
12 L_CURLY@[7; 8) 12 L_CURLY@[7; 8)
13 FN_ITEM@[8; 19) 13 FN_ITEM@[8; 19)
14 WHITESPACE@[8; 9) 14 WHITESPACE@[8; 9)
@@ -20,7 +20,7 @@ FILE@[0; 21)
20 L_PAREN@[13; 14) 20 L_PAREN@[13; 14)
21 R_PAREN@[14; 15) 21 R_PAREN@[14; 15)
22 WHITESPACE@[15; 16) 22 WHITESPACE@[15; 16)
23 BLOCK@[16; 19) 23 BLOCK_EXPR@[16; 19)
24 L_CURLY@[16; 17) 24 L_CURLY@[16; 17)
25 R_CURLY@[17; 18) 25 R_CURLY@[17; 18)
26 WHITESPACE@[18; 19) 26 WHITESPACE@[18; 19)
diff --git a/tests/data/parser/inline/0054_impl_item_items.txt b/tests/data/parser/inline/0054_impl_item_items.txt
index dd17a8ebb..ee98619b4 100644
--- a/tests/data/parser/inline/0054_impl_item_items.txt
+++ b/tests/data/parser/inline/0054_impl_item_items.txt
@@ -53,7 +53,7 @@ FILE@[0; 89)
53 L_PAREN@[60; 61) 53 L_PAREN@[60; 61)
54 R_PAREN@[61; 62) 54 R_PAREN@[61; 62)
55 WHITESPACE@[62; 63) 55 WHITESPACE@[62; 63)
56 BLOCK@[63; 70) 56 BLOCK_EXPR@[63; 70)
57 L_CURLY@[63; 64) 57 L_CURLY@[63; 64)
58 R_CURLY@[64; 65) 58 R_CURLY@[64; 65)
59 WHITESPACE@[65; 70) 59 WHITESPACE@[65; 70)
@@ -69,7 +69,7 @@ FILE@[0; 89)
69 SELF_KW@[78; 82) 69 SELF_KW@[78; 82)
70 R_PAREN@[82; 83) 70 R_PAREN@[82; 83)
71 WHITESPACE@[83; 84) 71 WHITESPACE@[83; 84)
72 BLOCK@[84; 87) 72 BLOCK_EXPR@[84; 87)
73 L_CURLY@[84; 85) 73 L_CURLY@[84; 85)
74 R_CURLY@[85; 86) 74 R_CURLY@[85; 86)
75 WHITESPACE@[86; 87) 75 WHITESPACE@[86; 87)
diff --git a/tests/data/parser/inline/0055_self_param.txt b/tests/data/parser/inline/0055_self_param.txt
index 96114d4cc..18760b7b6 100644
--- a/tests/data/parser/inline/0055_self_param.txt
+++ b/tests/data/parser/inline/0055_self_param.txt
@@ -21,7 +21,7 @@ FILE@[0; 106)
21 SELF_KW@[18; 22) 21 SELF_KW@[18; 22)
22 R_PAREN@[22; 23) 22 R_PAREN@[22; 23)
23 WHITESPACE@[23; 24) 23 WHITESPACE@[23; 24)
24 BLOCK@[24; 31) 24 BLOCK_EXPR@[24; 31)
25 L_CURLY@[24; 25) 25 L_CURLY@[24; 25)
26 R_CURLY@[25; 26) 26 R_CURLY@[25; 26)
27 WHITESPACE@[26; 31) 27 WHITESPACE@[26; 31)
@@ -38,7 +38,7 @@ FILE@[0; 106)
38 COMMA@[41; 42) 38 COMMA@[41; 42)
39 R_PAREN@[42; 43) 39 R_PAREN@[42; 43)
40 WHITESPACE@[43; 44) 40 WHITESPACE@[43; 44)
41 BLOCK@[44; 51) 41 BLOCK_EXPR@[44; 51)
42 L_CURLY@[44; 45) 42 L_CURLY@[44; 45)
43 R_CURLY@[45; 46) 43 R_CURLY@[45; 46)
44 WHITESPACE@[46; 51) 44 WHITESPACE@[46; 51)
@@ -57,7 +57,7 @@ FILE@[0; 106)
57 COMMA@[64; 65) 57 COMMA@[64; 65)
58 R_PAREN@[65; 66) 58 R_PAREN@[65; 66)
59 WHITESPACE@[66; 67) 59 WHITESPACE@[66; 67)
60 BLOCK@[67; 74) 60 BLOCK_EXPR@[67; 74)
61 L_CURLY@[67; 68) 61 L_CURLY@[67; 68)
62 R_CURLY@[68; 69) 62 R_CURLY@[68; 69)
63 WHITESPACE@[69; 74) 63 WHITESPACE@[69; 74)
@@ -90,7 +90,7 @@ FILE@[0; 106)
90 IDENT@[96; 99) "i32" 90 IDENT@[96; 99) "i32"
91 R_PAREN@[99; 100) 91 R_PAREN@[99; 100)
92 WHITESPACE@[100; 101) 92 WHITESPACE@[100; 101)
93 BLOCK@[101; 104) 93 BLOCK_EXPR@[101; 104)
94 L_CURLY@[101; 102) 94 L_CURLY@[101; 102)
95 R_CURLY@[102; 103) 95 R_CURLY@[102; 103)
96 WHITESPACE@[103; 104) 96 WHITESPACE@[103; 104)
diff --git a/tests/data/parser/inline/0059_fn_item_where_clause.txt b/tests/data/parser/inline/0059_fn_item_where_clause.txt
index c904d171f..f38e8ccea 100644
--- a/tests/data/parser/inline/0059_fn_item_where_clause.txt
+++ b/tests/data/parser/inline/0059_fn_item_where_clause.txt
@@ -22,7 +22,7 @@ FILE@[0; 29)
22 WHITESPACE@[20; 21) 22 WHITESPACE@[20; 21)
23 IDENT@[21; 25) "Copy" 23 IDENT@[21; 25) "Copy"
24 WHITESPACE@[25; 26) 24 WHITESPACE@[25; 26)
25 BLOCK@[26; 29) 25 BLOCK_EXPR@[26; 29)
26 L_CURLY@[26; 27) 26 L_CURLY@[26; 27)
27 R_CURLY@[27; 28) 27 R_CURLY@[27; 28)
28 WHITESPACE@[28; 29) 28 WHITESPACE@[28; 29)
diff --git a/tests/data/parser/inline/0060_fn_item_type_params.txt b/tests/data/parser/inline/0060_fn_item_type_params.txt
index 0b0f8352b..28a857ed3 100644
--- a/tests/data/parser/inline/0060_fn_item_type_params.txt
+++ b/tests/data/parser/inline/0060_fn_item_type_params.txt
@@ -26,7 +26,7 @@ FILE@[0; 28)
26 PARAM_LIST@[23; 25) 26 PARAM_LIST@[23; 25)
27 L_PAREN@[23; 24) 27 L_PAREN@[23; 24)
28 R_PAREN@[24; 25) 28 R_PAREN@[24; 25)
29 BLOCK@[25; 28) 29 BLOCK_EXPR@[25; 28)
30 L_CURLY@[25; 26) 30 L_CURLY@[25; 26)
31 R_CURLY@[26; 27) 31 R_CURLY@[26; 27)
32 WHITESPACE@[27; 28) 32 WHITESPACE@[27; 28)
diff --git a/tests/data/parser/inline/0061_struct_lit.txt b/tests/data/parser/inline/0061_struct_lit.txt
index 336583004..5a56fd739 100644
--- a/tests/data/parser/inline/0061_struct_lit.txt
+++ b/tests/data/parser/inline/0061_struct_lit.txt
@@ -8,7 +8,7 @@ FILE@[0; 86)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 86) 11 BLOCK_EXPR@[9; 86)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 EXPR_STMT@[10; 25) 13 EXPR_STMT@[10; 25)
14 STRUCT_LIT@[10; 19) 14 STRUCT_LIT@[10; 19)
diff --git a/tests/data/parser/inline/0062_deref_expr.txt b/tests/data/parser/inline/0062_deref_expr.txt
index 10ff50e8b..c7e61992a 100644
--- a/tests/data/parser/inline/0062_deref_expr.txt
+++ b/tests/data/parser/inline/0062_deref_expr.txt
@@ -8,7 +8,7 @@ FILE@[0; 23)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 23) 11 BLOCK_EXPR@[9; 23)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 EXPR_STMT@[10; 21) 13 EXPR_STMT@[10; 21)
14 DEREF_EXPR@[10; 19) 14 DEREF_EXPR@[10; 19)
diff --git a/tests/data/parser/inline/0063_lambda_expr.txt b/tests/data/parser/inline/0063_lambda_expr.txt
index 1a9a28524..9d2c0f8fc 100644
--- a/tests/data/parser/inline/0063_lambda_expr.txt
+++ b/tests/data/parser/inline/0063_lambda_expr.txt
@@ -8,7 +8,7 @@ FILE@[0; 74)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 74) 11 BLOCK_EXPR@[9; 74)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 EXPR_STMT@[10; 26) 13 EXPR_STMT@[10; 26)
14 LAMBDA_EXPR@[10; 20) 14 LAMBDA_EXPR@[10; 20)
@@ -36,7 +36,7 @@ FILE@[0; 74)
36 WHITESPACE@[31; 32) 36 WHITESPACE@[31; 32)
37 IDENT@[32; 35) "i32" 37 IDENT@[32; 35) "i32"
38 WHITESPACE@[35; 36) 38 WHITESPACE@[35; 36)
39 BLOCK@[36; 42) 39 BLOCK_EXPR@[36; 42)
40 L_CURLY@[36; 37) 40 L_CURLY@[36; 37)
41 LITERAL@[37; 41) 41 LITERAL@[37; 41)
42 WHITESPACE@[37; 38) 42 WHITESPACE@[37; 38)
diff --git a/tests/data/parser/inline/0064_param_list.txt b/tests/data/parser/inline/0064_param_list.txt
index eebed8177..d88f8aa4e 100644
--- a/tests/data/parser/inline/0064_param_list.txt
+++ b/tests/data/parser/inline/0064_param_list.txt
@@ -8,7 +8,7 @@ FILE@[0; 67)
8 L_PAREN@[4; 5) 8 L_PAREN@[4; 5)
9 R_PAREN@[5; 6) 9 R_PAREN@[5; 6)
10 WHITESPACE@[6; 7) 10 WHITESPACE@[6; 7)
11 BLOCK@[7; 10) 11 BLOCK_EXPR@[7; 10)
12 L_CURLY@[7; 8) 12 L_CURLY@[7; 8)
13 R_CURLY@[8; 9) 13 R_CURLY@[8; 9)
14 WHITESPACE@[9; 10) 14 WHITESPACE@[9; 10)
@@ -32,7 +32,7 @@ FILE@[0; 67)
32 IDENT@[18; 21) "i32" 32 IDENT@[18; 21) "i32"
33 R_PAREN@[21; 22) 33 R_PAREN@[21; 22)
34 WHITESPACE@[22; 23) 34 WHITESPACE@[22; 23)
35 BLOCK@[23; 26) 35 BLOCK_EXPR@[23; 26)
36 L_CURLY@[23; 24) 36 L_CURLY@[23; 24)
37 R_CURLY@[24; 25) 37 R_CURLY@[24; 25)
38 WHITESPACE@[25; 26) 38 WHITESPACE@[25; 26)
@@ -58,7 +58,7 @@ FILE@[0; 67)
58 WHITESPACE@[38; 39) 58 WHITESPACE@[38; 39)
59 R_PAREN@[39; 40) 59 R_PAREN@[39; 40)
60 WHITESPACE@[40; 41) 60 WHITESPACE@[40; 41)
61 BLOCK@[41; 44) 61 BLOCK_EXPR@[41; 44)
62 L_CURLY@[41; 42) 62 L_CURLY@[41; 42)
63 R_CURLY@[42; 43) 63 R_CURLY@[42; 43)
64 WHITESPACE@[43; 44) 64 WHITESPACE@[43; 44)
@@ -93,7 +93,7 @@ FILE@[0; 67)
93 R_PAREN@[61; 62) 93 R_PAREN@[61; 62)
94 R_PAREN@[62; 63) 94 R_PAREN@[62; 63)
95 WHITESPACE@[63; 64) 95 WHITESPACE@[63; 64)
96 BLOCK@[64; 67) 96 BLOCK_EXPR@[64; 67)
97 L_CURLY@[64; 65) 97 L_CURLY@[64; 65)
98 R_CURLY@[65; 66) 98 R_CURLY@[65; 66)
99 WHITESPACE@[66; 67) 99 WHITESPACE@[66; 67)
diff --git a/tests/data/parser/inline/0065_if_expr.txt b/tests/data/parser/inline/0065_if_expr.txt
index 5d9bdfb13..dafe536d2 100644
--- a/tests/data/parser/inline/0065_if_expr.txt
+++ b/tests/data/parser/inline/0065_if_expr.txt
@@ -8,7 +8,7 @@ FILE@[0; 93)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 93) 11 BLOCK_EXPR@[9; 93)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 EXPR_STMT@[10; 31) 13 EXPR_STMT@[10; 31)
14 IF_EXPR@[10; 25) 14 IF_EXPR@[10; 25)
@@ -18,7 +18,7 @@ FILE@[0; 93)
18 WHITESPACE@[17; 18) 18 WHITESPACE@[17; 18)
19 TRUE_KW@[18; 22) 19 TRUE_KW@[18; 22)
20 WHITESPACE@[22; 23) 20 WHITESPACE@[22; 23)
21 BLOCK@[23; 25) 21 BLOCK_EXPR@[23; 25)
22 L_CURLY@[23; 24) 22 L_CURLY@[23; 24)
23 R_CURLY@[24; 25) 23 R_CURLY@[24; 25)
24 SEMI@[25; 26) 24 SEMI@[25; 26)
@@ -30,12 +30,12 @@ FILE@[0; 93)
30 WHITESPACE@[33; 34) 30 WHITESPACE@[33; 34)
31 TRUE_KW@[34; 38) 31 TRUE_KW@[34; 38)
32 WHITESPACE@[38; 39) 32 WHITESPACE@[38; 39)
33 BLOCK@[39; 42) 33 BLOCK_EXPR@[39; 42)
34 L_CURLY@[39; 40) 34 L_CURLY@[39; 40)
35 R_CURLY@[40; 41) 35 R_CURLY@[40; 41)
36 WHITESPACE@[41; 42) 36 WHITESPACE@[41; 42)
37 ELSE_KW@[42; 46) 37 ELSE_KW@[42; 46)
38 BLOCK@[46; 49) 38 BLOCK_EXPR@[46; 49)
39 WHITESPACE@[46; 47) 39 WHITESPACE@[46; 47)
40 L_CURLY@[47; 48) 40 L_CURLY@[47; 48)
41 R_CURLY@[48; 49) 41 R_CURLY@[48; 49)
@@ -47,7 +47,7 @@ FILE@[0; 93)
47 WHITESPACE@[57; 58) 47 WHITESPACE@[57; 58)
48 TRUE_KW@[58; 62) 48 TRUE_KW@[58; 62)
49 WHITESPACE@[62; 63) 49 WHITESPACE@[62; 63)
50 BLOCK@[63; 66) 50 BLOCK_EXPR@[63; 66)
51 L_CURLY@[63; 64) 51 L_CURLY@[63; 64)
52 R_CURLY@[64; 65) 52 R_CURLY@[64; 65)
53 WHITESPACE@[65; 66) 53 WHITESPACE@[65; 66)
@@ -59,12 +59,12 @@ FILE@[0; 93)
59 WHITESPACE@[73; 74) 59 WHITESPACE@[73; 74)
60 FALSE_KW@[74; 79) 60 FALSE_KW@[74; 79)
61 WHITESPACE@[79; 80) 61 WHITESPACE@[79; 80)
62 BLOCK@[80; 83) 62 BLOCK_EXPR@[80; 83)
63 L_CURLY@[80; 81) 63 L_CURLY@[80; 81)
64 R_CURLY@[81; 82) 64 R_CURLY@[81; 82)
65 WHITESPACE@[82; 83) 65 WHITESPACE@[82; 83)
66 ELSE_KW@[83; 87) 66 ELSE_KW@[83; 87)
67 BLOCK@[87; 91) 67 BLOCK_EXPR@[87; 91)
68 WHITESPACE@[87; 88) 68 WHITESPACE@[87; 88)
69 L_CURLY@[88; 89) 69 L_CURLY@[88; 89)
70 R_CURLY@[89; 90) 70 R_CURLY@[89; 90)
diff --git a/tests/data/parser/inline/0066_lambda_expr.txt b/tests/data/parser/inline/0066_lambda_expr.txt
index 8c6bc7522..83f4165df 100644
--- a/tests/data/parser/inline/0066_lambda_expr.txt
+++ b/tests/data/parser/inline/0066_lambda_expr.txt
@@ -8,7 +8,7 @@ FILE@[0; 79)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 79) 11 BLOCK_EXPR@[9; 79)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 EXPR_STMT@[10; 26) 13 EXPR_STMT@[10; 26)
14 LAMBDA_EXPR@[10; 20) 14 LAMBDA_EXPR@[10; 20)
@@ -36,7 +36,7 @@ FILE@[0; 79)
36 WHITESPACE@[31; 32) 36 WHITESPACE@[31; 32)
37 IDENT@[32; 35) "i32" 37 IDENT@[32; 35) "i32"
38 WHITESPACE@[35; 36) 38 WHITESPACE@[35; 36)
39 BLOCK@[36; 42) 39 BLOCK_EXPR@[36; 42)
40 L_CURLY@[36; 37) 40 L_CURLY@[36; 37)
41 LITERAL@[37; 41) 41 LITERAL@[37; 41)
42 WHITESPACE@[37; 38) 42 WHITESPACE@[37; 38)
diff --git a/tests/data/parser/inline/0066_not_expr.txt b/tests/data/parser/inline/0066_not_expr.txt
index 3e950969e..bd8d760f4 100644
--- a/tests/data/parser/inline/0066_not_expr.txt
+++ b/tests/data/parser/inline/0066_not_expr.txt
@@ -8,7 +8,7 @@ FILE@[0; 25)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 25) 11 BLOCK_EXPR@[9; 25)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 EXPR_STMT@[10; 23) 13 EXPR_STMT@[10; 23)
14 NOT_EXPR@[10; 21) 14 NOT_EXPR@[10; 21)
diff --git a/tests/data/parser/inline/0067_block_expr.rs b/tests/data/parser/inline/0067_block_expr.rs
new file mode 100644
index 000000000..ec3780a04
--- /dev/null
+++ b/tests/data/parser/inline/0067_block_expr.rs
@@ -0,0 +1,4 @@
1fn foo() {
2 {};
3 unsafe {};
4}
diff --git a/tests/data/parser/inline/0067_block_expr.txt b/tests/data/parser/inline/0067_block_expr.txt
new file mode 100644
index 000000000..2ba46ec56
--- /dev/null
+++ b/tests/data/parser/inline/0067_block_expr.txt
@@ -0,0 +1,29 @@
1FILE@[0; 36)
2 FN_ITEM@[0; 36)
3 FN_KW@[0; 2)
4 NAME@[2; 6)
5 WHITESPACE@[2; 3)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 9)
8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9)
11 BLOCK_EXPR@[9; 36)
12 L_CURLY@[9; 10)
13 EXPR_STMT@[10; 23)
14 BLOCK_EXPR@[10; 17)
15 WHITESPACE@[10; 15)
16 L_CURLY@[15; 16)
17 R_CURLY@[16; 17)
18 SEMI@[17; 18)
19 WHITESPACE@[18; 23)
20 EXPR_STMT@[23; 34)
21 BLOCK_EXPR@[23; 32)
22 UNSAFE_KW@[23; 29)
23 WHITESPACE@[29; 30)
24 L_CURLY@[30; 31)
25 R_CURLY@[31; 32)
26 SEMI@[32; 33)
27 WHITESPACE@[33; 34)
28 R_CURLY@[34; 35)
29 WHITESPACE@[35; 36)
diff --git a/tests/data/parser/ok/0005_fn_item.txt b/tests/data/parser/ok/0005_fn_item.txt
index 130571f60..d4ecc61b6 100644
--- a/tests/data/parser/ok/0005_fn_item.txt
+++ b/tests/data/parser/ok/0005_fn_item.txt
@@ -8,7 +8,7 @@ FILE@[0; 13)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK@[9; 13) 11 BLOCK_EXPR@[9; 13)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 WHITESPACE@[10; 11) 13 WHITESPACE@[10; 11)
14 R_CURLY@[11; 12) 14 R_CURLY@[11; 12)
diff --git a/tests/data/parser/ok/0008_mod_item.txt b/tests/data/parser/ok/0008_mod_item.txt
index 3a2e83654..8d07a2f9a 100644
--- a/tests/data/parser/ok/0008_mod_item.txt
+++ b/tests/data/parser/ok/0008_mod_item.txt
@@ -33,7 +33,7 @@ FILE@[0; 118)
33 L_PAREN@[37; 38) 33 L_PAREN@[37; 38)
34 R_PAREN@[38; 39) 34 R_PAREN@[38; 39)
35 WHITESPACE@[39; 40) 35 WHITESPACE@[39; 40)
36 BLOCK@[40; 52) 36 BLOCK_EXPR@[40; 52)
37 L_CURLY@[40; 41) 37 L_CURLY@[40; 41)
38 WHITESPACE@[41; 46) 38 WHITESPACE@[41; 46)
39 R_CURLY@[46; 47) 39 R_CURLY@[46; 47)
diff --git a/tests/data/parser/ok/0011_outer_attribute.txt b/tests/data/parser/ok/0011_outer_attribute.txt
index b1e997617..b94ba758a 100644
--- a/tests/data/parser/ok/0011_outer_attribute.txt
+++ b/tests/data/parser/ok/0011_outer_attribute.txt
@@ -26,7 +26,7 @@ FILE@[0; 35)
26 L_PAREN@[29; 30) 26 L_PAREN@[29; 30)
27 R_PAREN@[30; 31) 27 R_PAREN@[30; 31)
28 WHITESPACE@[31; 32) 28 WHITESPACE@[31; 32)
29 BLOCK@[32; 35) 29 BLOCK_EXPR@[32; 35)
30 L_CURLY@[32; 33) 30 L_CURLY@[32; 33)
31 R_CURLY@[33; 34) 31 R_CURLY@[33; 34)
32 WHITESPACE@[34; 35) 32 WHITESPACE@[34; 35)
diff --git a/tests/data/parser/ok/0012_visibility.txt b/tests/data/parser/ok/0012_visibility.txt
index b0164f26d..141f03c60 100644
--- a/tests/data/parser/ok/0012_visibility.txt
+++ b/tests/data/parser/ok/0012_visibility.txt
@@ -8,7 +8,7 @@ FILE@[0; 98)
8 L_PAREN@[4; 5) 8 L_PAREN@[4; 5)
9 R_PAREN@[5; 6) 9 R_PAREN@[5; 6)
10 WHITESPACE@[6; 7) 10 WHITESPACE@[6; 7)
11 BLOCK@[7; 10) 11 BLOCK_EXPR@[7; 10)
12 L_CURLY@[7; 8) 12 L_CURLY@[7; 8)
13 R_CURLY@[8; 9) 13 R_CURLY@[8; 9)
14 WHITESPACE@[9; 10) 14 WHITESPACE@[9; 10)
@@ -24,7 +24,7 @@ FILE@[0; 98)
24 L_PAREN@[18; 19) 24 L_PAREN@[18; 19)
25 R_PAREN@[19; 20) 25 R_PAREN@[19; 20)
26 WHITESPACE@[20; 21) 26 WHITESPACE@[20; 21)
27 BLOCK@[21; 24) 27 BLOCK_EXPR@[21; 24)
28 L_CURLY@[21; 22) 28 L_CURLY@[21; 22)
29 R_CURLY@[22; 23) 29 R_CURLY@[22; 23)
30 WHITESPACE@[23; 24) 30 WHITESPACE@[23; 24)
@@ -43,7 +43,7 @@ FILE@[0; 98)
43 L_PAREN@[39; 40) 43 L_PAREN@[39; 40)
44 R_PAREN@[40; 41) 44 R_PAREN@[40; 41)
45 WHITESPACE@[41; 42) 45 WHITESPACE@[41; 42)
46 BLOCK@[42; 45) 46 BLOCK_EXPR@[42; 45)
47 L_CURLY@[42; 43) 47 L_CURLY@[42; 43)
48 R_CURLY@[43; 44) 48 R_CURLY@[43; 44)
49 WHITESPACE@[44; 45) 49 WHITESPACE@[44; 45)
@@ -62,7 +62,7 @@ FILE@[0; 98)
62 L_PAREN@[60; 61) 62 L_PAREN@[60; 61)
63 R_PAREN@[61; 62) 63 R_PAREN@[61; 62)
64 WHITESPACE@[62; 63) 64 WHITESPACE@[62; 63)
65 BLOCK@[63; 66) 65 BLOCK_EXPR@[63; 66)
66 L_CURLY@[63; 64) 66 L_CURLY@[63; 64)
67 R_CURLY@[64; 65) 67 R_CURLY@[64; 65)
68 WHITESPACE@[65; 66) 68 WHITESPACE@[65; 66)
@@ -96,7 +96,7 @@ FILE@[0; 98)
96 L_PAREN@[92; 93) 96 L_PAREN@[92; 93)
97 R_PAREN@[93; 94) 97 R_PAREN@[93; 94)
98 WHITESPACE@[94; 95) 98 WHITESPACE@[94; 95)
99 BLOCK@[95; 98) 99 BLOCK_EXPR@[95; 98)
100 L_CURLY@[95; 96) 100 L_CURLY@[95; 96)
101 R_CURLY@[96; 97) 101 R_CURLY@[96; 97)
102 WHITESPACE@[97; 98) 102 WHITESPACE@[97; 98)
diff --git a/tests/data/parser/ok/0017_attr_trailing_comma.txt b/tests/data/parser/ok/0017_attr_trailing_comma.txt
index b043973af..3b8b53634 100644
--- a/tests/data/parser/ok/0017_attr_trailing_comma.txt
+++ b/tests/data/parser/ok/0017_attr_trailing_comma.txt
@@ -20,7 +20,7 @@ FILE@[0; 23)
20 L_PAREN@[17; 18) 20 L_PAREN@[17; 18)
21 R_PAREN@[18; 19) 21 R_PAREN@[18; 19)
22 WHITESPACE@[19; 20) 22 WHITESPACE@[19; 20)
23 BLOCK@[20; 23) 23 BLOCK_EXPR@[20; 23)
24 L_CURLY@[20; 21) 24 L_CURLY@[20; 21)
25 R_CURLY@[21; 22) 25 R_CURLY@[21; 22)
26 WHITESPACE@[22; 23) 26 WHITESPACE@[22; 23)
diff --git a/tests/data/parser/ok/0021_extern_fn.txt b/tests/data/parser/ok/0021_extern_fn.txt
index 502b0181d..c623253a4 100644
--- a/tests/data/parser/ok/0021_extern_fn.txt
+++ b/tests/data/parser/ok/0021_extern_fn.txt
@@ -11,7 +11,7 @@ FILE@[0; 71)
11 L_PAREN@[13; 14) 11 L_PAREN@[13; 14)
12 R_PAREN@[14; 15) 12 R_PAREN@[14; 15)
13 WHITESPACE@[15; 16) 13 WHITESPACE@[15; 16)
14 BLOCK@[16; 21) 14 BLOCK_EXPR@[16; 21)
15 L_CURLY@[16; 17) 15 L_CURLY@[16; 17)
16 WHITESPACE@[17; 18) 16 WHITESPACE@[17; 18)
17 R_CURLY@[18; 19) 17 R_CURLY@[18; 19)
@@ -30,7 +30,7 @@ FILE@[0; 71)
30 L_PAREN@[38; 39) 30 L_PAREN@[38; 39)
31 R_PAREN@[39; 40) 31 R_PAREN@[39; 40)
32 WHITESPACE@[40; 41) 32 WHITESPACE@[40; 41)
33 BLOCK@[41; 46) 33 BLOCK_EXPR@[41; 46)
34 L_CURLY@[41; 42) 34 L_CURLY@[41; 42)
35 WHITESPACE@[42; 43) 35 WHITESPACE@[42; 43)
36 R_CURLY@[43; 44) 36 R_CURLY@[43; 44)
@@ -49,7 +49,7 @@ FILE@[0; 71)
49 L_PAREN@[64; 65) 49 L_PAREN@[64; 65)
50 R_PAREN@[65; 66) 50 R_PAREN@[65; 66)
51 WHITESPACE@[66; 67) 51 WHITESPACE@[66; 67)
52 BLOCK@[67; 71) 52 BLOCK_EXPR@[67; 71)
53 L_CURLY@[67; 68) 53 L_CURLY@[67; 68)
54 WHITESPACE@[68; 69) 54 WHITESPACE@[68; 69)
55 R_CURLY@[69; 70) 55 R_CURLY@[69; 70)
diff --git a/tests/data/parser/ok/0022_empty_extern_block.txt b/tests/data/parser/ok/0022_empty_extern_block.txt
index 789cba364..2f79d5749 100644
--- a/tests/data/parser/ok/0022_empty_extern_block.txt
+++ b/tests/data/parser/ok/0022_empty_extern_block.txt
@@ -1,5 +1,5 @@
1FILE@[0; 27) 1FILE@[0; 27)
2 EXTERN_BLOCK@[0; 12) 2 EXTERN_BLOCK_EXPR@[0; 12)
3 ABI@[0; 7) 3 ABI@[0; 7)
4 EXTERN_KW@[0; 6) 4 EXTERN_KW@[0; 6)
5 WHITESPACE@[6; 7) 5 WHITESPACE@[6; 7)
@@ -7,7 +7,7 @@ FILE@[0; 27)
7 WHITESPACE@[8; 9) 7 WHITESPACE@[8; 9)
8 R_CURLY@[9; 10) 8 R_CURLY@[9; 10)
9 WHITESPACE@[10; 12) 9 WHITESPACE@[10; 12)
10 EXTERN_BLOCK@[12; 27) 10 EXTERN_BLOCK_EXPR@[12; 27)
11 ABI@[12; 23) 11 ABI@[12; 23)
12 EXTERN_KW@[12; 18) 12 EXTERN_KW@[12; 18)
13 WHITESPACE@[18; 19) 13 WHITESPACE@[18; 19)