about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAleksey Kladov <aleksey.kladov@gmail.com>2021-09-26 12:12:57 +0300
committerAleksey Kladov <aleksey.kladov@gmail.com>2021-09-26 19:16:09 +0300
commit2bf81922f7d0b9042e64d298b2d6c5e6f3be3a61 (patch)
tree55866a76e191f647a145f7a1ecbd4183fe1bcd55
parentc51a3c78cfda0d0a83da8510d603c1bf136357b0 (diff)
downloadrust-2bf81922f7d0b9042e64d298b2d6c5e6f3be3a61.tar.gz
rust-2bf81922f7d0b9042e64d298b2d6c5e6f3be3a61.zip
internal: more reasonable grammar for blocks
Consider these expples

        { 92 }
  async { 92 }
    'a: { 92 }
   #[a] { 92 }

Previously the tree for them were

  BLOCK_EXPR
    { ... }

  EFFECT_EXPR
    async
    BLOCK_EXPR
      { ... }

  EFFECT_EXPR
    'a:
    BLOCK_EXPR
      { ... }

  BLOCK_EXPR
    #[a]
    { ... }

As you see, it gets progressively worse :) The last two items are
especially odd. The last one even violates the balanced curleys
invariant we have (#10357) The new approach is to say that the stuff in
`{}` is stmt_list, and the block is stmt_list + optional modifiers

  BLOCK_EXPR
    STMT_LIST
      { ... }

  BLOCK_EXPR
    async
    STMT_LIST
      { ... }

  BLOCK_EXPR
    'a:
    STMT_LIST
      { ... }

  BLOCK_EXPR
    #[a]
    STMT_LIST
      { ... }
-rw-r--r--Cargo.lock4
-rw-r--r--crates/hir/src/semantics.rs2
-rw-r--r--crates/hir_def/src/attr.rs3
-rw-r--r--crates/hir_def/src/body/lower.rs40
-rw-r--r--crates/hir_expand/src/lib.rs2
-rw-r--r--crates/hir_ty/src/tests/method_resolution.rs30
-rw-r--r--crates/hir_ty/src/tests/simple.rs74
-rw-r--r--crates/ide/src/highlight_related.rs25
-rw-r--r--crates/ide/src/hover/render.rs4
-rw-r--r--crates/ide/src/join_lines.rs2
-rw-r--r--crates/ide/src/syntax_tree.rs77
-rw-r--r--crates/ide_assists/src/handlers/add_return_type.rs5
-rw-r--r--crates/ide_assists/src/handlers/convert_to_guarded_return.rs4
-rw-r--r--crates/ide_assists/src/handlers/extract_function.rs40
-rw-r--r--crates/ide_assists/src/handlers/extract_variable.rs3
-rw-r--r--crates/ide_assists/src/handlers/inline_call.rs10
-rw-r--r--crates/ide_assists/src/handlers/inline_local_variable.rs3
-rw-r--r--crates/ide_assists/src/handlers/remove_dbg.rs2
-rw-r--r--crates/ide_assists/src/handlers/unwrap_block.rs4
-rw-r--r--crates/ide_assists/src/utils.rs18
-rw-r--r--crates/ide_completion/src/completions/postfix.rs4
-rw-r--r--crates/ide_completion/src/context.rs6
-rw-r--r--crates/ide_completion/src/patterns.rs8
-rw-r--r--crates/ide_db/src/helpers.rs41
-rw-r--r--crates/ide_db/src/helpers/insert_use.rs8
-rw-r--r--crates/ide_db/src/helpers/insert_use/tests.rs4
-rw-r--r--crates/ide_db/src/helpers/node_ext.rs54
-rw-r--r--crates/mbe/src/tests/expand.rs157
-rw-r--r--crates/parser/src/grammar/expressions/atom.rs40
-rw-r--r--crates/parser/src/syntax_kind/generated.rs2
-rw-r--r--crates/syntax/Cargo.toml2
-rw-r--r--crates/syntax/src/ast.rs2
-rw-r--r--crates/syntax/src/ast/edit_in_place.rs2
-rw-r--r--crates/syntax/src/ast/expr_ext.rs36
-rw-r--r--crates/syntax/src/ast/generated/nodes.rs82
-rw-r--r--crates/syntax/src/ast/make.rs1
-rw-r--r--crates/syntax/src/ast/node_ext.rs17
-rw-r--r--crates/syntax/src/lib.rs7
-rw-r--r--crates/syntax/src/ted.rs4
-rw-r--r--crates/syntax/src/tests/ast_src.rs2
-rw-r--r--crates/syntax/src/validation/block.rs16
-rw-r--r--crates/syntax/test_data/parser/err/0005_attribute_recover.rast7
-rw-r--r--crates/syntax/test_data/parser/err/0007_stray_curly_in_file.rast5
-rw-r--r--crates/syntax/test_data/parser/err/0008_item_block_recovery.rast52
-rw-r--r--crates/syntax/test_data/parser/err/0010_unsafe_lambda_block.rast61
-rw-r--r--crates/syntax/test_data/parser/err/0014_where_no_bounds.rast5
-rw-r--r--crates/syntax/test_data/parser/err/0016_missing_semi.rast61
-rw-r--r--crates/syntax/test_data/parser/err/0017_incomplete_binexpr.rast45
-rw-r--r--crates/syntax/test_data/parser/err/0018_incomplete_fn.rast169
-rw-r--r--crates/syntax/test_data/parser/err/0019_let_recover.rast166
-rw-r--r--crates/syntax/test_data/parser/err/0020_fn_recover.rast5
-rw-r--r--crates/syntax/test_data/parser/err/0021_incomplete_param.rast7
-rw-r--r--crates/syntax/test_data/parser/err/0022_bad_exprs.rast217
-rw-r--r--crates/syntax/test_data/parser/err/0023_mismatched_paren.rast49
-rw-r--r--crates/syntax/test_data/parser/err/0024_many_type_parens.rast432
-rw-r--r--crates/syntax/test_data/parser/err/0025_nope.rast360
-rw-r--r--crates/syntax/test_data/parser/err/0027_incomplere_where_for.rast5
-rw-r--r--crates/syntax/test_data/parser/err/0029_field_completion.rast23
-rw-r--r--crates/syntax/test_data/parser/err/0031_block_inner_attrs.rast222
-rw-r--r--crates/syntax/test_data/parser/err/0032_match_arms_inner_attrs.rast363
-rw-r--r--crates/syntax/test_data/parser/err/0033_match_arms_outer_attrs.rast105
-rw-r--r--crates/syntax/test_data/parser/err/0034_bad_box_pattern.rast155
-rw-r--r--crates/syntax/test_data/parser/err/0035_use_recover.rast5
-rw-r--r--crates/syntax/test_data/parser/err/0037_visibility_in_traits.rast10
-rw-r--r--crates/syntax/test_data/parser/err/0038_endless_inclusive_range.rast31
-rw-r--r--crates/syntax/test_data/parser/err/0039_lambda_recovery.rast121
-rw-r--r--crates/syntax/test_data/parser/err/0043_weird_blocks.rast113
-rw-r--r--crates/syntax/test_data/parser/err/0044_unexpected_for_type.rast7
-rw-r--r--crates/syntax/test_data/parser/err/0045_item_modifiers.rast5
-rw-r--r--crates/syntax/test_data/parser/err/0046_ambiguous_trait_object.rast143
-rw-r--r--crates/syntax/test_data/parser/err/0049_double_fish.rast180
-rw-r--r--crates/syntax/test_data/parser/fragments/item/ok/0000_fn.rast5
-rw-r--r--crates/syntax/test_data/parser/fragments/stmt/ok/0000_expr_block.rast135
-rw-r--r--crates/syntax/test_data/parser/inline/err/0002_misplaced_label_err.rast25
-rw-r--r--crates/syntax/test_data/parser/inline/err/0006_unsafe_block_in_mod.rast10
-rw-r--r--crates/syntax/test_data/parser/inline/err/0007_async_without_semicolon.rast37
-rw-r--r--crates/syntax/test_data/parser/inline/err/0008_pub_expr.rast25
-rw-r--r--crates/syntax/test_data/parser/inline/err/0010_bad_tuple_index_expr.rast77
-rw-r--r--crates/syntax/test_data/parser/inline/err/0014_record_literal_before_ellipsis_recovery.rast71
-rw-r--r--crates/syntax/test_data/parser/inline/err/0015_missing_fn_param_type.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0003_where_pred_for.rast7
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0005_function_type_params.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0006_self_param.rast25
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0008_path_part.rast169
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0009_loop_expr.rast26
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0011_field_expr.rast95
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0015_continue_expr.rast50
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0018_arb_self_types.rast10
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0019_unary_expr.rast65
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0021_assoc_item_list.rast10
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0024_slice_pat.rast59
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0026_tuple_pat_fields.rast185
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0027_ref_pat.rast75
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0029_cast_expr.rast155
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0030_cond.rast365
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0031_while_expr.rast149
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0034_break_expr.rast88
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0037_qual_paths.rast67
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0038_full_range_expr.rast33
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0040_crate_keyword_vis.rast7
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0042_call_expr.rast271
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0044_block_items.rast34
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0048_path_type_with_bounds.rast10
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0053_path_expr.rast167
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0055_literal_pattern.rast129
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0056_where_clause.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0058_range_pat.rast173
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0059_match_arms_commas.rast94
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0061_record_lit.rast225
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0062_mod_contents.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0064_if_expr.rast229
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0066_match_arm.rast279
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0070_stmt_bin_expr_ambiguity.rast79
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0071_match_expr.rast165
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0072_return_expr.rast33
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0074_stmt_postfix_expr_ambiguity.rast98
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0075_block.rast86
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0076_function_where_clause.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0077_try_expr.rast27
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0080_postfix_range.rast167
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0082_ref_expr.rast253
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0085_expr_literals.rast247
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0086_function_ret_type.rast10
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0088_break_ambiguity.rast112
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0093_index_expr.rast43
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0095_placeholder_pat.rast33
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0096_no_semi_after_block.rast221
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0099_param_list.rast20
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0100_for_expr.rast46
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0102_record_pat_field_list.rast241
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0103_array_expr.rast85
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0106_lambda_expr.rast251
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0107_method_call_expr.rast101
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0108_tuple_expr.rast53
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0109_label.rast114
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0111_tuple_pat.rast155
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0112_bind_pat.rast231
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0113_nocontentexpr.rast90
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0118_match_guard.rast127
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0120_match_arms_inner_attribute.rast143
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0121_match_arms_outer_attributes.rast277
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0125_crate_keyword_path.rast41
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0125_record_literal_field_with_attr.rast73
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0126_attr_on_expr_stmt.rast182
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0129_marco_pat.rast49
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0130_let_stmt.rast47
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0130_try_block_expr.rast39
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0132_box_expr.rast155
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0134_nocontentexpr_after_item.rast102
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0137_await_expr.rast115
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0138_associated_type_bounds.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0138_expression_after_block.rast106
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0138_self_param_outer_attr.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0139_param_outer_arg.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0142_for_range_from.rast58
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0143_box_pat.rast197
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0144_dot_dot_pat.rast887
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0145_record_pat_field.rast221
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0146_as_precedence.rast61
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0151_fn.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0152_arg_with_attr.rast51
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0155_closure_params.rast115
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0156_const_block_pat.rast131
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0156_fn_def_param.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0156_or_pattern.rast199
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0157_const_block.rast23
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0158_binop_resets_statementness.rast50
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0158_lambda_ret_block.rast64
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0159_try_macro_fallback.rast45
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0159_yield_expr.rast33
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0161_labeled_block.rast31
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0162_default_async_unsafe_fn.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0162_unsafe_block.rast23
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0163_default_async_fn.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0163_default_unsafe_item.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0164_type_path_in_pattern.rast53
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0166_half_open_range_pat.rast39
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0181_generic_param_attribute.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0182_lifetime_param.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0183_const_arg_block.rast21
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0183_type_param.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0184_generic_param_list.rast5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0193_let_stmt_init.rast33
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0194_let_stmt_ascription.rast37
-rw-r--r--crates/syntax/test_data/parser/ok/0005_fn_item.rast7
-rw-r--r--crates/syntax/test_data/parser/ok/0008_mod_item.rast7
-rw-r--r--crates/syntax/test_data/parser/ok/0011_outer_attribute.rast5
-rw-r--r--crates/syntax/test_data/parser/ok/0012_visibility.rast25
-rw-r--r--crates/syntax/test_data/parser/ok/0017_attr_trailing_comma.rast5
-rw-r--r--crates/syntax/test_data/parser/ok/0025_extern_fn_in_block.rast40
-rw-r--r--crates/syntax/test_data/parser/ok/0026_const_fn_in_block.rast38
-rw-r--r--crates/syntax/test_data/parser/ok/0027_unsafe_fn_in_block.rast60
-rw-r--r--crates/syntax/test_data/parser/ok/0028_operator_binding_power.rast347
-rw-r--r--crates/syntax/test_data/parser/ok/0029_range_forms.rast279
-rw-r--r--crates/syntax/test_data/parser/ok/0030_string_suffixes.rast103
-rw-r--r--crates/syntax/test_data/parser/ok/0032_where_for.rast5
-rw-r--r--crates/syntax/test_data/parser/ok/0033_label_break.rast421
-rw-r--r--crates/syntax/test_data/parser/ok/0034_crate_path_in_call.rast61
-rw-r--r--crates/syntax/test_data/parser/ok/0035_weird_exprs.rast3918
-rw-r--r--crates/syntax/test_data/parser/ok/0036_fully_qualified.rast27
-rw-r--r--crates/syntax/test_data/parser/ok/0038_where_pred_type.rast5
-rw-r--r--crates/syntax/test_data/parser/ok/0039_raw_fn_item.rast7
-rw-r--r--crates/syntax/test_data/parser/ok/0041_raw_keywords.rast77
-rw-r--r--crates/syntax/test_data/parser/ok/0042_ufcs_call_list.rast97
-rw-r--r--crates/syntax/test_data/parser/ok/0043_complex_assignment.rast133
-rw-r--r--crates/syntax/test_data/parser/ok/0044_let_attrs.rast125
-rw-r--r--crates/syntax/test_data/parser/ok/0045_block_attrs.rast268
-rw-r--r--crates/syntax/test_data/parser/ok/0047_minus_in_inner_pattern.rast495
-rw-r--r--crates/syntax/test_data/parser/ok/0048_compound_assignment.rast373
-rw-r--r--crates/syntax/test_data/parser/ok/0049_async_block.rast47
-rw-r--r--crates/syntax/test_data/parser/ok/0050_async_block_as_argument.rast56
-rw-r--r--crates/syntax/test_data/parser/ok/0051_parameter_attrs.rast55
-rw-r--r--crates/syntax/test_data/parser/ok/0052_for_range_block.rast135
-rw-r--r--crates/syntax/test_data/parser/ok/0054_qual_path_in_type_arg.rast15
-rw-r--r--crates/syntax/test_data/parser/ok/0055_dot_dot_dot.rast49
-rw-r--r--crates/syntax/test_data/parser/ok/0056_neq_in_type.rast106
-rw-r--r--crates/syntax/test_data/parser/ok/0057_loop_in_call.rast49
-rw-r--r--crates/syntax/test_data/parser/ok/0058_unary_expr_precedence.rast169
-rw-r--r--crates/syntax/test_data/parser/ok/0059_loops_in_parens.rast174
-rw-r--r--crates/syntax/test_data/parser/ok/0060_as_range.rast87
-rw-r--r--crates/syntax/test_data/parser/ok/0061_match_full_range.rast29
-rw-r--r--crates/syntax/test_data/parser/ok/0062_macro_2.0.rast205
-rw-r--r--crates/syntax/test_data/parser/ok/0063_trait_fn_patterns.rast20
-rw-r--r--crates/syntax/test_data/parser/ok/0064_impl_fn_params.rast20
-rw-r--r--crates/syntax/test_data/parser/ok/0065_comment_newline.rast5
-rw-r--r--crates/syntax/test_data/parser/ok/0065_plus_after_fn_trait_bound.rast5
-rw-r--r--crates/syntax/test_data/parser/ok/0066_default_modifier.rast20
-rw-r--r--crates/syntax/test_data/parser/ok/0067_where_for_pred.rast42
-rw-r--r--crates/syntax/test_data/parser/ok/0068_item_modifiers.rast40
-rw-r--r--crates/syntax/test_data/parser/ok/0069_multi_trait_object.rast149
-rw-r--r--crates/syntax/test_data/parser/ok/0070_expr_attr_placement.rast93
-rw-r--r--crates/syntax/test_data/parser/ok/0071_stmt_attr_placement.rast116
233 files changed, 11762 insertions, 11343 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 9170ec3a66b..9da1f56deaf 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1760,9 +1760,9 @@ dependencies = [
 
 [[package]]
 name = "ungrammar"
-version = "1.14.4"
+version = "1.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d6e36d57b143472488b1594fe25c376fa9683bccfd80d858b2180c97806835b"
+checksum = "395e988af2480b8a8118ad1d5f1f790197d332e3e2585231f742949b63080ef5"
 
 [[package]]
 name = "unicase"
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs
index 51befc698c0..5cda6cc1e96 100644
--- a/crates/hir/src/semantics.rs
+++ b/crates/hir/src/semantics.rs
@@ -698,7 +698,7 @@ impl<'db> SemanticsImpl<'db> {
                     ast::ForExpr(it) => it.label(),
                     ast::WhileExpr(it) => it.label(),
                     ast::LoopExpr(it) => it.label(),
-                    ast::EffectExpr(it) => it.label(),
+                    ast::BlockExpr(it) => it.label(),
                     _ => None,
                 }
             };
diff --git a/crates/hir_def/src/attr.rs b/crates/hir_def/src/attr.rs
index 70fa249a5b0..04011d91296 100644
--- a/crates/hir_def/src/attr.rs
+++ b/crates/hir_def/src/attr.rs
@@ -524,7 +524,8 @@ fn inner_attributes(
             },
             ast::Fn(it) => {
                 let body = it.body()?;
-                (body.attrs(), ast::CommentIter::from_syntax_node(body.syntax()))
+                let stmt_list = body.stmt_list()?;
+                (stmt_list.attrs(), ast::CommentIter::from_syntax_node(body.syntax()))
             },
             ast::Impl(it) => {
                 let assoc_item_list = it.assoc_item_list()?;
diff --git a/crates/hir_def/src/body/lower.rs b/crates/hir_def/src/body/lower.rs
index a34c18d6d0c..6a6d992af34 100644
--- a/crates/hir_def/src/body/lower.rs
+++ b/crates/hir_def/src/body/lower.rs
@@ -245,43 +245,37 @@ impl ExprCollector<'_> {
 
                 self.alloc_expr(Expr::If { condition, then_branch, else_branch }, syntax_ptr)
             }
-            ast::Expr::EffectExpr(e) => match e.effect() {
-                ast::Effect::Try(_) => {
-                    let body = self.collect_block_opt(e.block_expr());
+            ast::Expr::BlockExpr(e) => match e.modifier() {
+                Some(ast::BlockModifier::Try(_)) => {
+                    let body = self.collect_block(e);
                     self.alloc_expr(Expr::TryBlock { body }, syntax_ptr)
                 }
-                ast::Effect::Unsafe(_) => {
-                    let body = self.collect_block_opt(e.block_expr());
+                Some(ast::BlockModifier::Unsafe(_)) => {
+                    let body = self.collect_block(e);
                     self.alloc_expr(Expr::Unsafe { body }, syntax_ptr)
                 }
                 // FIXME: we need to record these effects somewhere...
-                ast::Effect::Label(label) => {
+                Some(ast::BlockModifier::Label(label)) => {
                     let label = self.collect_label(label);
-                    match e.block_expr() {
-                        Some(block) => {
-                            let res = self.collect_block(block);
-                            match &mut self.body.exprs[res] {
-                                Expr::Block { label: block_label, .. } => {
-                                    *block_label = Some(label);
-                                }
-                                _ => unreachable!(),
-                            }
-                            res
+                    let res = self.collect_block(e);
+                    match &mut self.body.exprs[res] {
+                        Expr::Block { label: block_label, .. } => {
+                            *block_label = Some(label);
                         }
-                        None => self.missing_expr(),
+                        _ => unreachable!(),
                     }
+                    res
                 }
-                // FIXME: we need to record these effects somewhere...
-                ast::Effect::Async(_) => {
-                    let body = self.collect_block_opt(e.block_expr());
+                Some(ast::BlockModifier::Async(_)) => {
+                    let body = self.collect_block(e);
                     self.alloc_expr(Expr::Async { body }, syntax_ptr)
                 }
-                ast::Effect::Const(_) => {
-                    let body = self.collect_block_opt(e.block_expr());
+                Some(ast::BlockModifier::Const(_)) => {
+                    let body = self.collect_block(e);
                     self.alloc_expr(Expr::Const { body }, syntax_ptr)
                 }
+                None => self.collect_block(e),
             },
-            ast::Expr::BlockExpr(e) => self.collect_block(e),
             ast::Expr::LoopExpr(e) => {
                 let label = e.label().map(|label| self.collect_label(label));
                 let body = self.collect_block_opt(e.loop_body());
diff --git a/crates/hir_expand/src/lib.rs b/crates/hir_expand/src/lib.rs
index 8bb56e0700d..bdc3023e9c1 100644
--- a/crates/hir_expand/src/lib.rs
+++ b/crates/hir_expand/src/lib.rs
@@ -721,7 +721,7 @@ impl ExpandTo {
 
         match parent.kind() {
             MACRO_ITEMS | SOURCE_FILE | ITEM_LIST => ExpandTo::Items,
-            MACRO_STMTS | EXPR_STMT | BLOCK_EXPR => ExpandTo::Statements,
+            MACRO_STMTS | EXPR_STMT | STMT_LIST => ExpandTo::Statements,
             MACRO_PAT => ExpandTo::Pattern,
             MACRO_TYPE => ExpandTo::Type,
 
diff --git a/crates/hir_ty/src/tests/method_resolution.rs b/crates/hir_ty/src/tests/method_resolution.rs
index 306da6738b0..26078a4b2fa 100644
--- a/crates/hir_ty/src/tests/method_resolution.rs
+++ b/crates/hir_ty/src/tests/method_resolution.rs
@@ -1083,22 +1083,22 @@ fn dyn_trait_super_trait_not_in_scope() {
 fn method_resolution_foreign_opaque_type() {
     check_infer(
         r#"
-        extern "C" {
-            type S;
-            fn f() -> &'static S;
-        }
+extern "C" {
+    type S;
+    fn f() -> &'static S;
+}
 
-        impl S {
-            fn foo(&self) -> bool {
-                true
-            }
-        }
+impl S {
+    fn foo(&self) -> bool {
+        true
+    }
+}
 
-        fn test() {
-            let s = unsafe { f() };
-            s.foo();
-        }
-        "#,
+fn test() {
+    let s = unsafe { f() };
+    s.foo();
+}
+"#,
         expect![[r#"
             75..79 'self': &S
             89..109 '{     ...     }': bool
@@ -1106,7 +1106,7 @@ fn method_resolution_foreign_opaque_type() {
             123..167 '{     ...o(); }': ()
             133..134 's': &S
             137..151 'unsafe { f() }': &S
-            144..151 '{ f() }': &S
+            137..151 'unsafe { f() }': &S
             146..147 'f': fn f() -> &S
             146..149 'f()': &S
             157..158 's': &S
diff --git a/crates/hir_ty/src/tests/simple.rs b/crates/hir_ty/src/tests/simple.rs
index a409c453b0e..f4d082ea8c6 100644
--- a/crates/hir_ty/src/tests/simple.rs
+++ b/crates/hir_ty/src/tests/simple.rs
@@ -352,7 +352,7 @@ unsafe fn baz(u: MyUnion) {
             71..89 'MyUnio...o: 0 }': MyUnion
             86..87 '0': u32
             95..113 'unsafe...(u); }': ()
-            102..113 '{ baz(u); }': ()
+            95..113 'unsafe...(u); }': ()
             104..107 'baz': fn baz(MyUnion)
             104..110 'baz(u)': ()
             108..109 'u': MyUnion
@@ -360,7 +360,7 @@ unsafe fn baz(u: MyUnion) {
             126..146 'MyUnio... 0.0 }': MyUnion
             141..144 '0.0': f32
             152..170 'unsafe...(u); }': ()
-            159..170 '{ baz(u); }': ()
+            152..170 'unsafe...(u); }': ()
             161..164 'baz': fn baz(MyUnion)
             161..167 'baz(u)': ()
             165..166 'u': MyUnion
@@ -1914,41 +1914,41 @@ fn fn_pointer_return() {
 }
 
 #[test]
-fn effects_smoke_test() {
+fn block_modifiers_smoke_test() {
     check_infer(
         r#"
-        //- minicore: future
-        async fn main() {
-            let x = unsafe { 92 };
-            let y = async { async { () }.await };
-            let z = try { () };
-            let w = const { 92 };
-            let t = 'a: { 92 };
-        }
+//- minicore: future
+async fn main() {
+    let x = unsafe { 92 };
+    let y = async { async { () }.await };
+    let z = try { () };
+    let w = const { 92 };
+    let t = 'a: { 92 };
+}
         "#,
         expect![[r#"
             16..162 '{     ...2 }; }': ()
             26..27 'x': i32
             30..43 'unsafe { 92 }': i32
-            37..43 '{ 92 }': i32
+            30..43 'unsafe { 92 }': i32
             39..41 '92': i32
             53..54 'y': impl Future<Output = ()>
+            57..85 'async ...wait }': ()
             57..85 'async ...wait }': impl Future<Output = ()>
-            63..85 '{ asyn...wait }': ()
+            65..77 'async { () }': ()
             65..77 'async { () }': impl Future<Output = ()>
             65..83 'async ....await': ()
-            71..77 '{ () }': ()
             73..75 '()': ()
             95..96 'z': {unknown}
+            99..109 'try { () }': ()
             99..109 'try { () }': {unknown}
-            103..109 '{ () }': ()
             105..107 '()': ()
             119..120 'w': i32
             123..135 'const { 92 }': i32
-            129..135 '{ 92 }': i32
+            123..135 'const { 92 }': i32
             131..133 '92': i32
             145..146 't': i32
-            153..159 '{ 92 }': i32
+            149..159 ''a: { 92 }': i32
             155..157 '92': i32
         "#]],
     )
@@ -2104,32 +2104,32 @@ fn infer_labelled_break_with_val() {
 fn infer_labelled_block_break_with_val() {
     check_infer(
         r#"
-        fn default<T>() -> T { loop {} }
-        fn foo() {
-            let _x = 'outer: {
-                let inner = 'inner: {
-                    let i = default();
-                    if (break 'outer i) {
-                        break 'inner 5i8;
-                    } else if true {
-                        break 'inner 6;
-                    }
-                    break 'inner 'innermost: { 0 };
-                    42
-                };
-                break 'outer inner < 8;
-            };
-        }
-        "#,
+fn default<T>() -> T { loop {} }
+fn foo() {
+    let _x = 'outer: {
+        let inner = 'inner: {
+            let i = default();
+            if (break 'outer i) {
+                break 'inner 5i8;
+            } else if true {
+                break 'inner 6;
+            }
+            break 'inner 'innermost: { 0 };
+            42
+        };
+        break 'outer inner < 8;
+    };
+}
+"#,
         expect![[r#"
             21..32 '{ loop {} }': T
             23..30 'loop {}': !
             28..30 '{}': ()
             42..381 '{     ...  }; }': ()
             52..54 '_x': bool
-            65..378 '{     ...     }': bool
+            57..378 ''outer...     }': bool
             79..84 'inner': i8
-            95..339 '{     ...     }': i8
+            87..339 ''inner...     }': i8
             113..114 'i': bool
             117..124 'default': fn default<bool>() -> bool
             117..126 'default()': bool
@@ -2145,7 +2145,7 @@ fn infer_labelled_block_break_with_val() {
             241..255 'break 'inner 6': !
             254..255 '6': i8
             283..313 'break ... { 0 }': !
-            308..313 '{ 0 }': i8
+            296..313 ''inner... { 0 }': i8
             310..311 '0': i8
             327..329 '42': i8
             349..371 'break ...er < 8': !
diff --git a/crates/ide/src/highlight_related.rs b/crates/ide/src/highlight_related.rs
index d305f82fcb0..6aef3a94296 100644
--- a/crates/ide/src/highlight_related.rs
+++ b/crates/ide/src/highlight_related.rs
@@ -164,8 +164,8 @@ fn highlight_exit_points(
             match anc {
                 ast::Fn(fn_) => hl(sema, fn_.body().map(ast::Expr::BlockExpr)),
                 ast::ClosureExpr(closure) => hl(sema, closure.body()),
-                ast::EffectExpr(effect) => if matches!(effect.effect(), ast::Effect::Async(_) | ast::Effect::Try(_)| ast::Effect::Const(_)) {
-                    hl(sema, effect.block_expr().map(ast::Expr::BlockExpr))
+                ast::BlockExpr(block_expr) => if matches!(block_expr.modifier(), Some(ast::BlockModifier::Async(_) | ast::BlockModifier::Try(_)| ast::BlockModifier::Const(_))) {
+                    hl(sema, Some(block_expr.into()))
                 } else {
                     continue;
                 },
@@ -180,7 +180,7 @@ fn highlight_break_points(token: SyntaxToken) -> Option<Vec<HighlightedRange>> {
     fn hl(
         token: Option<SyntaxToken>,
         label: Option<ast::Label>,
-        body: Option<ast::BlockExpr>,
+        body: Option<ast::StmtList>,
     ) -> Option<Vec<HighlightedRange>> {
         let mut highlights = Vec::new();
         let range = cover_range(
@@ -204,7 +204,7 @@ fn highlight_break_points(token: SyntaxToken) -> Option<Vec<HighlightedRange>> {
             ast::LoopExpr(l) => l.label().and_then(|it| it.lifetime()),
             ast::ForExpr(f) => f.label().and_then(|it| it.lifetime()),
             ast::WhileExpr(w) => w.label().and_then(|it| it.lifetime()),
-            ast::EffectExpr(b) => Some(b.label().and_then(|it| it.lifetime())?),
+            ast::BlockExpr(b) => Some(b.label().and_then(|it| it.lifetime())?),
             _ => return None,
         }
     };
@@ -218,16 +218,16 @@ fn highlight_break_points(token: SyntaxToken) -> Option<Vec<HighlightedRange>> {
     for anc in token.ancestors().flat_map(ast::Expr::cast) {
         return match anc {
             ast::Expr::LoopExpr(l) if label_matches(l.label()) => {
-                hl(l.loop_token(), l.label(), l.loop_body())
+                hl(l.loop_token(), l.label(), l.loop_body().and_then(|it| it.stmt_list()))
             }
             ast::Expr::ForExpr(f) if label_matches(f.label()) => {
-                hl(f.for_token(), f.label(), f.loop_body())
+                hl(f.for_token(), f.label(), f.loop_body().and_then(|it| it.stmt_list()))
             }
             ast::Expr::WhileExpr(w) if label_matches(w.label()) => {
-                hl(w.while_token(), w.label(), w.loop_body())
+                hl(w.while_token(), w.label(), w.loop_body().and_then(|it| it.stmt_list()))
             }
-            ast::Expr::EffectExpr(e) if e.label().is_some() && label_matches(e.label()) => {
-                hl(None, e.label(), e.block_expr())
+            ast::Expr::BlockExpr(e) if e.label().is_some() && label_matches(e.label()) => {
+                hl(None, e.label(), e.stmt_list())
             }
             _ => continue,
         };
@@ -258,7 +258,12 @@ fn highlight_yield_points(token: SyntaxToken) -> Option<Vec<HighlightedRange>> {
         return match_ast! {
             match anc {
                 ast::Fn(fn_) => hl(fn_.async_token(), fn_.body().map(ast::Expr::BlockExpr)),
-                ast::EffectExpr(effect) => hl(effect.async_token(), effect.block_expr().map(ast::Expr::BlockExpr)),
+                ast::BlockExpr(block_expr) => {
+                    if block_expr.async_token().is_none() {
+                        continue;
+                    }
+                    hl(block_expr.async_token(), Some(block_expr.into()))
+                },
                 ast::ClosureExpr(closure) => hl(closure.async_token(), closure.body()),
                 _ => continue,
             }
diff --git a/crates/ide/src/hover/render.rs b/crates/ide/src/hover/render.rs
index 5b516de4c64..7f9a91286a4 100644
--- a/crates/ide/src/hover/render.rs
+++ b/crates/ide/src/hover/render.rs
@@ -86,8 +86,8 @@ pub(super) fn try_expr(
                 ast::Fn(fn_) => sema.to_def(&fn_)?.ret_type(sema.db),
                 ast::Item(__) => return None,
                 ast::ClosureExpr(closure) => sema.type_of_expr(&closure.body()?)?.original,
-                ast::EffectExpr(effect) => if matches!(effect.effect(), ast::Effect::Async(_) | ast::Effect::Try(_)| ast::Effect::Const(_)) {
-                    sema.type_of_expr(&effect.block_expr()?.into())?.original
+                ast::BlockExpr(block_expr) => if matches!(block_expr.modifier(), Some(ast::BlockModifier::Async(_) | ast::BlockModifier::Try(_)| ast::BlockModifier::Const(_))) {
+                    sema.type_of_expr(&block_expr.into())?.original
                 } else {
                     continue;
                 },
diff --git a/crates/ide/src/join_lines.rs b/crates/ide/src/join_lines.rs
index 8eb2e493590..000d74abacb 100644
--- a/crates/ide/src/join_lines.rs
+++ b/crates/ide/src/join_lines.rs
@@ -212,7 +212,7 @@ fn remove_newline(
 }
 
 fn join_single_expr_block(edit: &mut TextEditBuilder, token: &SyntaxToken) -> Option<()> {
-    let block_expr = ast::BlockExpr::cast(token.parent()?)?;
+    let block_expr = ast::BlockExpr::cast(token.ancestors().nth(1)?)?;
     if !block_expr.is_standalone() {
         return None;
     }
diff --git a/crates/ide/src/syntax_tree.rs b/crates/ide/src/syntax_tree.rs
index 633878d1c67..1771b56fe38 100644
--- a/crates/ide/src/syntax_tree.rs
+++ b/crates/ide/src/syntax_tree.rs
@@ -133,8 +133,9 @@ mod tests {
                       R_PAREN@7..8 ")"
                     WHITESPACE@8..9 " "
                     BLOCK_EXPR@9..11
-                      L_CURLY@9..10 "{"
-                      R_CURLY@10..11 "}"
+                      STMT_LIST@9..11
+                        L_CURLY@9..10 "{"
+                        R_CURLY@10..11 "}"
             "#]],
         );
 
@@ -158,25 +159,26 @@ fn test() {
                       R_PAREN@8..9 ")"
                     WHITESPACE@9..10 " "
                     BLOCK_EXPR@10..60
-                      L_CURLY@10..11 "{"
-                      WHITESPACE@11..16 "\n    "
-                      EXPR_STMT@16..58
-                        MACRO_CALL@16..57
-                          PATH@16..22
-                            PATH_SEGMENT@16..22
-                              NAME_REF@16..22
-                                IDENT@16..22 "assert"
-                          BANG@22..23 "!"
-                          TOKEN_TREE@23..57
-                            L_PAREN@23..24 "("
-                            STRING@24..52 "\"\n    fn foo() {\n     ..."
-                            COMMA@52..53 ","
-                            WHITESPACE@53..54 " "
-                            STRING@54..56 "\"\""
-                            R_PAREN@56..57 ")"
-                        SEMICOLON@57..58 ";"
-                      WHITESPACE@58..59 "\n"
-                      R_CURLY@59..60 "}"
+                      STMT_LIST@10..60
+                        L_CURLY@10..11 "{"
+                        WHITESPACE@11..16 "\n    "
+                        EXPR_STMT@16..58
+                          MACRO_CALL@16..57
+                            PATH@16..22
+                              PATH_SEGMENT@16..22
+                                NAME_REF@16..22
+                                  IDENT@16..22 "assert"
+                            BANG@22..23 "!"
+                            TOKEN_TREE@23..57
+                              L_PAREN@23..24 "("
+                              STRING@24..52 "\"\n    fn foo() {\n     ..."
+                              COMMA@52..53 ","
+                              WHITESPACE@53..54 " "
+                              STRING@54..56 "\"\""
+                              R_PAREN@56..57 ")"
+                          SEMICOLON@57..58 ";"
+                        WHITESPACE@58..59 "\n"
+                        R_CURLY@59..60 "}"
             "#]],
         )
     }
@@ -196,8 +198,9 @@ fn test() {
                     R_PAREN@7..8 ")"
                   WHITESPACE@8..9 " "
                   BLOCK_EXPR@9..11
-                    L_CURLY@9..10 "{"
-                    R_CURLY@10..11 "}"
+                    STMT_LIST@9..11
+                      L_CURLY@9..10 "{"
+                      R_CURLY@10..11 "}"
             "#]],
         );
 
@@ -252,9 +255,10 @@ fn bar() {
                       R_PAREN@7..8 ")"
                     WHITESPACE@8..9 " "
                     BLOCK_EXPR@9..12
-                      L_CURLY@9..10 "{"
-                      WHITESPACE@10..11 "\n"
-                      R_CURLY@11..12 "}"
+                      STMT_LIST@9..12
+                        L_CURLY@9..10 "{"
+                        WHITESPACE@10..11 "\n"
+                        R_CURLY@11..12 "}"
             "#]],
         );
 
@@ -280,9 +284,10 @@ fn bar() {
                       R_PAREN@7..8 ")"
                     WHITESPACE@8..9 " "
                     BLOCK_EXPR@9..12
-                      L_CURLY@9..10 "{"
-                      WHITESPACE@10..11 "\n"
-                      R_CURLY@11..12 "}"
+                      STMT_LIST@9..12
+                        L_CURLY@9..10 "{"
+                        WHITESPACE@10..11 "\n"
+                        R_CURLY@11..12 "}"
             "#]],
         );
 
@@ -307,9 +312,10 @@ fn bar() {
                       R_PAREN@7..8 ")"
                     WHITESPACE@8..9 " "
                     BLOCK_EXPR@9..12
-                      L_CURLY@9..10 "{"
-                      WHITESPACE@10..11 "\n"
-                      R_CURLY@11..12 "}"
+                      STMT_LIST@9..12
+                        L_CURLY@9..10 "{"
+                        WHITESPACE@10..11 "\n"
+                        R_CURLY@11..12 "}"
                   WHITESPACE@12..13 "\n"
                   FN@13..25
                     FN_KW@13..15 "fn"
@@ -321,9 +327,10 @@ fn bar() {
                       R_PAREN@20..21 ")"
                     WHITESPACE@21..22 " "
                     BLOCK_EXPR@22..25
-                      L_CURLY@22..23 "{"
-                      WHITESPACE@23..24 "\n"
-                      R_CURLY@24..25 "}"
+                      STMT_LIST@22..25
+                        L_CURLY@22..23 "{"
+                        WHITESPACE@23..24 "\n"
+                        R_CURLY@24..25 "}"
             "#]],
         );
     }
diff --git a/crates/ide_assists/src/handlers/add_return_type.rs b/crates/ide_assists/src/handlers/add_return_type.rs
index ce5981b406e..2ecdf33607b 100644
--- a/crates/ide_assists/src/handlers/add_return_type.rs
+++ b/crates/ide_assists/src/handlers/add_return_type.rs
@@ -100,9 +100,10 @@ fn extract_tail(ctx: &AssistContext) -> Option<(FnType, ast::Expr, InsertOrRepla
             let action = ret_ty_to_action(func.ret_type(), rparen_pos)?;
 
             let body = func.body()?;
-            let tail_expr = body.tail_expr()?;
+            let stmt_list = body.stmt_list()?;
+            let tail_expr = stmt_list.tail_expr()?;
 
-            let ret_range_end = body.l_curly_token()?.text_range().start();
+            let ret_range_end = stmt_list.l_curly_token()?.text_range().start();
             let ret_range = TextRange::new(rparen_pos, ret_range_end);
             (FnType::Function, tail_expr, ret_range, action)
         };
diff --git a/crates/ide_assists/src/handlers/convert_to_guarded_return.rs b/crates/ide_assists/src/handlers/convert_to_guarded_return.rs
index 1ec0e0a5da3..884905a9188 100644
--- a/crates/ide_assists/src/handlers/convert_to_guarded_return.rs
+++ b/crates/ide_assists/src/handlers/convert_to_guarded_return.rs
@@ -68,6 +68,7 @@ pub(crate) fn convert_to_guarded_return(acc: &mut Assists, ctx: &AssistContext)
 
     let cond_expr = cond.expr()?;
     let then_block = if_expr.then_branch()?;
+    let then_block = then_block.stmt_list()?;
 
     let parent_block = if_expr.syntax().parent()?.ancestors().find_map(ast::BlockExpr::cast)?;
 
@@ -75,6 +76,9 @@ pub(crate) fn convert_to_guarded_return(acc: &mut Assists, ctx: &AssistContext)
         return None;
     }
 
+    // FIXME: This relies on untyped syntax tree and casts to much. It should be
+    // rewritten to use strongly-typed APIs.
+
     // check for early return and continue
     let first_in_then_block = then_block.syntax().first_child()?;
     if ast::ReturnExpr::can_cast(first_in_then_block.kind())
diff --git a/crates/ide_assists/src/handlers/extract_function.rs b/crates/ide_assists/src/handlers/extract_function.rs
index 328d172cb8b..733bb347881 100644
--- a/crates/ide_assists/src/handlers/extract_function.rs
+++ b/crates/ide_assists/src/handlers/extract_function.rs
@@ -148,24 +148,30 @@ fn extraction_target(node: &SyntaxNode, selection_range: TextRange) -> Option<Fu
         return match stmt {
             ast::Stmt::Item(_) => None,
             ast::Stmt::ExprStmt(_) | ast::Stmt::LetStmt(_) => Some(FunctionBody::from_range(
-                node.parent().and_then(ast::BlockExpr::cast)?,
+                node.parent().and_then(ast::StmtList::cast)?,
                 node.text_range(),
             )),
         };
     }
 
+    // Covering element returned the parent block of one or multiple statements that have been selected
+    if let Some(stmt_list) = ast::StmtList::cast(node.clone()) {
+        if let Some(block_expr) = stmt_list.syntax().parent().and_then(ast::BlockExpr::cast) {
+            if block_expr.syntax().text_range() == selection_range {
+                return FunctionBody::from_expr(block_expr.into());
+            }
+        }
+
+        // Extract the full statements.
+        return Some(FunctionBody::from_range(stmt_list, selection_range));
+    }
+
     let expr = ast::Expr::cast(node.clone())?;
     // A node got selected fully
     if node.text_range() == selection_range {
         return FunctionBody::from_expr(expr.clone());
     }
 
-    // Covering element returned the parent block of one or multiple statements that have been selected
-    if let ast::Expr::BlockExpr(block) = expr {
-        // Extract the full statements.
-        return Some(FunctionBody::from_range(block, selection_range));
-    }
-
     node.ancestors().find_map(ast::Expr::cast).and_then(FunctionBody::from_expr)
 }
 
@@ -284,7 +290,7 @@ impl RetType {
 #[derive(Debug)]
 enum FunctionBody {
     Expr(ast::Expr),
-    Span { parent: ast::BlockExpr, text_range: TextRange },
+    Span { parent: ast::StmtList, text_range: TextRange },
 }
 
 #[derive(Debug)]
@@ -441,7 +447,7 @@ impl FunctionBody {
         }
     }
 
-    fn from_range(parent: ast::BlockExpr, selected: TextRange) -> FunctionBody {
+    fn from_range(parent: ast::StmtList, selected: TextRange) -> FunctionBody {
         let mut text_range = parent
             .statements()
             .map(|stmt| stmt.syntax().text_range())
@@ -643,14 +649,14 @@ impl FunctionBody {
             break match_ast! {
                 match anc {
                     ast::ClosureExpr(closure) => (false, closure.body(), infer_expr_opt(closure.body())),
-                    ast::EffectExpr(effect) => {
-                        let (constness, block) = match effect.effect() {
-                            ast::Effect::Const(_) => (true, effect.block_expr()),
-                            ast::Effect::Try(_) => (false, effect.block_expr()),
-                            ast::Effect::Label(label) if label.lifetime().is_some() => (false, effect.block_expr()),
+                    ast::BlockExpr(block_expr) => {
+                        let (constness, block) = match block_expr.modifier() {
+                            Some(ast::BlockModifier::Const(_)) => (true, block_expr),
+                            Some(ast::BlockModifier::Try(_)) => (false, block_expr),
+                            Some(ast::BlockModifier::Label(label)) if label.lifetime().is_some() => (false, block_expr),
                             _ => continue,
                         };
-                        let expr = block.map(ast::Expr::BlockExpr);
+                        let expr = Some(ast::Expr::BlockExpr(block));
                         (constness, expr.clone(), infer_expr_opt(expr))
                     },
                     ast::Fn(fn_) => {
@@ -745,7 +751,7 @@ impl FunctionBody {
                         ast::Expr::LoopExpr(_)
                         | ast::Expr::ForExpr(_)
                         | ast::Expr::WhileExpr(_) => loop_depth -= 1,
-                        ast::Expr::EffectExpr(effect) if effect.unsafe_token().is_some() => {
+                        ast::Expr::BlockExpr(block_expr) if block_expr.unsafe_token().is_some() => {
                             unsafe_depth -= 1
                         }
                         _ => (),
@@ -757,7 +763,7 @@ impl FunctionBody {
                 ast::Expr::LoopExpr(_) | ast::Expr::ForExpr(_) | ast::Expr::WhileExpr(_) => {
                     loop_depth += 1;
                 }
-                ast::Expr::EffectExpr(effect) if effect.unsafe_token().is_some() => {
+                ast::Expr::BlockExpr(block_expr) if block_expr.unsafe_token().is_some() => {
                     unsafe_depth += 1
                 }
                 ast::Expr::ReturnExpr(it) => {
diff --git a/crates/ide_assists/src/handlers/extract_variable.rs b/crates/ide_assists/src/handlers/extract_variable.rs
index 9398b84b3fc..9b4e1380a46 100644
--- a/crates/ide_assists/src/handlers/extract_variable.rs
+++ b/crates/ide_assists/src/handlers/extract_variable.rs
@@ -137,6 +137,7 @@ fn valid_target_expr(node: SyntaxNode) -> Option<ast::Expr> {
     }
 }
 
+#[derive(Debug)]
 enum Anchor {
     Before(SyntaxNode),
     Replace(ast::ExprStmt),
@@ -148,7 +149,7 @@ impl Anchor {
         to_extract.syntax().ancestors().take_while(|it| !ast::Item::can_cast(it.kind())).find_map(
             |node| {
                 if let Some(expr) =
-                    node.parent().and_then(ast::BlockExpr::cast).and_then(|it| it.tail_expr())
+                    node.parent().and_then(ast::StmtList::cast).and_then(|it| it.tail_expr())
                 {
                     if expr.syntax() == &node {
                         cov_mark::hit!(test_extract_var_last_expr);
diff --git a/crates/ide_assists/src/handlers/inline_call.rs b/crates/ide_assists/src/handlers/inline_call.rs
index 9927ceb74ec..bd566ec8208 100644
--- a/crates/ide_assists/src/handlers/inline_call.rs
+++ b/crates/ide_assists/src/handlers/inline_call.rs
@@ -389,9 +389,13 @@ fn inline(
             _ => {
                 let ty =
                     sema.type_of_expr(expr).filter(TypeInfo::has_adjustment).and(param_ty.clone());
-                body.push_front(
-                    make::let_stmt(pat.clone(), ty, Some(expr.clone())).clone_for_update().into(),
-                )
+                if let Some(stmt_list) = body.stmt_list() {
+                    stmt_list.push_front(
+                        make::let_stmt(pat.clone(), ty, Some(expr.clone()))
+                            .clone_for_update()
+                            .into(),
+                    )
+                }
             }
         }
     }
diff --git a/crates/ide_assists/src/handlers/inline_local_variable.rs b/crates/ide_assists/src/handlers/inline_local_variable.rs
index 7e5c7870584..337cd6cb5a7 100644
--- a/crates/ide_assists/src/handlers/inline_local_variable.rs
+++ b/crates/ide_assists/src/handlers/inline_local_variable.rs
@@ -93,8 +93,7 @@ pub(crate) fn inline_local_variable(acc: &mut Assists, ctx: &AssistContext) -> O
                     | ast::Expr::ArrayExpr(_)
                     | ast::Expr::ParenExpr(_)
                     | ast::Expr::PathExpr(_)
-                    | ast::Expr::BlockExpr(_)
-                    | ast::Expr::EffectExpr(_),
+                    | ast::Expr::BlockExpr(_),
             );
             let parent = matches!(
                 usage_parent,
diff --git a/crates/ide_assists/src/handlers/remove_dbg.rs b/crates/ide_assists/src/handlers/remove_dbg.rs
index e6aab9e8481..b860a3b6da8 100644
--- a/crates/ide_assists/src/handlers/remove_dbg.rs
+++ b/crates/ide_assists/src/handlers/remove_dbg.rs
@@ -46,7 +46,7 @@ pub(crate) fn remove_dbg(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
         [] => {
             match_ast! {
                 match parent {
-                    ast::BlockExpr(__) => {
+                    ast::StmtList(__) => {
                         let range = macro_call.syntax().text_range();
                         let range = match whitespace_start(macro_call.syntax().prev_sibling_or_token()) {
                             Some(start) => range.cover_offset(start),
diff --git a/crates/ide_assists/src/handlers/unwrap_block.rs b/crates/ide_assists/src/handlers/unwrap_block.rs
index cd6084f6b30..9171874e9d4 100644
--- a/crates/ide_assists/src/handlers/unwrap_block.rs
+++ b/crates/ide_assists/src/handlers/unwrap_block.rs
@@ -30,14 +30,14 @@ pub(crate) fn unwrap_block(acc: &mut Assists, ctx: &AssistContext) -> Option<()>
     let assist_label = "Unwrap block";
 
     let l_curly_token = ctx.find_token_syntax_at_offset(T!['{'])?;
-    let mut block = ast::BlockExpr::cast(l_curly_token.parent()?)?;
+    let mut block = ast::BlockExpr::cast(l_curly_token.ancestors().nth(1)?)?;
     let target = block.syntax().text_range();
     let mut parent = block.syntax().parent()?;
     if ast::MatchArm::can_cast(parent.kind()) {
         parent = parent.ancestors().find(|it| ast::MatchExpr::can_cast(it.kind()))?
     }
 
-    if matches!(parent.kind(), SyntaxKind::BLOCK_EXPR | SyntaxKind::EXPR_STMT) {
+    if matches!(parent.kind(), SyntaxKind::STMT_LIST | SyntaxKind::EXPR_STMT) {
         return acc.add(assist_id, assist_label, target, |builder| {
             builder.replace(block.syntax().text_range(), update_expr_string(block.to_string()));
         });
diff --git a/crates/ide_assists/src/utils.rs b/crates/ide_assists/src/utils.rs
index 2431f5c4e77..aa0956d0f61 100644
--- a/crates/ide_assists/src/utils.rs
+++ b/crates/ide_assists/src/utils.rs
@@ -25,30 +25,34 @@ use crate::assist_context::{AssistBuilder, AssistContext};
 
 pub(crate) use gen_trait_fn_body::gen_trait_fn_body;
 
-pub(crate) fn unwrap_trivial_block(block: ast::BlockExpr) -> ast::Expr {
-    extract_trivial_expression(&block)
+pub(crate) fn unwrap_trivial_block(block_expr: ast::BlockExpr) -> ast::Expr {
+    extract_trivial_expression(&block_expr)
         .filter(|expr| !expr.syntax().text().contains_char('\n'))
-        .unwrap_or_else(|| block.into())
+        .unwrap_or_else(|| block_expr.into())
 }
 
-pub fn extract_trivial_expression(block: &ast::BlockExpr) -> Option<ast::Expr> {
+pub fn extract_trivial_expression(block_expr: &ast::BlockExpr) -> Option<ast::Expr> {
+    if block_expr.modifier().is_some() {
+        return None;
+    }
+    let stmt_list = block_expr.stmt_list()?;
     let has_anything_else = |thing: &SyntaxNode| -> bool {
         let mut non_trivial_children =
-            block.syntax().children_with_tokens().filter(|it| match it.kind() {
+            stmt_list.syntax().children_with_tokens().filter(|it| match it.kind() {
                 WHITESPACE | T!['{'] | T!['}'] => false,
                 _ => it.as_node() != Some(thing),
             });
         non_trivial_children.next().is_some()
     };
 
-    if let Some(expr) = block.tail_expr() {
+    if let Some(expr) = stmt_list.tail_expr() {
         if has_anything_else(expr.syntax()) {
             return None;
         }
         return Some(expr);
     }
     // Unwrap `{ continue; }`
-    let stmt = block.statements().next()?;
+    let stmt = stmt_list.statements().next()?;
     if let ast::Stmt::ExprStmt(expr_stmt) = stmt {
         if has_anything_else(expr_stmt.syntax()) {
             return None;
diff --git a/crates/ide_completion/src/completions/postfix.rs b/crates/ide_completion/src/completions/postfix.rs
index b9eaccaf55c..7edd2e28765 100644
--- a/crates/ide_completion/src/completions/postfix.rs
+++ b/crates/ide_completion/src/completions/postfix.rs
@@ -8,7 +8,7 @@ use ide_db::{
 };
 use syntax::{
     ast::{self, AstNode, AstToken},
-    SyntaxKind::{BLOCK_EXPR, EXPR_STMT},
+    SyntaxKind::{EXPR_STMT, STMT_LIST},
     TextRange, TextSize,
 };
 use text_edit::TextEdit;
@@ -256,7 +256,7 @@ pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) {
     .add_to(acc);
 
     if let Some(parent) = dot_receiver.syntax().parent().and_then(|p| p.parent()) {
-        if matches!(parent.kind(), BLOCK_EXPR | EXPR_STMT) {
+        if matches!(parent.kind(), STMT_LIST | EXPR_STMT) {
             postfix_snippet(
                 ctx,
                 cap,
diff --git a/crates/ide_completion/src/context.rs b/crates/ide_completion/src/context.rs
index abc021acf11..7d5c36d01ff 100644
--- a/crates/ide_completion/src/context.rs
+++ b/crates/ide_completion/src/context.rs
@@ -326,7 +326,7 @@ impl<'a> CompletionContext<'a> {
     }
 
     pub(crate) fn has_block_expr_parent(&self) -> bool {
-        matches!(self.completion_location, Some(ImmediateLocation::BlockExpr))
+        matches!(self.completion_location, Some(ImmediateLocation::StmtList))
     }
 
     pub(crate) fn expects_ident_pat_or_ref_expr(&self) -> bool {
@@ -818,9 +818,9 @@ impl<'a> CompletionContext<'a> {
                     if let Some(stmt) = ast::ExprStmt::cast(node.clone()) {
                         return Some(stmt.syntax().text_range() == name_ref.syntax().text_range());
                     }
-                    if let Some(block) = ast::BlockExpr::cast(node) {
+                    if let Some(stmt_list) = ast::StmtList::cast(node) {
                         return Some(
-                            block.tail_expr().map(|e| e.syntax().text_range())
+                            stmt_list.tail_expr().map(|e| e.syntax().text_range())
                                 == Some(name_ref.syntax().text_range()),
                         );
                     }
diff --git a/crates/ide_completion/src/patterns.rs b/crates/ide_completion/src/patterns.rs
index 6ceef0225a8..05792dd47ef 100644
--- a/crates/ide_completion/src/patterns.rs
+++ b/crates/ide_completion/src/patterns.rs
@@ -38,7 +38,7 @@ pub(crate) enum ImmediateLocation {
     TupleField,
     RefExpr,
     IdentPat,
-    BlockExpr,
+    StmtList,
     ItemList,
     TypeBound,
     // Fake file ast node
@@ -201,7 +201,7 @@ pub(crate) fn determine_location(
             ast::Use(_it) => ImmediateLocation::Use,
             ast::UseTree(_it) => ImmediateLocation::UseTree,
             ast::UseTreeList(_it) => ImmediateLocation::UseTree,
-            ast::BlockExpr(_it) => ImmediateLocation::BlockExpr,
+            ast::StmtList(_it) => ImmediateLocation::StmtList,
             ast::SourceFile(_it) => ImmediateLocation::ItemList,
             ast::ItemList(_it) => ImmediateLocation::ItemList,
             ast::RefExpr(_it) => ImmediateLocation::RefExpr,
@@ -421,8 +421,8 @@ mod tests {
 
     #[test]
     fn test_block_expr_loc() {
-        check_location(r"fn my_fn() { let a = 2; f$0 }", ImmediateLocation::BlockExpr);
-        check_location(r"fn my_fn() { f$0 f }", ImmediateLocation::BlockExpr);
+        check_location(r"fn my_fn() { let a = 2; f$0 }", ImmediateLocation::StmtList);
+        check_location(r"fn my_fn() { f$0 f }", ImmediateLocation::StmtList);
     }
 
     #[test]
diff --git a/crates/ide_db/src/helpers.rs b/crates/ide_db/src/helpers.rs
index c92893716fb..a52c4046bfe 100644
--- a/crates/ide_db/src/helpers.rs
+++ b/crates/ide_db/src/helpers.rs
@@ -139,26 +139,27 @@ impl SnippetCap {
 pub fn for_each_tail_expr(expr: &ast::Expr, cb: &mut dyn FnMut(&ast::Expr)) {
     match expr {
         ast::Expr::BlockExpr(b) => {
-            if let Some(e) = b.tail_expr() {
-                for_each_tail_expr(&e, cb);
-            }
-        }
-        ast::Expr::EffectExpr(e) => match e.effect() {
-            ast::Effect::Label(label) => {
-                for_each_break_expr(Some(label), e.block_expr(), &mut |b| {
-                    cb(&ast::Expr::BreakExpr(b))
-                });
-                if let Some(b) = e.block_expr() {
-                    for_each_tail_expr(&ast::Expr::BlockExpr(b), cb);
+            match b.modifier() {
+                Some(
+                    ast::BlockModifier::Async(_)
+                    | ast::BlockModifier::Try(_)
+                    | ast::BlockModifier::Const(_),
+                ) => return cb(expr),
+
+                Some(ast::BlockModifier::Label(label)) => {
+                    for_each_break_expr(Some(label), b.stmt_list(), &mut |b| {
+                        cb(&ast::Expr::BreakExpr(b))
+                    });
                 }
+                Some(ast::BlockModifier::Unsafe(_)) => (),
+                None => (),
             }
-            ast::Effect::Unsafe(_) => {
-                if let Some(e) = e.block_expr().and_then(|b| b.tail_expr()) {
+            if let Some(stmt_list) = b.stmt_list() {
+                if let Some(e) = stmt_list.tail_expr() {
                     for_each_tail_expr(&e, cb);
                 }
             }
-            ast::Effect::Async(_) | ast::Effect::Try(_) | ast::Effect::Const(_) => cb(expr),
-        },
+        }
         ast::Expr::IfExpr(if_) => {
             let mut if_ = if_.clone();
             loop {
@@ -176,7 +177,9 @@ pub fn for_each_tail_expr(expr: &ast::Expr, cb: &mut dyn FnMut(&ast::Expr)) {
             }
         }
         ast::Expr::LoopExpr(l) => {
-            for_each_break_expr(l.label(), l.loop_body(), &mut |b| cb(&ast::Expr::BreakExpr(b)))
+            for_each_break_expr(l.label(), l.loop_body().and_then(|it| it.stmt_list()), &mut |b| {
+                cb(&ast::Expr::BreakExpr(b))
+            })
         }
         ast::Expr::MatchExpr(m) => {
             if let Some(arms) = m.match_arm_list() {
@@ -216,7 +219,7 @@ pub fn for_each_tail_expr(expr: &ast::Expr, cb: &mut dyn FnMut(&ast::Expr)) {
 /// Calls `cb` on each break expr inside of `body` that is applicable for the given label.
 pub fn for_each_break_expr(
     label: Option<ast::Label>,
-    body: Option<ast::BlockExpr>,
+    body: Option<ast::StmtList>,
     cb: &mut dyn FnMut(ast::BreakExpr),
 ) {
     let label = label.and_then(|lbl| lbl.lifetime());
@@ -236,7 +239,7 @@ pub fn for_each_break_expr(
                     ast::Expr::LoopExpr(_) | ast::Expr::WhileExpr(_) | ast::Expr::ForExpr(_) => {
                         depth += 1
                     }
-                    ast::Expr::EffectExpr(e) if e.label().is_some() => depth += 1,
+                    ast::Expr::BlockExpr(e) if e.label().is_some() => depth += 1,
                     ast::Expr::BreakExpr(b)
                         if (depth == 0 && b.lifetime().is_none()) || eq_label(b.lifetime()) =>
                     {
@@ -248,7 +251,7 @@ pub fn for_each_break_expr(
                     ast::Expr::LoopExpr(_) | ast::Expr::WhileExpr(_) | ast::Expr::ForExpr(_) => {
                         depth -= 1
                     }
-                    ast::Expr::EffectExpr(e) if e.label().is_some() => depth -= 1,
+                    ast::Expr::BlockExpr(e) if e.label().is_some() => depth -= 1,
                     _ => (),
                 },
             }
diff --git a/crates/ide_db/src/helpers/insert_use.rs b/crates/ide_db/src/helpers/insert_use.rs
index 8acad6a8ca4..a8ac0a90062 100644
--- a/crates/ide_db/src/helpers/insert_use.rs
+++ b/crates/ide_db/src/helpers/insert_use.rs
@@ -46,7 +46,7 @@ pub struct InsertUseConfig {
 pub enum ImportScope {
     File(ast::SourceFile),
     Module(ast::ItemList),
-    Block(ast::BlockExpr),
+    Block(ast::StmtList),
 }
 
 impl ImportScope {
@@ -60,15 +60,15 @@ impl ImportScope {
             match syntax {
                 ast::Module(module) => module.item_list().map(ImportScope::Module),
                 ast::SourceFile(file) => Some(ImportScope::File(file)),
-                ast::Fn(func) => contains_cfg_attr(&func).then(|| func.body().map(ImportScope::Block)).flatten(),
+                ast::Fn(func) => contains_cfg_attr(&func).then(|| func.body().and_then(|it| it.stmt_list().map(ImportScope::Block))).flatten(),
                 ast::Const(konst) => contains_cfg_attr(&konst).then(|| match konst.body()? {
                     ast::Expr::BlockExpr(block) => Some(block),
                     _ => None,
-                }).flatten().map(ImportScope::Block),
+                }).flatten().and_then(|it| it.stmt_list().map(ImportScope::Block)),
                 ast::Static(statik) => contains_cfg_attr(&statik).then(|| match statik.body()? {
                     ast::Expr::BlockExpr(block) => Some(block),
                     _ => None,
-                }).flatten().map(ImportScope::Block),
+                }).flatten().and_then(|it| it.stmt_list().map(ImportScope::Block)),
                 _ => None,
 
             }
diff --git a/crates/ide_db/src/helpers/insert_use/tests.rs b/crates/ide_db/src/helpers/insert_use/tests.rs
index c5420f46796..339360ba4a4 100644
--- a/crates/ide_db/src/helpers/insert_use/tests.rs
+++ b/crates/ide_db/src/helpers/insert_use/tests.rs
@@ -1,8 +1,8 @@
-use super::*;
-
 use hir::PrefixKind;
 use test_utils::{assert_eq_text, extract_range_or_offset, CURSOR_MARKER};
 
+use super::*;
+
 #[test]
 fn respects_cfg_attr_fn() {
     check(
diff --git a/crates/ide_db/src/helpers/node_ext.rs b/crates/ide_db/src/helpers/node_ext.rs
index 24f853737b8..fe823f74f8b 100644
--- a/crates/ide_db/src/helpers/node_ext.rs
+++ b/crates/ide_db/src/helpers/node_ext.rs
@@ -32,8 +32,8 @@ pub fn walk_expr(expr: &ast::Expr, cb: &mut dyn FnMut(ast::Expr)) {
 /// Preorder walk all the expression's child expressions preserving events.
 /// If the callback returns true on an [`WalkEvent::Enter`], the subtree of the expression will be skipped.
 /// Note that the subtree may already be skipped due to the context analysis this function does.
-pub fn preorder_expr(expr: &ast::Expr, cb: &mut dyn FnMut(WalkEvent<ast::Expr>) -> bool) {
-    let mut preorder = expr.syntax().preorder();
+pub fn preorder_expr(start: &ast::Expr, cb: &mut dyn FnMut(WalkEvent<ast::Expr>) -> bool) {
+    let mut preorder = start.syntax().preorder();
     while let Some(event) = preorder.next() {
         let node = match event {
             WalkEvent::Enter(node) => node,
@@ -44,17 +44,17 @@ pub fn preorder_expr(expr: &ast::Expr, cb: &mut dyn FnMut(WalkEvent<ast::Expr>)
                 continue;
             }
         };
-        match ast::Stmt::cast(node.clone()) {
-            // recursively walk the initializer, skipping potential const pat expressions
-            // let statements aren't usually nested too deeply so this is fine to recurse on
-            Some(ast::Stmt::LetStmt(l)) => {
-                if let Some(expr) = l.initializer() {
-                    preorder_expr(&expr, cb);
-                }
+        if let Some(let_stmt) = node.parent().and_then(ast::LetStmt::cast) {
+            if Some(node.clone()) != let_stmt.initializer().map(|it| it.syntax().clone()) {
+                // skipping potential const pat expressions in  let statements
                 preorder.skip_subtree();
+                continue;
             }
+        }
+
+        match ast::Stmt::cast(node.clone()) {
             // Don't skip subtree since we want to process the expression child next
-            Some(ast::Stmt::ExprStmt(_)) => (),
+            Some(ast::Stmt::ExprStmt(_)) | Some(ast::Stmt::LetStmt(_)) => (),
             // This might be an expression
             Some(ast::Stmt::Item(ast::Item::MacroCall(mcall))) => {
                 cb(WalkEvent::Enter(ast::Expr::MacroCall(mcall)));
@@ -68,15 +68,19 @@ pub fn preorder_expr(expr: &ast::Expr, cb: &mut dyn FnMut(WalkEvent<ast::Expr>)
                     preorder.skip_subtree();
                 } else if let Some(expr) = ast::Expr::cast(node) {
                     let is_different_context = match &expr {
-                        ast::Expr::EffectExpr(effect) => {
+                        ast::Expr::BlockExpr(block_expr) => {
                             matches!(
-                                effect.effect(),
-                                ast::Effect::Async(_) | ast::Effect::Try(_) | ast::Effect::Const(_)
+                                block_expr.modifier(),
+                                Some(
+                                    ast::BlockModifier::Async(_)
+                                        | ast::BlockModifier::Try(_)
+                                        | ast::BlockModifier::Const(_)
+                                )
                             )
                         }
                         ast::Expr::ClosureExpr(_) => true,
                         _ => false,
-                    };
+                    } && expr.syntax() != start.syntax();
                     let skip = cb(WalkEvent::Enter(expr));
                     if skip || is_different_context {
                         preorder.skip_subtree();
@@ -88,8 +92,8 @@ pub fn preorder_expr(expr: &ast::Expr, cb: &mut dyn FnMut(WalkEvent<ast::Expr>)
 }
 
 /// Preorder walk all the expression's child patterns.
-pub fn walk_patterns_in_expr(expr: &ast::Expr, cb: &mut dyn FnMut(ast::Pat)) {
-    let mut preorder = expr.syntax().preorder();
+pub fn walk_patterns_in_expr(start: &ast::Expr, cb: &mut dyn FnMut(ast::Pat)) {
+    let mut preorder = start.syntax().preorder();
     while let Some(event) = preorder.next() {
         let node = match event {
             WalkEvent::Enter(node) => node,
@@ -115,15 +119,19 @@ pub fn walk_patterns_in_expr(expr: &ast::Expr, cb: &mut dyn FnMut(ast::Pat)) {
                     preorder.skip_subtree();
                 } else if let Some(expr) = ast::Expr::cast(node.clone()) {
                     let is_different_context = match &expr {
-                        ast::Expr::EffectExpr(effect) => match effect.effect() {
-                            ast::Effect::Async(_) | ast::Effect::Try(_) | ast::Effect::Const(_) => {
-                                true
-                            }
-                            ast::Effect::Unsafe(_) | ast::Effect::Label(_) => false,
-                        },
+                        ast::Expr::BlockExpr(block_expr) => {
+                            matches!(
+                                block_expr.modifier(),
+                                Some(
+                                    ast::BlockModifier::Async(_)
+                                        | ast::BlockModifier::Try(_)
+                                        | ast::BlockModifier::Const(_)
+                                )
+                            )
+                        }
                         ast::Expr::ClosureExpr(_) => true,
                         _ => false,
-                    };
+                    } && expr.syntax() != start.syntax();
                     if is_different_context {
                         preorder.skip_subtree();
                     }
diff --git a/crates/mbe/src/tests/expand.rs b/crates/mbe/src/tests/expand.rs
index eb2e2f6a503..df374aea981 100644
--- a/crates/mbe/src/tests/expand.rs
+++ b/crates/mbe/src/tests/expand.rs
@@ -217,20 +217,21 @@ fn test_expr_order() {
       L_PAREN@5..6 "("
       R_PAREN@6..7 ")"
     BLOCK_EXPR@7..15
-      L_CURLY@7..8 "{"
-      EXPR_STMT@8..14
-        BIN_EXPR@8..13
-          BIN_EXPR@8..11
-            LITERAL@8..9
-              INT_NUMBER@8..9 "1"
-            PLUS@9..10 "+"
-            LITERAL@10..11
-              INT_NUMBER@10..11 "1"
-          STAR@11..12 "*"
-          LITERAL@12..13
-            INT_NUMBER@12..13 "2"
-        SEMICOLON@13..14 ";"
-      R_CURLY@14..15 "}""#,
+      STMT_LIST@7..15
+        L_CURLY@7..8 "{"
+        EXPR_STMT@8..14
+          BIN_EXPR@8..13
+            BIN_EXPR@8..11
+              LITERAL@8..9
+                INT_NUMBER@8..9 "1"
+              PLUS@9..10 "+"
+              LITERAL@10..11
+                INT_NUMBER@10..11 "1"
+            STAR@11..12 "*"
+            LITERAL@12..13
+              INT_NUMBER@12..13 "2"
+          SEMICOLON@13..14 ";"
+        R_CURLY@14..15 "}""#,
         dump.trim()
     );
 }
@@ -1320,70 +1321,72 @@ fn test_vec() {
 
     let tree = fixture.expand_expr(r#"vec![1u32,2];"#);
 
-    assert_eq!(
-        format!("{:#?}", tree).trim(),
+    assert_eq_text!(
+        &format!("{:#?}", tree),
         r#"BLOCK_EXPR@0..45
-  L_CURLY@0..1 "{"
-  LET_STMT@1..20
-    LET_KW@1..4 "let"
-    IDENT_PAT@4..8
-      MUT_KW@4..7 "mut"
-      NAME@7..8
-        IDENT@7..8 "v"
-    EQ@8..9 "="
-    CALL_EXPR@9..19
-      PATH_EXPR@9..17
-        PATH@9..17
-          PATH@9..12
-            PATH_SEGMENT@9..12
-              NAME_REF@9..12
-                IDENT@9..12 "Vec"
-          COLON2@12..14 "::"
-          PATH_SEGMENT@14..17
-            NAME_REF@14..17
-              IDENT@14..17 "new"
-      ARG_LIST@17..19
-        L_PAREN@17..18 "("
-        R_PAREN@18..19 ")"
-    SEMICOLON@19..20 ";"
-  EXPR_STMT@20..33
-    METHOD_CALL_EXPR@20..32
-      PATH_EXPR@20..21
-        PATH@20..21
-          PATH_SEGMENT@20..21
-            NAME_REF@20..21
-              IDENT@20..21 "v"
-      DOT@21..22 "."
-      NAME_REF@22..26
-        IDENT@22..26 "push"
-      ARG_LIST@26..32
-        L_PAREN@26..27 "("
-        LITERAL@27..31
-          INT_NUMBER@27..31 "1u32"
-        R_PAREN@31..32 ")"
-    SEMICOLON@32..33 ";"
-  EXPR_STMT@33..43
-    METHOD_CALL_EXPR@33..42
-      PATH_EXPR@33..34
-        PATH@33..34
-          PATH_SEGMENT@33..34
-            NAME_REF@33..34
-              IDENT@33..34 "v"
-      DOT@34..35 "."
-      NAME_REF@35..39
-        IDENT@35..39 "push"
-      ARG_LIST@39..42
-        L_PAREN@39..40 "("
-        LITERAL@40..41
-          INT_NUMBER@40..41 "2"
-        R_PAREN@41..42 ")"
-    SEMICOLON@42..43 ";"
-  PATH_EXPR@43..44
-    PATH@43..44
-      PATH_SEGMENT@43..44
-        NAME_REF@43..44
-          IDENT@43..44 "v"
-  R_CURLY@44..45 "}""#
+  STMT_LIST@0..45
+    L_CURLY@0..1 "{"
+    LET_STMT@1..20
+      LET_KW@1..4 "let"
+      IDENT_PAT@4..8
+        MUT_KW@4..7 "mut"
+        NAME@7..8
+          IDENT@7..8 "v"
+      EQ@8..9 "="
+      CALL_EXPR@9..19
+        PATH_EXPR@9..17
+          PATH@9..17
+            PATH@9..12
+              PATH_SEGMENT@9..12
+                NAME_REF@9..12
+                  IDENT@9..12 "Vec"
+            COLON2@12..14 "::"
+            PATH_SEGMENT@14..17
+              NAME_REF@14..17
+                IDENT@14..17 "new"
+        ARG_LIST@17..19
+          L_PAREN@17..18 "("
+          R_PAREN@18..19 ")"
+      SEMICOLON@19..20 ";"
+    EXPR_STMT@20..33
+      METHOD_CALL_EXPR@20..32
+        PATH_EXPR@20..21
+          PATH@20..21
+            PATH_SEGMENT@20..21
+              NAME_REF@20..21
+                IDENT@20..21 "v"
+        DOT@21..22 "."
+        NAME_REF@22..26
+          IDENT@22..26 "push"
+        ARG_LIST@26..32
+          L_PAREN@26..27 "("
+          LITERAL@27..31
+            INT_NUMBER@27..31 "1u32"
+          R_PAREN@31..32 ")"
+      SEMICOLON@32..33 ";"
+    EXPR_STMT@33..43
+      METHOD_CALL_EXPR@33..42
+        PATH_EXPR@33..34
+          PATH@33..34
+            PATH_SEGMENT@33..34
+              NAME_REF@33..34
+                IDENT@33..34 "v"
+        DOT@34..35 "."
+        NAME_REF@35..39
+          IDENT@35..39 "push"
+        ARG_LIST@39..42
+          L_PAREN@39..40 "("
+          LITERAL@40..41
+            INT_NUMBER@40..41 "2"
+          R_PAREN@41..42 ")"
+      SEMICOLON@42..43 ";"
+    PATH_EXPR@43..44
+      PATH@43..44
+        PATH_SEGMENT@43..44
+          NAME_REF@43..44
+            IDENT@43..44 "v"
+    R_CURLY@44..45 "}"
+"#
     );
 }
 
diff --git a/crates/parser/src/grammar/expressions/atom.rs b/crates/parser/src/grammar/expressions/atom.rs
index f6e9a5f1b34..bb70c0d9322 100644
--- a/crates/parser/src/grammar/expressions/atom.rs
+++ b/crates/parser/src/grammar/expressions/atom.rs
@@ -93,8 +93,8 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
                 // test labeled_block
                 // fn f() { 'label: {}; }
                 T!['{'] => {
-                    block_expr(p);
-                    m.complete(p, EFFECT_EXPR)
+                    stmt_list(p);
+                    m.complete(p, BLOCK_EXPR)
                 }
                 _ => {
                     // test_err misplaced_label_err
@@ -111,8 +111,8 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
             let m = p.start();
             p.bump(T![async]);
             p.eat(T![move]);
-            block_expr(p);
-            m.complete(p, EFFECT_EXPR)
+            stmt_list(p);
+            m.complete(p, BLOCK_EXPR)
         }
         T![match] => match_expr(p),
         // test unsafe_block
@@ -120,16 +120,16 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
         T![unsafe] if la == T!['{'] => {
             let m = p.start();
             p.bump(T![unsafe]);
-            block_expr(p);
-            m.complete(p, EFFECT_EXPR)
+            stmt_list(p);
+            m.complete(p, BLOCK_EXPR)
         }
         // test const_block
         // fn f() { const { } }
         T![const] if la == T!['{'] => {
             let m = p.start();
             p.bump(T![const]);
-            block_expr(p);
-            m.complete(p, EFFECT_EXPR)
+            stmt_list(p);
+            m.complete(p, BLOCK_EXPR)
         }
         T!['{'] => {
             // test for_range_from
@@ -138,7 +138,9 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
             //        break;
             //    }
             // }
-            block_expr_unchecked(p)
+            let m = p.start();
+            stmt_list(p);
+            m.complete(p, BLOCK_EXPR)
         }
         T![return] => return_expr(p),
         T![yield] => yield_expr(p),
@@ -150,9 +152,7 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option<(CompletedMar
         }
     };
     let blocklike = match done.kind() {
-        IF_EXPR | WHILE_EXPR | FOR_EXPR | LOOP_EXPR | MATCH_EXPR | BLOCK_EXPR | EFFECT_EXPR => {
-            BlockLike::Block
-        }
+        IF_EXPR | WHILE_EXPR | FOR_EXPR | LOOP_EXPR | MATCH_EXPR | BLOCK_EXPR => BlockLike::Block,
         _ => BlockLike::NotBlock,
     };
     Some((done, blocklike))
@@ -486,16 +486,18 @@ pub(crate) fn block_expr(p: &mut Parser) {
         p.error("expected a block");
         return;
     }
-    block_expr_unchecked(p);
+    let m = p.start();
+    stmt_list(p);
+    m.complete(p, BLOCK_EXPR);
 }
 
-fn block_expr_unchecked(p: &mut Parser) -> CompletedMarker {
+fn stmt_list(p: &mut Parser) -> CompletedMarker {
     assert!(p.at(T!['{']));
     let m = p.start();
     p.bump(T!['{']);
     expr_block_contents(p);
     p.expect(T!['}']);
-    m.complete(p, BLOCK_EXPR)
+    m.complete(p, STMT_LIST)
 }
 
 // test return_expr
@@ -597,8 +599,12 @@ fn try_block_expr(p: &mut Parser, m: Option<Marker>) -> CompletedMarker {
     }
 
     p.bump(T![try]);
-    block_expr(p);
-    m.complete(p, EFFECT_EXPR)
+    if p.at(T!['{']) {
+        stmt_list(p);
+    } else {
+        p.error("expected a block")
+    }
+    m.complete(p, BLOCK_EXPR)
 }
 
 // test box_expr
diff --git a/crates/parser/src/syntax_kind/generated.rs b/crates/parser/src/syntax_kind/generated.rs
index 0986b23bf81..842d66755c6 100644
--- a/crates/parser/src/syntax_kind/generated.rs
+++ b/crates/parser/src/syntax_kind/generated.rs
@@ -187,6 +187,7 @@ pub enum SyntaxKind {
     BREAK_EXPR,
     LABEL,
     BLOCK_EXPR,
+    STMT_LIST,
     RETURN_EXPR,
     YIELD_EXPR,
     MATCH_EXPR,
@@ -196,7 +197,6 @@ pub enum SyntaxKind {
     RECORD_EXPR,
     RECORD_EXPR_FIELD_LIST,
     RECORD_EXPR_FIELD,
-    EFFECT_EXPR,
     BOX_EXPR,
     CALL_EXPR,
     INDEX_EXPR,
diff --git a/crates/syntax/Cargo.toml b/crates/syntax/Cargo.toml
index 6a48a322a66..f889fa2a2c3 100644
--- a/crates/syntax/Cargo.toml
+++ b/crates/syntax/Cargo.toml
@@ -29,7 +29,7 @@ rayon = "1"
 expect-test = "1.1"
 proc-macro2 = "1.0.8"
 quote = "1.0.2"
-ungrammar = "=1.14"
+ungrammar = "=1.14.5"
 
 test_utils = { path = "../test_utils" }
 sourcegen = { path = "../sourcegen" }
diff --git a/crates/syntax/src/ast.rs b/crates/syntax/src/ast.rs
index 7c9200f5688..e07b22a550e 100644
--- a/crates/syntax/src/ast.rs
+++ b/crates/syntax/src/ast.rs
@@ -18,7 +18,7 @@ use crate::{
 };
 
 pub use self::{
-    expr_ext::{ArrayExprKind, Effect, ElseBranch, LiteralKind},
+    expr_ext::{ArrayExprKind, BlockModifier, ElseBranch, LiteralKind},
     generated::{nodes::*, tokens::*},
     node_ext::{
         AttrKind, FieldKind, Macro, NameLike, NameOrNameRef, PathSegmentKind, SelfParamKind,
diff --git a/crates/syntax/src/ast/edit_in_place.rs b/crates/syntax/src/ast/edit_in_place.rs
index 9c5ae9a156d..d6775c89ba7 100644
--- a/crates/syntax/src/ast/edit_in_place.rs
+++ b/crates/syntax/src/ast/edit_in_place.rs
@@ -451,7 +451,7 @@ impl ast::RecordExprFieldList {
     }
 }
 
-impl ast::BlockExpr {
+impl ast::StmtList {
     pub fn push_front(&self, statement: ast::Stmt) {
         ted::insert(Position::after(self.l_curly_token().unwrap()), statement.syntax());
     }
diff --git a/crates/syntax/src/ast/expr_ext.rs b/crates/syntax/src/ast/expr_ext.rs
index 9d78cb226fd..4f92cc06716 100644
--- a/crates/syntax/src/ast/expr_ext.rs
+++ b/crates/syntax/src/ast/expr_ext.rs
@@ -25,7 +25,6 @@ impl ast::Expr {
                 | ast::Expr::WhileExpr(_)
                 | ast::Expr::BlockExpr(_)
                 | ast::Expr::MatchExpr(_)
-                | ast::Expr::EffectExpr(_)
         )
     }
 }
@@ -268,38 +267,23 @@ impl ast::Literal {
     }
 }
 
-#[derive(Debug, Clone, PartialEq, Eq)]
-pub enum Effect {
+pub enum BlockModifier {
     Async(SyntaxToken),
     Unsafe(SyntaxToken),
     Try(SyntaxToken),
     Const(SyntaxToken),
-    // Very much not an effect, but we stuff it into this node anyway
     Label(ast::Label),
 }
 
-impl ast::EffectExpr {
-    pub fn effect(&self) -> Effect {
-        if let Some(token) = self.async_token() {
-            return Effect::Async(token);
-        }
-        if let Some(token) = self.unsafe_token() {
-            return Effect::Unsafe(token);
-        }
-        if let Some(token) = self.try_token() {
-            return Effect::Try(token);
-        }
-        if let Some(token) = self.const_token() {
-            return Effect::Const(token);
-        }
-        if let Some(label) = self.label() {
-            return Effect::Label(label);
-        }
-        unreachable!("ast::EffectExpr without Effect")
-    }
-}
-
 impl ast::BlockExpr {
+    pub fn modifier(&self) -> Option<BlockModifier> {
+        self.async_token()
+            .map(BlockModifier::Async)
+            .or_else(|| self.unsafe_token().map(BlockModifier::Unsafe))
+            .or_else(|| self.try_token().map(BlockModifier::Try))
+            .or_else(|| self.const_token().map(BlockModifier::Const))
+            .or_else(|| self.label().map(BlockModifier::Label))
+    }
     /// false if the block is an intrinsic part of the syntax and can't be
     /// replaced with arbitrary expression.
     ///
@@ -312,7 +296,7 @@ impl ast::BlockExpr {
             Some(it) => it,
             None => return true,
         };
-        !matches!(parent.kind(), FN | IF_EXPR | WHILE_EXPR | LOOP_EXPR | EFFECT_EXPR)
+        !matches!(parent.kind(), FN | IF_EXPR | WHILE_EXPR | LOOP_EXPR)
     }
 }
 
diff --git a/crates/syntax/src/ast/generated/nodes.rs b/crates/syntax/src/ast/generated/nodes.rs
index 547e7546364..066ad91d38a 100644
--- a/crates/syntax/src/ast/generated/nodes.rs
+++ b/crates/syntax/src/ast/generated/nodes.rs
@@ -477,10 +477,12 @@ pub struct BlockExpr {
 }
 impl ast::AttrsOwner for BlockExpr {}
 impl BlockExpr {
-    pub fn l_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) }
-    pub fn statements(&self) -> AstChildren<Stmt> { support::children(&self.syntax) }
-    pub fn tail_expr(&self) -> Option<Expr> { support::child(&self.syntax) }
-    pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }
+    pub fn label(&self) -> Option<Label> { support::child(&self.syntax) }
+    pub fn try_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![try]) }
+    pub fn unsafe_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![unsafe]) }
+    pub fn async_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![async]) }
+    pub fn const_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![const]) }
+    pub fn stmt_list(&self) -> Option<StmtList> { support::child(&self.syntax) }
 }
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct SelfParam {
@@ -643,7 +645,6 @@ impl Meta {
 pub struct ExprStmt {
     pub(crate) syntax: SyntaxNode,
 }
-impl ast::AttrsOwner for ExprStmt {}
 impl ExprStmt {
     pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
     pub fn semicolon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![;]) }
@@ -753,19 +754,6 @@ impl ContinueExpr {
     pub fn lifetime(&self) -> Option<Lifetime> { support::child(&self.syntax) }
 }
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct EffectExpr {
-    pub(crate) syntax: SyntaxNode,
-}
-impl ast::AttrsOwner for EffectExpr {}
-impl EffectExpr {
-    pub fn label(&self) -> Option<Label> { support::child(&self.syntax) }
-    pub fn try_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![try]) }
-    pub fn unsafe_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![unsafe]) }
-    pub fn async_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![async]) }
-    pub fn const_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![const]) }
-    pub fn block_expr(&self) -> Option<BlockExpr> { support::child(&self.syntax) }
-}
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct FieldExpr {
     pub(crate) syntax: SyntaxNode,
 }
@@ -945,6 +933,17 @@ impl YieldExpr {
     pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }
 }
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct StmtList {
+    pub(crate) syntax: SyntaxNode,
+}
+impl ast::AttrsOwner for StmtList {}
+impl StmtList {
+    pub fn l_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) }
+    pub fn statements(&self) -> AstChildren<Stmt> { support::children(&self.syntax) }
+    pub fn tail_expr(&self) -> Option<Expr> { support::child(&self.syntax) }
+    pub fn r_curly_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }
+}
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct Label {
     pub(crate) syntax: SyntaxNode,
 }
@@ -1339,7 +1338,6 @@ pub enum Expr {
     CastExpr(CastExpr),
     ClosureExpr(ClosureExpr),
     ContinueExpr(ContinueExpr),
-    EffectExpr(EffectExpr),
     FieldExpr(FieldExpr),
     ForExpr(ForExpr),
     IfExpr(IfExpr),
@@ -2255,17 +2253,6 @@ impl AstNode for ContinueExpr {
     }
     fn syntax(&self) -> &SyntaxNode { &self.syntax }
 }
-impl AstNode for EffectExpr {
-    fn can_cast(kind: SyntaxKind) -> bool { kind == EFFECT_EXPR }
-    fn cast(syntax: SyntaxNode) -> Option<Self> {
-        if Self::can_cast(syntax.kind()) {
-            Some(Self { syntax })
-        } else {
-            None
-        }
-    }
-    fn syntax(&self) -> &SyntaxNode { &self.syntax }
-}
 impl AstNode for FieldExpr {
     fn can_cast(kind: SyntaxKind) -> bool { kind == FIELD_EXPR }
     fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -2475,6 +2462,17 @@ impl AstNode for YieldExpr {
     }
     fn syntax(&self) -> &SyntaxNode { &self.syntax }
 }
+impl AstNode for StmtList {
+    fn can_cast(kind: SyntaxKind) -> bool { kind == STMT_LIST }
+    fn cast(syntax: SyntaxNode) -> Option<Self> {
+        if Self::can_cast(syntax.kind()) {
+            Some(Self { syntax })
+        } else {
+            None
+        }
+    }
+    fn syntax(&self) -> &SyntaxNode { &self.syntax }
+}
 impl AstNode for Label {
     fn can_cast(kind: SyntaxKind) -> bool { kind == LABEL }
     fn cast(syntax: SyntaxNode) -> Option<Self> {
@@ -3073,9 +3071,6 @@ impl From<ClosureExpr> for Expr {
 impl From<ContinueExpr> for Expr {
     fn from(node: ContinueExpr) -> Expr { Expr::ContinueExpr(node) }
 }
-impl From<EffectExpr> for Expr {
-    fn from(node: EffectExpr) -> Expr { Expr::EffectExpr(node) }
-}
 impl From<FieldExpr> for Expr {
     fn from(node: FieldExpr) -> Expr { Expr::FieldExpr(node) }
 }
@@ -3143,9 +3138,9 @@ impl AstNode for Expr {
     fn can_cast(kind: SyntaxKind) -> bool {
         match kind {
             ARRAY_EXPR | AWAIT_EXPR | BIN_EXPR | BLOCK_EXPR | BOX_EXPR | BREAK_EXPR | CALL_EXPR
-            | CAST_EXPR | CLOSURE_EXPR | CONTINUE_EXPR | EFFECT_EXPR | FIELD_EXPR | FOR_EXPR
-            | IF_EXPR | INDEX_EXPR | LITERAL | LOOP_EXPR | MACRO_CALL | MACRO_STMTS
-            | MATCH_EXPR | METHOD_CALL_EXPR | PAREN_EXPR | PATH_EXPR | PREFIX_EXPR | RANGE_EXPR
+            | CAST_EXPR | CLOSURE_EXPR | CONTINUE_EXPR | FIELD_EXPR | FOR_EXPR | IF_EXPR
+            | INDEX_EXPR | LITERAL | LOOP_EXPR | MACRO_CALL | MACRO_STMTS | MATCH_EXPR
+            | METHOD_CALL_EXPR | PAREN_EXPR | PATH_EXPR | PREFIX_EXPR | RANGE_EXPR
             | RECORD_EXPR | REF_EXPR | RETURN_EXPR | TRY_EXPR | TUPLE_EXPR | WHILE_EXPR
             | YIELD_EXPR => true,
             _ => false,
@@ -3163,7 +3158,6 @@ impl AstNode for Expr {
             CAST_EXPR => Expr::CastExpr(CastExpr { syntax }),
             CLOSURE_EXPR => Expr::ClosureExpr(ClosureExpr { syntax }),
             CONTINUE_EXPR => Expr::ContinueExpr(ContinueExpr { syntax }),
-            EFFECT_EXPR => Expr::EffectExpr(EffectExpr { syntax }),
             FIELD_EXPR => Expr::FieldExpr(FieldExpr { syntax }),
             FOR_EXPR => Expr::ForExpr(ForExpr { syntax }),
             IF_EXPR => Expr::IfExpr(IfExpr { syntax }),
@@ -3201,7 +3195,6 @@ impl AstNode for Expr {
             Expr::CastExpr(it) => &it.syntax,
             Expr::ClosureExpr(it) => &it.syntax,
             Expr::ContinueExpr(it) => &it.syntax,
-            Expr::EffectExpr(it) => &it.syntax,
             Expr::FieldExpr(it) => &it.syntax,
             Expr::ForExpr(it) => &it.syntax,
             Expr::IfExpr(it) => &it.syntax,
@@ -3660,7 +3653,6 @@ impl AstNode for DynAttrsOwner {
             | CONST_PARAM
             | LIFETIME_PARAM
             | TYPE_PARAM
-            | EXPR_STMT
             | LET_STMT
             | ARRAY_EXPR
             | AWAIT_EXPR
@@ -3671,7 +3663,6 @@ impl AstNode for DynAttrsOwner {
             | CAST_EXPR
             | CLOSURE_EXPR
             | CONTINUE_EXPR
-            | EFFECT_EXPR
             | FIELD_EXPR
             | FOR_EXPR
             | IF_EXPR
@@ -3690,6 +3681,7 @@ impl AstNode for DynAttrsOwner {
             | TUPLE_EXPR
             | WHILE_EXPR
             | YIELD_EXPR
+            | STMT_LIST
             | RECORD_EXPR_FIELD_LIST
             | RECORD_EXPR_FIELD
             | MATCH_ARM_LIST
@@ -4222,11 +4214,6 @@ impl std::fmt::Display for ContinueExpr {
         std::fmt::Display::fmt(self.syntax(), f)
     }
 }
-impl std::fmt::Display for EffectExpr {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        std::fmt::Display::fmt(self.syntax(), f)
-    }
-}
 impl std::fmt::Display for FieldExpr {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         std::fmt::Display::fmt(self.syntax(), f)
@@ -4322,6 +4309,11 @@ impl std::fmt::Display for YieldExpr {
         std::fmt::Display::fmt(self.syntax(), f)
     }
 }
+impl std::fmt::Display for StmtList {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        std::fmt::Display::fmt(self.syntax(), f)
+    }
+}
 impl std::fmt::Display for Label {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         std::fmt::Display::fmt(self.syntax(), f)
diff --git a/crates/syntax/src/ast/make.rs b/crates/syntax/src/ast/make.rs
index b01befebea1..dc13e916c8f 100644
--- a/crates/syntax/src/ast/make.rs
+++ b/crates/syntax/src/ast/make.rs
@@ -247,6 +247,7 @@ pub fn record_field(
     ast_from_text(&format!("struct S {{ {}{}: {}, }}", visibility, name, ty))
 }
 
+// TODO
 pub fn block_expr(
     stmts: impl IntoIterator<Item = ast::Stmt>,
     tail_expr: Option<ast::Expr>,
diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs
index ab47d4ece91..cb3bdaac1bb 100644
--- a/crates/syntax/src/ast/node_ext.rs
+++ b/crates/syntax/src/ast/node_ext.rs
@@ -11,8 +11,8 @@ use rowan::{GreenNodeData, GreenTokenData};
 
 use crate::{
     ast::{
-        self, support, AstChildren, AstNode, AstToken, AttrsOwner, GenericParamsOwner, NameOwner,
-        SyntaxNode,
+        self, support, AstNode, AstToken, AttrsOwner, GenericParamsOwner, ModuleItemOwner,
+        NameOwner, SyntaxNode,
     },
     NodeOrToken, SmolStr, SyntaxElement, SyntaxToken, TokenText, T,
 };
@@ -50,14 +50,23 @@ fn text_of_first_token(node: &SyntaxNode) -> TokenText<'_> {
     }
 }
 
+impl ast::ModuleItemOwner for ast::StmtList {}
+
 impl ast::BlockExpr {
-    pub fn items(&self) -> AstChildren<ast::Item> {
-        support::children(self.syntax())
+    // FIXME: remove all these methods, they belong to ast::StmtList
+    pub fn items(&self) -> impl Iterator<Item = ast::Item> {
+        self.stmt_list().into_iter().flat_map(|it| it.items())
     }
 
     pub fn is_empty(&self) -> bool {
         self.statements().next().is_none() && self.tail_expr().is_none()
     }
+    pub fn statements(&self) -> impl Iterator<Item = ast::Stmt> {
+        self.stmt_list().into_iter().flat_map(|it| it.statements())
+    }
+    pub fn tail_expr(&self) -> Option<ast::Expr> {
+        self.stmt_list()?.tail_expr()
+    }
 }
 
 #[derive(Debug, PartialEq, Eq, Clone)]
diff --git a/crates/syntax/src/lib.rs b/crates/syntax/src/lib.rs
index 40460e18c36..00749d742fa 100644
--- a/crates/syntax/src/lib.rs
+++ b/crates/syntax/src/lib.rs
@@ -295,7 +295,8 @@ fn api_walkthrough() {
 
     // Let's get the `1 + 1` expression!
     let body: ast::BlockExpr = func.body().unwrap();
-    let expr: ast::Expr = body.tail_expr().unwrap();
+    let stmt_list: ast::StmtList = body.stmt_list().unwrap();
+    let expr: ast::Expr = stmt_list.tail_expr().unwrap();
 
     // Enums are used to group related ast nodes together, and can be used for
     // matching. However, because there are no public fields, it's possible to
@@ -331,8 +332,8 @@ fn api_walkthrough() {
     assert_eq!(text.to_string(), "1 + 1");
 
     // There's a bunch of traversal methods on `SyntaxNode`:
-    assert_eq!(expr_syntax.parent().as_ref(), Some(body.syntax()));
-    assert_eq!(body.syntax().first_child_or_token().map(|it| it.kind()), Some(T!['{']));
+    assert_eq!(expr_syntax.parent().as_ref(), Some(stmt_list.syntax()));
+    assert_eq!(stmt_list.syntax().first_child_or_token().map(|it| it.kind()), Some(T!['{']));
     assert_eq!(
         expr_syntax.next_sibling_or_token().map(|it| it.kind()),
         Some(SyntaxKind::WHITESPACE)
diff --git a/crates/syntax/src/ted.rs b/crates/syntax/src/ted.rs
index 2396408270e..4b0d8bf3915 100644
--- a/crates/syntax/src/ted.rs
+++ b/crates/syntax/src/ted.rs
@@ -162,8 +162,8 @@ fn ws_before(position: &Position, new: &SyntaxElement) -> Option<SyntaxToken> {
     }
 
     if prev.kind() == T!['{'] && ast::Stmt::can_cast(new.kind()) {
-        if let Some(block_expr) = prev.parent().and_then(ast::BlockExpr::cast) {
-            let mut indent = IndentLevel::from_element(&block_expr.syntax().clone().into());
+        if let Some(stmt_list) = prev.parent().and_then(ast::StmtList::cast) {
+            let mut indent = IndentLevel::from_element(&stmt_list.syntax().clone().into());
             indent.0 += 1;
             return Some(make::tokens::whitespace(&format!("\n{}", indent)));
         }
diff --git a/crates/syntax/src/tests/ast_src.rs b/crates/syntax/src/tests/ast_src.rs
index fe37d024518..efbb7ca0ccd 100644
--- a/crates/syntax/src/tests/ast_src.rs
+++ b/crates/syntax/src/tests/ast_src.rs
@@ -149,6 +149,7 @@ pub(crate) const KINDS_SRC: KindsSrc = KindsSrc {
         "BREAK_EXPR",
         "LABEL",
         "BLOCK_EXPR",
+        "STMT_LIST",
         "RETURN_EXPR",
         "YIELD_EXPR",
         "MATCH_EXPR",
@@ -158,7 +159,6 @@ pub(crate) const KINDS_SRC: KindsSrc = KindsSrc {
         "RECORD_EXPR",
         "RECORD_EXPR_FIELD_LIST",
         "RECORD_EXPR_FIELD",
-        "EFFECT_EXPR",
         "BOX_EXPR",
         // postfix
         "CALL_EXPR",
diff --git a/crates/syntax/src/validation/block.rs b/crates/syntax/src/validation/block.rs
index 40170014f9a..e03a77749d3 100644
--- a/crates/syntax/src/validation/block.rs
+++ b/crates/syntax/src/validation/block.rs
@@ -9,14 +9,16 @@ use crate::{
 pub(crate) fn validate_block_expr(block: ast::BlockExpr, errors: &mut Vec<SyntaxError>) {
     if let Some(parent) = block.syntax().parent() {
         match parent.kind() {
-            FN | EXPR_STMT | BLOCK_EXPR => return,
+            FN | EXPR_STMT | STMT_LIST => return,
             _ => {}
         }
     }
-    errors.extend(block.attrs().filter(|attr| attr.kind().is_inner()).map(|attr| {
-        SyntaxError::new(
-            "A block in this position cannot accept inner attributes",
-            attr.syntax().text_range(),
-        )
-    }))
+    if let Some(stmt_list) = block.stmt_list() {
+        errors.extend(stmt_list.attrs().filter(|attr| attr.kind().is_inner()).map(|attr| {
+            SyntaxError::new(
+                "A block in this position cannot accept inner attributes",
+                attr.syntax().text_range(),
+            )
+        }))
+    }
 }
diff --git a/crates/syntax/test_data/parser/err/0005_attribute_recover.rast b/crates/syntax/test_data/parser/err/0005_attribute_recover.rast
index 6202c8bfe76..44dcc58a926 100644
--- a/crates/syntax/test_data/parser/err/0005_attribute_recover.rast
+++ b/crates/syntax/test_data/parser/err/0005_attribute_recover.rast
@@ -29,9 +29,10 @@ SOURCE_FILE@0..54
       R_PAREN@26..27 ")"
     WHITESPACE@27..28 " "
     BLOCK_EXPR@28..31
-      L_CURLY@28..29 "{"
-      WHITESPACE@29..30 "\n"
-      R_CURLY@30..31 "}"
+      STMT_LIST@28..31
+        L_CURLY@28..29 "{"
+        WHITESPACE@29..30 "\n"
+        R_CURLY@30..31 "}"
   WHITESPACE@31..34 "\n\n\n"
   ATTR@34..53
     POUND@34..35 "#"
diff --git a/crates/syntax/test_data/parser/err/0007_stray_curly_in_file.rast b/crates/syntax/test_data/parser/err/0007_stray_curly_in_file.rast
index 560bfd75186..c57ea77364e 100644
--- a/crates/syntax/test_data/parser/err/0007_stray_curly_in_file.rast
+++ b/crates/syntax/test_data/parser/err/0007_stray_curly_in_file.rast
@@ -21,8 +21,9 @@ SOURCE_FILE@0..31
       L_PAREN@23..24 "("
       R_PAREN@24..25 ")"
     BLOCK_EXPR@25..27
-      L_CURLY@25..26 "{"
-      R_CURLY@26..27 "}"
+      STMT_LIST@25..27
+        L_CURLY@25..26 "{"
+        R_CURLY@26..27 "}"
   WHITESPACE@27..29 "\n\n"
   ERROR@29..30
     R_CURLY@29..30 "}"
diff --git a/crates/syntax/test_data/parser/err/0008_item_block_recovery.rast b/crates/syntax/test_data/parser/err/0008_item_block_recovery.rast
index 1e9637c26d5..99ec2faed00 100644
--- a/crates/syntax/test_data/parser/err/0008_item_block_recovery.rast
+++ b/crates/syntax/test_data/parser/err/0008_item_block_recovery.rast
@@ -9,9 +9,10 @@ SOURCE_FILE@0..95
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..12
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..11 "\n"
-      R_CURLY@11..12 "}"
+      STMT_LIST@9..12
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..11 "\n"
+        R_CURLY@11..12 "}"
   WHITESPACE@12..14 "\n\n"
   MACRO_CALL@14..19
     PATH@14..17
@@ -33,28 +34,30 @@ SOURCE_FILE@0..95
           TRUE_KW@29..33 "true"
       WHITESPACE@33..34 " "
       BLOCK_EXPR@34..51
-        L_CURLY@34..35 "{"
-        WHITESPACE@35..44 "\n        "
-        LITERAL@44..45
-          INT_NUMBER@44..45 "1"
-        WHITESPACE@45..50 "\n    "
-        R_CURLY@50..51 "}"
+        STMT_LIST@34..51
+          L_CURLY@34..35 "{"
+          WHITESPACE@35..44 "\n        "
+          LITERAL@44..45
+            INT_NUMBER@44..45 "1"
+          WHITESPACE@45..50 "\n    "
+          R_CURLY@50..51 "}"
       WHITESPACE@51..52 " "
       ELSE_KW@52..56 "else"
       WHITESPACE@56..57 " "
       BLOCK_EXPR@57..78
-        L_CURLY@57..58 "{"
-        WHITESPACE@58..67 "\n        "
-        BIN_EXPR@67..72
-          LITERAL@67..68
-            INT_NUMBER@67..68 "2"
-          WHITESPACE@68..69 " "
-          PLUS@69..70 "+"
-          WHITESPACE@70..71 " "
-          LITERAL@71..72
-            INT_NUMBER@71..72 "3"
-        WHITESPACE@72..77 "\n    "
-        R_CURLY@77..78 "}"
+        STMT_LIST@57..78
+          L_CURLY@57..58 "{"
+          WHITESPACE@58..67 "\n        "
+          BIN_EXPR@67..72
+            LITERAL@67..68
+              INT_NUMBER@67..68 "2"
+            WHITESPACE@68..69 " "
+            PLUS@69..70 "+"
+            WHITESPACE@70..71 " "
+            LITERAL@71..72
+              INT_NUMBER@71..72 "3"
+          WHITESPACE@72..77 "\n    "
+          R_CURLY@77..78 "}"
     WHITESPACE@78..79 "\n"
     R_CURLY@79..80 "}"
   WHITESPACE@80..82 "\n\n"
@@ -68,9 +71,10 @@ SOURCE_FILE@0..95
       R_PAREN@89..90 ")"
     WHITESPACE@90..91 " "
     BLOCK_EXPR@91..94
-      L_CURLY@91..92 "{"
-      WHITESPACE@92..93 "\n"
-      R_CURLY@93..94 "}"
+      STMT_LIST@91..94
+        L_CURLY@91..92 "{"
+        WHITESPACE@92..93 "\n"
+        R_CURLY@93..94 "}"
   WHITESPACE@94..95 "\n"
 error 17..17: expected BANG
 error 19..19: expected SEMICOLON
diff --git a/crates/syntax/test_data/parser/err/0010_unsafe_lambda_block.rast b/crates/syntax/test_data/parser/err/0010_unsafe_lambda_block.rast
index e0f1d0c2749..586acc73296 100644
--- a/crates/syntax/test_data/parser/err/0010_unsafe_lambda_block.rast
+++ b/crates/syntax/test_data/parser/err/0010_unsafe_lambda_block.rast
@@ -9,36 +9,37 @@ SOURCE_FILE@0..42
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..41
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      EXPR_STMT@16..24
-        CLOSURE_EXPR@16..24
-          PARAM_LIST@16..18
-            PIPE@16..17 "|"
-            PIPE@17..18 "|"
-          WHITESPACE@18..19 " "
-          RET_TYPE@19..24
-            THIN_ARROW@19..21 "->"
-            WHITESPACE@21..22 " "
-            TUPLE_TYPE@22..24
-              L_PAREN@22..23 "("
-              R_PAREN@23..24 ")"
-      WHITESPACE@24..25 " "
-      EXPR_STMT@25..39
-        EFFECT_EXPR@25..38
-          UNSAFE_KW@25..31 "unsafe"
-          WHITESPACE@31..32 " "
-          BLOCK_EXPR@32..38
-            L_CURLY@32..33 "{"
-            WHITESPACE@33..34 " "
-            TUPLE_EXPR@34..36
-              L_PAREN@34..35 "("
-              R_PAREN@35..36 ")"
-            WHITESPACE@36..37 " "
-            R_CURLY@37..38 "}"
-        SEMICOLON@38..39 ";"
-      WHITESPACE@39..40 "\n"
-      R_CURLY@40..41 "}"
+      STMT_LIST@10..41
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        EXPR_STMT@16..24
+          CLOSURE_EXPR@16..24
+            PARAM_LIST@16..18
+              PIPE@16..17 "|"
+              PIPE@17..18 "|"
+            WHITESPACE@18..19 " "
+            RET_TYPE@19..24
+              THIN_ARROW@19..21 "->"
+              WHITESPACE@21..22 " "
+              TUPLE_TYPE@22..24
+                L_PAREN@22..23 "("
+                R_PAREN@23..24 ")"
+        WHITESPACE@24..25 " "
+        EXPR_STMT@25..39
+          BLOCK_EXPR@25..38
+            UNSAFE_KW@25..31 "unsafe"
+            WHITESPACE@31..32 " "
+            STMT_LIST@32..38
+              L_CURLY@32..33 "{"
+              WHITESPACE@33..34 " "
+              TUPLE_EXPR@34..36
+                L_PAREN@34..35 "("
+                R_PAREN@35..36 ")"
+              WHITESPACE@36..37 " "
+              R_CURLY@37..38 "}"
+          SEMICOLON@38..39 ";"
+        WHITESPACE@39..40 "\n"
+        R_CURLY@40..41 "}"
   WHITESPACE@41..42 "\n"
 error 24..24: expected a block
 error 24..24: expected SEMICOLON
diff --git a/crates/syntax/test_data/parser/err/0014_where_no_bounds.rast b/crates/syntax/test_data/parser/err/0014_where_no_bounds.rast
index a1f39b22a52..9178cf3b7f1 100644
--- a/crates/syntax/test_data/parser/err/0014_where_no_bounds.rast
+++ b/crates/syntax/test_data/parser/err/0014_where_no_bounds.rast
@@ -25,7 +25,8 @@ SOURCE_FILE@0..23
                 IDENT@18..19 "T"
     WHITESPACE@19..20 " "
     BLOCK_EXPR@20..22
-      L_CURLY@20..21 "{"
-      R_CURLY@21..22 "}"
+      STMT_LIST@20..22
+        L_CURLY@20..21 "{"
+        R_CURLY@21..22 "}"
   WHITESPACE@22..23 "\n"
 error 19..19: expected colon
diff --git a/crates/syntax/test_data/parser/err/0016_missing_semi.rast b/crates/syntax/test_data/parser/err/0016_missing_semi.rast
index 66157c3dce9..30e76de8340 100644
--- a/crates/syntax/test_data/parser/err/0016_missing_semi.rast
+++ b/crates/syntax/test_data/parser/err/0016_missing_semi.rast
@@ -9,35 +9,36 @@ SOURCE_FILE@0..56
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..55
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..38
-        CALL_EXPR@15..38
-          PATH_EXPR@15..18
-            PATH@15..18
-              PATH_SEGMENT@15..18
-                NAME_REF@15..18
-                  IDENT@15..18 "foo"
-          ARG_LIST@18..38
-            L_PAREN@18..19 "("
-            WHITESPACE@19..28 "\n        "
-            LITERAL@28..29
-              INT_NUMBER@28..29 "1"
-            COMMA@29..30 ","
-            WHITESPACE@30..31 " "
-            LITERAL@31..32
-              INT_NUMBER@31..32 "2"
-            WHITESPACE@32..37 "\n    "
-            R_PAREN@37..38 ")"
-      WHITESPACE@38..43 "\n    "
-      EXPR_STMT@43..53
-        RETURN_EXPR@43..52
-          RETURN_KW@43..49 "return"
-          WHITESPACE@49..50 " "
-          LITERAL@50..52
-            INT_NUMBER@50..52 "92"
-        SEMICOLON@52..53 ";"
-      WHITESPACE@53..54 "\n"
-      R_CURLY@54..55 "}"
+      STMT_LIST@9..55
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..38
+          CALL_EXPR@15..38
+            PATH_EXPR@15..18
+              PATH@15..18
+                PATH_SEGMENT@15..18
+                  NAME_REF@15..18
+                    IDENT@15..18 "foo"
+            ARG_LIST@18..38
+              L_PAREN@18..19 "("
+              WHITESPACE@19..28 "\n        "
+              LITERAL@28..29
+                INT_NUMBER@28..29 "1"
+              COMMA@29..30 ","
+              WHITESPACE@30..31 " "
+              LITERAL@31..32
+                INT_NUMBER@31..32 "2"
+              WHITESPACE@32..37 "\n    "
+              R_PAREN@37..38 ")"
+        WHITESPACE@38..43 "\n    "
+        EXPR_STMT@43..53
+          RETURN_EXPR@43..52
+            RETURN_KW@43..49 "return"
+            WHITESPACE@49..50 " "
+            LITERAL@50..52
+              INT_NUMBER@50..52 "92"
+          SEMICOLON@52..53 ";"
+        WHITESPACE@53..54 "\n"
+        R_CURLY@54..55 "}"
   WHITESPACE@55..56 "\n"
 error 38..38: expected SEMICOLON
diff --git a/crates/syntax/test_data/parser/err/0017_incomplete_binexpr.rast b/crates/syntax/test_data/parser/err/0017_incomplete_binexpr.rast
index fe094f61c17..9d2c7c69482 100644
--- a/crates/syntax/test_data/parser/err/0017_incomplete_binexpr.rast
+++ b/crates/syntax/test_data/parser/err/0017_incomplete_binexpr.rast
@@ -20,27 +20,28 @@ SOURCE_FILE@0..47
       R_PAREN@15..16 ")"
     WHITESPACE@16..17 " "
     BLOCK_EXPR@17..46
-      L_CURLY@17..18 "{"
-      WHITESPACE@18..23 "\n    "
-      LET_STMT@23..36
-        LET_KW@23..26 "let"
-        WHITESPACE@26..27 " "
-        IDENT_PAT@27..30
-          NAME@27..30
-            IDENT@27..30 "bar"
-        WHITESPACE@30..31 " "
-        EQ@31..32 "="
-        WHITESPACE@32..33 " "
-        LITERAL@33..35
-          INT_NUMBER@33..35 "92"
-        SEMICOLON@35..36 ";"
-      WHITESPACE@36..41 "\n    "
-      BIN_EXPR@41..44
-        LITERAL@41..42
-          INT_NUMBER@41..42 "1"
-        WHITESPACE@42..43 " "
-        PLUS@43..44 "+"
-      WHITESPACE@44..45 "\n"
-      R_CURLY@45..46 "}"
+      STMT_LIST@17..46
+        L_CURLY@17..18 "{"
+        WHITESPACE@18..23 "\n    "
+        LET_STMT@23..36
+          LET_KW@23..26 "let"
+          WHITESPACE@26..27 " "
+          IDENT_PAT@27..30
+            NAME@27..30
+              IDENT@27..30 "bar"
+          WHITESPACE@30..31 " "
+          EQ@31..32 "="
+          WHITESPACE@32..33 " "
+          LITERAL@33..35
+            INT_NUMBER@33..35 "92"
+          SEMICOLON@35..36 ";"
+        WHITESPACE@36..41 "\n    "
+        BIN_EXPR@41..44
+          LITERAL@41..42
+            INT_NUMBER@41..42 "1"
+          WHITESPACE@42..43 " "
+          PLUS@43..44 "+"
+        WHITESPACE@44..45 "\n"
+        R_CURLY@45..46 "}"
   WHITESPACE@46..47 "\n"
 error 44..44: expected expression
diff --git a/crates/syntax/test_data/parser/err/0018_incomplete_fn.rast b/crates/syntax/test_data/parser/err/0018_incomplete_fn.rast
index 5b180ce3375..55ac5bc62ad 100644
--- a/crates/syntax/test_data/parser/err/0018_incomplete_fn.rast
+++ b/crates/syntax/test_data/parser/err/0018_incomplete_fn.rast
@@ -33,90 +33,91 @@ SOURCE_FILE@0..183
                   IDENT@39..46 "ScopeId"
         WHITESPACE@46..47 " "
         BLOCK_EXPR@47..161
-          L_CURLY@47..48 "{"
-          WHITESPACE@48..57 "\n        "
-          LET_STMT@57..85
-            LET_KW@57..60 "let"
-            WHITESPACE@60..61 " "
-            IDENT_PAT@61..64
-              NAME@61..64
-                IDENT@61..64 "res"
-            WHITESPACE@64..65 " "
-            EQ@65..66 "="
-            WHITESPACE@66..67 " "
-            METHOD_CALL_EXPR@67..84
-              FIELD_EXPR@67..78
-                PATH_EXPR@67..71
-                  PATH@67..71
-                    PATH_SEGMENT@67..71
-                      NAME_REF@67..71
-                        SELF_KW@67..71 "self"
-                DOT@71..72 "."
-                NAME_REF@72..78
-                  IDENT@72..78 "scopes"
-              DOT@78..79 "."
-              NAME_REF@79..82
-                IDENT@79..82 "len"
-              ARG_LIST@82..84
-                L_PAREN@82..83 "("
-                R_PAREN@83..84 ")"
-            SEMICOLON@84..85 ";"
-          WHITESPACE@85..94 "\n        "
-          METHOD_CALL_EXPR@94..155
-            FIELD_EXPR@94..105
-              PATH_EXPR@94..98
-                PATH@94..98
-                  PATH_SEGMENT@94..98
-                    NAME_REF@94..98
-                      SELF_KW@94..98 "self"
-              DOT@98..99 "."
-              NAME_REF@99..105
-                IDENT@99..105 "scopes"
-            DOT@105..106 "."
-            NAME_REF@106..110
-              IDENT@106..110 "push"
-            ARG_LIST@110..155
-              L_PAREN@110..111 "("
-              RECORD_EXPR@111..154
-                PATH@111..120
-                  PATH_SEGMENT@111..120
-                    NAME_REF@111..120
-                      IDENT@111..120 "ScopeData"
-                WHITESPACE@120..121 " "
-                RECORD_EXPR_FIELD_LIST@121..154
-                  L_CURLY@121..122 "{"
-                  WHITESPACE@122..123 " "
-                  RECORD_EXPR_FIELD@123..135
-                    NAME_REF@123..129
-                      IDENT@123..129 "parent"
-                    COLON@129..130 ":"
-                    WHITESPACE@130..131 " "
-                    PATH_EXPR@131..135
-                      PATH@131..135
-                        PATH_SEGMENT@131..135
-                          NAME_REF@131..135
-                            IDENT@131..135 "None"
-                  COMMA@135..136 ","
-                  WHITESPACE@136..137 " "
-                  RECORD_EXPR_FIELD@137..152
-                    NAME_REF@137..144
-                      IDENT@137..144 "entries"
-                    COLON@144..145 ":"
-                    WHITESPACE@145..146 " "
-                    MACRO_CALL@146..152
-                      PATH@146..149
-                        PATH_SEGMENT@146..149
-                          NAME_REF@146..149
-                            IDENT@146..149 "vec"
-                      BANG@149..150 "!"
-                      TOKEN_TREE@150..152
-                        L_BRACK@150..151 "["
-                        R_BRACK@151..152 "]"
-                  WHITESPACE@152..153 " "
-                  R_CURLY@153..154 "}"
-              R_PAREN@154..155 ")"
-          WHITESPACE@155..160 "\n    "
-          R_CURLY@160..161 "}"
+          STMT_LIST@47..161
+            L_CURLY@47..48 "{"
+            WHITESPACE@48..57 "\n        "
+            LET_STMT@57..85
+              LET_KW@57..60 "let"
+              WHITESPACE@60..61 " "
+              IDENT_PAT@61..64
+                NAME@61..64
+                  IDENT@61..64 "res"
+              WHITESPACE@64..65 " "
+              EQ@65..66 "="
+              WHITESPACE@66..67 " "
+              METHOD_CALL_EXPR@67..84
+                FIELD_EXPR@67..78
+                  PATH_EXPR@67..71
+                    PATH@67..71
+                      PATH_SEGMENT@67..71
+                        NAME_REF@67..71
+                          SELF_KW@67..71 "self"
+                  DOT@71..72 "."
+                  NAME_REF@72..78
+                    IDENT@72..78 "scopes"
+                DOT@78..79 "."
+                NAME_REF@79..82
+                  IDENT@79..82 "len"
+                ARG_LIST@82..84
+                  L_PAREN@82..83 "("
+                  R_PAREN@83..84 ")"
+              SEMICOLON@84..85 ";"
+            WHITESPACE@85..94 "\n        "
+            METHOD_CALL_EXPR@94..155
+              FIELD_EXPR@94..105
+                PATH_EXPR@94..98
+                  PATH@94..98
+                    PATH_SEGMENT@94..98
+                      NAME_REF@94..98
+                        SELF_KW@94..98 "self"
+                DOT@98..99 "."
+                NAME_REF@99..105
+                  IDENT@99..105 "scopes"
+              DOT@105..106 "."
+              NAME_REF@106..110
+                IDENT@106..110 "push"
+              ARG_LIST@110..155
+                L_PAREN@110..111 "("
+                RECORD_EXPR@111..154
+                  PATH@111..120
+                    PATH_SEGMENT@111..120
+                      NAME_REF@111..120
+                        IDENT@111..120 "ScopeData"
+                  WHITESPACE@120..121 " "
+                  RECORD_EXPR_FIELD_LIST@121..154
+                    L_CURLY@121..122 "{"
+                    WHITESPACE@122..123 " "
+                    RECORD_EXPR_FIELD@123..135
+                      NAME_REF@123..129
+                        IDENT@123..129 "parent"
+                      COLON@129..130 ":"
+                      WHITESPACE@130..131 " "
+                      PATH_EXPR@131..135
+                        PATH@131..135
+                          PATH_SEGMENT@131..135
+                            NAME_REF@131..135
+                              IDENT@131..135 "None"
+                    COMMA@135..136 ","
+                    WHITESPACE@136..137 " "
+                    RECORD_EXPR_FIELD@137..152
+                      NAME_REF@137..144
+                        IDENT@137..144 "entries"
+                      COLON@144..145 ":"
+                      WHITESPACE@145..146 " "
+                      MACRO_CALL@146..152
+                        PATH@146..149
+                          PATH_SEGMENT@146..149
+                            NAME_REF@146..149
+                              IDENT@146..149 "vec"
+                        BANG@149..150 "!"
+                        TOKEN_TREE@150..152
+                          L_BRACK@150..151 "["
+                          R_BRACK@151..152 "]"
+                    WHITESPACE@152..153 " "
+                    R_CURLY@153..154 "}"
+                R_PAREN@154..155 ")"
+            WHITESPACE@155..160 "\n    "
+            R_CURLY@160..161 "}"
       WHITESPACE@161..167 "\n\n    "
       FN@167..180
         FN_KW@167..169 "fn"
diff --git a/crates/syntax/test_data/parser/err/0019_let_recover.rast b/crates/syntax/test_data/parser/err/0019_let_recover.rast
index 72c05bd964a..919ce545b76 100644
--- a/crates/syntax/test_data/parser/err/0019_let_recover.rast
+++ b/crates/syntax/test_data/parser/err/0019_let_recover.rast
@@ -9,87 +9,91 @@ SOURCE_FILE@0..139
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..138
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      LET_STMT@15..24
-        LET_KW@15..18 "let"
-        WHITESPACE@18..19 " "
-        IDENT_PAT@19..22
-          NAME@19..22
-            IDENT@19..22 "foo"
-        WHITESPACE@22..23 " "
-        EQ@23..24 "="
-      WHITESPACE@24..29 "\n    "
-      LET_STMT@29..41
-        LET_KW@29..32 "let"
-        WHITESPACE@32..33 " "
-        IDENT_PAT@33..36
-          NAME@33..36
-            IDENT@33..36 "bar"
-        WHITESPACE@36..37 " "
-        EQ@37..38 "="
-        WHITESPACE@38..39 " "
-        LITERAL@39..40
-          INT_NUMBER@39..40 "1"
-        SEMICOLON@40..41 ";"
-      WHITESPACE@41..46 "\n    "
-      LET_STMT@46..49
-        LET_KW@46..49 "let"
-      WHITESPACE@49..54 "\n    "
-      LET_STMT@54..67
-        LET_KW@54..57 "let"
-        WHITESPACE@57..58 " "
-        IDENT_PAT@58..61
-          NAME@58..61
-            IDENT@58..61 "baz"
-        WHITESPACE@61..62 " "
-        EQ@62..63 "="
-        WHITESPACE@63..64 " "
-        LITERAL@64..66
-          INT_NUMBER@64..66 "92"
-        SEMICOLON@66..67 ";"
-      WHITESPACE@67..72 "\n    "
-      LET_STMT@72..75
-        LET_KW@72..75 "let"
-      WHITESPACE@75..80 "\n    "
-      EXPR_STMT@80..90
-        IF_EXPR@80..90
-          IF_KW@80..82 "if"
-          WHITESPACE@82..83 " "
-          CONDITION@83..87
-            LITERAL@83..87
-              TRUE_KW@83..87 "true"
-          WHITESPACE@87..88 " "
-          BLOCK_EXPR@88..90
-            L_CURLY@88..89 "{"
-            R_CURLY@89..90 "}"
-      WHITESPACE@90..95 "\n    "
-      LET_STMT@95..98
-        LET_KW@95..98 "let"
-      WHITESPACE@98..103 "\n    "
-      EXPR_STMT@103..116
-        WHILE_EXPR@103..116
-          WHILE_KW@103..108 "while"
-          WHITESPACE@108..109 " "
-          CONDITION@109..113
-            LITERAL@109..113
-              TRUE_KW@109..113 "true"
-          WHITESPACE@113..114 " "
-          BLOCK_EXPR@114..116
-            L_CURLY@114..115 "{"
-            R_CURLY@115..116 "}"
-      WHITESPACE@116..121 "\n    "
-      LET_STMT@121..124
-        LET_KW@121..124 "let"
-      WHITESPACE@124..129 "\n    "
-      LOOP_EXPR@129..136
-        LOOP_KW@129..133 "loop"
-        WHITESPACE@133..134 " "
-        BLOCK_EXPR@134..136
-          L_CURLY@134..135 "{"
-          R_CURLY@135..136 "}"
-      WHITESPACE@136..137 "\n"
-      R_CURLY@137..138 "}"
+      STMT_LIST@9..138
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        LET_STMT@15..24
+          LET_KW@15..18 "let"
+          WHITESPACE@18..19 " "
+          IDENT_PAT@19..22
+            NAME@19..22
+              IDENT@19..22 "foo"
+          WHITESPACE@22..23 " "
+          EQ@23..24 "="
+        WHITESPACE@24..29 "\n    "
+        LET_STMT@29..41
+          LET_KW@29..32 "let"
+          WHITESPACE@32..33 " "
+          IDENT_PAT@33..36
+            NAME@33..36
+              IDENT@33..36 "bar"
+          WHITESPACE@36..37 " "
+          EQ@37..38 "="
+          WHITESPACE@38..39 " "
+          LITERAL@39..40
+            INT_NUMBER@39..40 "1"
+          SEMICOLON@40..41 ";"
+        WHITESPACE@41..46 "\n    "
+        LET_STMT@46..49
+          LET_KW@46..49 "let"
+        WHITESPACE@49..54 "\n    "
+        LET_STMT@54..67
+          LET_KW@54..57 "let"
+          WHITESPACE@57..58 " "
+          IDENT_PAT@58..61
+            NAME@58..61
+              IDENT@58..61 "baz"
+          WHITESPACE@61..62 " "
+          EQ@62..63 "="
+          WHITESPACE@63..64 " "
+          LITERAL@64..66
+            INT_NUMBER@64..66 "92"
+          SEMICOLON@66..67 ";"
+        WHITESPACE@67..72 "\n    "
+        LET_STMT@72..75
+          LET_KW@72..75 "let"
+        WHITESPACE@75..80 "\n    "
+        EXPR_STMT@80..90
+          IF_EXPR@80..90
+            IF_KW@80..82 "if"
+            WHITESPACE@82..83 " "
+            CONDITION@83..87
+              LITERAL@83..87
+                TRUE_KW@83..87 "true"
+            WHITESPACE@87..88 " "
+            BLOCK_EXPR@88..90
+              STMT_LIST@88..90
+                L_CURLY@88..89 "{"
+                R_CURLY@89..90 "}"
+        WHITESPACE@90..95 "\n    "
+        LET_STMT@95..98
+          LET_KW@95..98 "let"
+        WHITESPACE@98..103 "\n    "
+        EXPR_STMT@103..116
+          WHILE_EXPR@103..116
+            WHILE_KW@103..108 "while"
+            WHITESPACE@108..109 " "
+            CONDITION@109..113
+              LITERAL@109..113
+                TRUE_KW@109..113 "true"
+            WHITESPACE@113..114 " "
+            BLOCK_EXPR@114..116
+              STMT_LIST@114..116
+                L_CURLY@114..115 "{"
+                R_CURLY@115..116 "}"
+        WHITESPACE@116..121 "\n    "
+        LET_STMT@121..124
+          LET_KW@121..124 "let"
+        WHITESPACE@124..129 "\n    "
+        LOOP_EXPR@129..136
+          LOOP_KW@129..133 "loop"
+          WHITESPACE@133..134 " "
+          BLOCK_EXPR@134..136
+            STMT_LIST@134..136
+              L_CURLY@134..135 "{"
+              R_CURLY@135..136 "}"
+        WHITESPACE@136..137 "\n"
+        R_CURLY@137..138 "}"
   WHITESPACE@138..139 "\n"
 error 24..24: expected expression
 error 24..24: expected SEMICOLON
diff --git a/crates/syntax/test_data/parser/err/0020_fn_recover.rast b/crates/syntax/test_data/parser/err/0020_fn_recover.rast
index 6f6feba5a83..9ed2b14745c 100644
--- a/crates/syntax/test_data/parser/err/0020_fn_recover.rast
+++ b/crates/syntax/test_data/parser/err/0020_fn_recover.rast
@@ -12,8 +12,9 @@ SOURCE_FILE@0..16
       R_PAREN@11..12 ")"
     WHITESPACE@12..13 " "
     BLOCK_EXPR@13..15
-      L_CURLY@13..14 "{"
-      R_CURLY@14..15 "}"
+      STMT_LIST@13..15
+        L_CURLY@13..14 "{"
+        R_CURLY@14..15 "}"
   WHITESPACE@15..16 "\n"
 error 2..2: expected a name
 error 2..2: expected function arguments
diff --git a/crates/syntax/test_data/parser/err/0021_incomplete_param.rast b/crates/syntax/test_data/parser/err/0021_incomplete_param.rast
index 901490fa2fe..e2b6a3fd7e4 100644
--- a/crates/syntax/test_data/parser/err/0021_incomplete_param.rast
+++ b/crates/syntax/test_data/parser/err/0021_incomplete_param.rast
@@ -26,8 +26,9 @@ SOURCE_FILE@0..22
       R_PAREN@16..17 ")"
     WHITESPACE@17..18 " "
     BLOCK_EXPR@18..21
-      L_CURLY@18..19 "{"
-      WHITESPACE@19..20 "\n"
-      R_CURLY@20..21 "}"
+      STMT_LIST@18..21
+        L_CURLY@18..19 "{"
+        WHITESPACE@19..20 "\n"
+        R_CURLY@20..21 "}"
   WHITESPACE@21..22 "\n"
 error 16..16: missing type for function parameter
diff --git a/crates/syntax/test_data/parser/err/0022_bad_exprs.rast b/crates/syntax/test_data/parser/err/0022_bad_exprs.rast
index 7e6d82bfb49..d4341371a71 100644
--- a/crates/syntax/test_data/parser/err/0022_bad_exprs.rast
+++ b/crates/syntax/test_data/parser/err/0022_bad_exprs.rast
@@ -9,35 +9,36 @@ SOURCE_FILE@0..112
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..33
-      L_CURLY@7..8 "{"
-      WHITESPACE@8..9 " "
-      EXPR_STMT@9..17
-        ARRAY_EXPR@9..17
-          L_BRACK@9..10 "["
-          LITERAL@10..11
-            INT_NUMBER@10..11 "1"
-          COMMA@11..12 ","
-          WHITESPACE@12..13 " "
-          LITERAL@13..14
-            INT_NUMBER@13..14 "2"
-          COMMA@14..15 ","
-          WHITESPACE@15..16 " "
-          ERROR@16..17
-            AT@16..17 "@"
-      ERROR@17..18
-        COMMA@17..18 ","
-      WHITESPACE@18..19 " "
-      STRUCT@19..26
-        STRUCT_KW@19..25 "struct"
-        ERROR@25..26
-          COMMA@25..26 ","
-      WHITESPACE@26..27 " "
-      LET_STMT@27..31
-        LET_KW@27..30 "let"
-        ERROR@30..31
-          R_BRACK@30..31 "]"
-      WHITESPACE@31..32 " "
-      R_CURLY@32..33 "}"
+      STMT_LIST@7..33
+        L_CURLY@7..8 "{"
+        WHITESPACE@8..9 " "
+        EXPR_STMT@9..17
+          ARRAY_EXPR@9..17
+            L_BRACK@9..10 "["
+            LITERAL@10..11
+              INT_NUMBER@10..11 "1"
+            COMMA@11..12 ","
+            WHITESPACE@12..13 " "
+            LITERAL@13..14
+              INT_NUMBER@13..14 "2"
+            COMMA@14..15 ","
+            WHITESPACE@15..16 " "
+            ERROR@16..17
+              AT@16..17 "@"
+        ERROR@17..18
+          COMMA@17..18 ","
+        WHITESPACE@18..19 " "
+        STRUCT@19..26
+          STRUCT_KW@19..25 "struct"
+          ERROR@25..26
+            COMMA@25..26 ","
+        WHITESPACE@26..27 " "
+        LET_STMT@27..31
+          LET_KW@27..30 "let"
+          ERROR@30..31
+            R_BRACK@30..31 "]"
+        WHITESPACE@31..32 " "
+        R_CURLY@32..33 "}"
   WHITESPACE@33..34 "\n"
   FN@34..68
     FN_KW@34..36 "fn"
@@ -49,41 +50,42 @@ SOURCE_FILE@0..112
       R_PAREN@39..40 ")"
     WHITESPACE@40..41 " "
     BLOCK_EXPR@41..68
-      L_CURLY@41..42 "{"
-      WHITESPACE@42..43 " "
-      EXPR_STMT@43..54
-        CALL_EXPR@43..54
-          PATH_EXPR@43..46
-            PATH@43..46
-              PATH_SEGMENT@43..46
-                NAME_REF@43..46
-                  IDENT@43..46 "foo"
-          ARG_LIST@46..54
-            L_PAREN@46..47 "("
-            LITERAL@47..48
-              INT_NUMBER@47..48 "1"
-            COMMA@48..49 ","
-            WHITESPACE@49..50 " "
-            LITERAL@50..51
-              INT_NUMBER@50..51 "2"
-            COMMA@51..52 ","
-            WHITESPACE@52..53 " "
-            ERROR@53..54
-              AT@53..54 "@"
-      ERROR@54..55
-        COMMA@54..55 ","
-      WHITESPACE@55..56 " "
-      IMPL@56..60
-        IMPL_KW@56..60 "impl"
-      ERROR@60..61
-        COMMA@60..61 ","
-      WHITESPACE@61..62 " "
-      LET_STMT@62..65
-        LET_KW@62..65 "let"
-      ERROR@65..66
-        R_PAREN@65..66 ")"
-      WHITESPACE@66..67 " "
-      R_CURLY@67..68 "}"
+      STMT_LIST@41..68
+        L_CURLY@41..42 "{"
+        WHITESPACE@42..43 " "
+        EXPR_STMT@43..54
+          CALL_EXPR@43..54
+            PATH_EXPR@43..46
+              PATH@43..46
+                PATH_SEGMENT@43..46
+                  NAME_REF@43..46
+                    IDENT@43..46 "foo"
+            ARG_LIST@46..54
+              L_PAREN@46..47 "("
+              LITERAL@47..48
+                INT_NUMBER@47..48 "1"
+              COMMA@48..49 ","
+              WHITESPACE@49..50 " "
+              LITERAL@50..51
+                INT_NUMBER@50..51 "2"
+              COMMA@51..52 ","
+              WHITESPACE@52..53 " "
+              ERROR@53..54
+                AT@53..54 "@"
+        ERROR@54..55
+          COMMA@54..55 ","
+        WHITESPACE@55..56 " "
+        IMPL@56..60
+          IMPL_KW@56..60 "impl"
+        ERROR@60..61
+          COMMA@60..61 ","
+        WHITESPACE@61..62 " "
+        LET_STMT@62..65
+          LET_KW@62..65 "let"
+        ERROR@65..66
+          R_PAREN@65..66 ")"
+        WHITESPACE@66..67 " "
+        R_CURLY@67..68 "}"
   WHITESPACE@68..69 "\n"
   FN@69..111
     FN_KW@69..71 "fn"
@@ -95,49 +97,50 @@ SOURCE_FILE@0..112
       R_PAREN@74..75 ")"
     WHITESPACE@75..76 " "
     BLOCK_EXPR@76..111
-      L_CURLY@76..77 "{"
-      WHITESPACE@77..78 " "
-      EXPR_STMT@78..93
-        METHOD_CALL_EXPR@78..93
-          PATH_EXPR@78..81
-            PATH@78..81
-              PATH_SEGMENT@78..81
-                NAME_REF@78..81
-                  IDENT@78..81 "foo"
-          DOT@81..82 "."
-          NAME_REF@82..85
-            IDENT@82..85 "bar"
-          ARG_LIST@85..93
-            L_PAREN@85..86 "("
-            LITERAL@86..87
-              INT_NUMBER@86..87 "1"
-            COMMA@87..88 ","
-            WHITESPACE@88..89 " "
-            LITERAL@89..90
-              INT_NUMBER@89..90 "2"
-            COMMA@90..91 ","
-            WHITESPACE@91..92 " "
-            ERROR@92..93
-              AT@92..93 "@"
-      ERROR@93..94
-        COMMA@93..94 ","
-      WHITESPACE@94..95 " "
-      ERROR@95..96
-        R_BRACK@95..96 "]"
-      ERROR@96..97
-        COMMA@96..97 ","
-      WHITESPACE@97..98 " "
-      TRAIT@98..104
-        TRAIT_KW@98..103 "trait"
-        ERROR@103..104
-          COMMA@103..104 ","
-      WHITESPACE@104..105 " "
-      LET_STMT@105..108
-        LET_KW@105..108 "let"
-      ERROR@108..109
-        R_PAREN@108..109 ")"
-      WHITESPACE@109..110 " "
-      R_CURLY@110..111 "}"
+      STMT_LIST@76..111
+        L_CURLY@76..77 "{"
+        WHITESPACE@77..78 " "
+        EXPR_STMT@78..93
+          METHOD_CALL_EXPR@78..93
+            PATH_EXPR@78..81
+              PATH@78..81
+                PATH_SEGMENT@78..81
+                  NAME_REF@78..81
+                    IDENT@78..81 "foo"
+            DOT@81..82 "."
+            NAME_REF@82..85
+              IDENT@82..85 "bar"
+            ARG_LIST@85..93
+              L_PAREN@85..86 "("
+              LITERAL@86..87
+                INT_NUMBER@86..87 "1"
+              COMMA@87..88 ","
+              WHITESPACE@88..89 " "
+              LITERAL@89..90
+                INT_NUMBER@89..90 "2"
+              COMMA@90..91 ","
+              WHITESPACE@91..92 " "
+              ERROR@92..93
+                AT@92..93 "@"
+        ERROR@93..94
+          COMMA@93..94 ","
+        WHITESPACE@94..95 " "
+        ERROR@95..96
+          R_BRACK@95..96 "]"
+        ERROR@96..97
+          COMMA@96..97 ","
+        WHITESPACE@97..98 " "
+        TRAIT@98..104
+          TRAIT_KW@98..103 "trait"
+          ERROR@103..104
+            COMMA@103..104 ","
+        WHITESPACE@104..105 " "
+        LET_STMT@105..108
+          LET_KW@105..108 "let"
+        ERROR@108..109
+          R_PAREN@108..109 ")"
+        WHITESPACE@109..110 " "
+        R_CURLY@110..111 "}"
   WHITESPACE@111..112 "\n"
 error 16..16: expected expression
 error 17..17: expected R_BRACK
diff --git a/crates/syntax/test_data/parser/err/0023_mismatched_paren.rast b/crates/syntax/test_data/parser/err/0023_mismatched_paren.rast
index 5ffefd74290..671566e3837 100644
--- a/crates/syntax/test_data/parser/err/0023_mismatched_paren.rast
+++ b/crates/syntax/test_data/parser/err/0023_mismatched_paren.rast
@@ -9,30 +9,31 @@ SOURCE_FILE@0..94
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..55
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      MACRO_CALL@16..49
-        PATH@16..19
-          PATH_SEGMENT@16..19
-            NAME_REF@16..19
-              IDENT@16..19 "foo"
-        BANG@19..20 "!"
-        WHITESPACE@20..21 " "
-        TOKEN_TREE@21..49
-          L_PAREN@21..22 "("
-          WHITESPACE@22..31 "\n        "
-          IDENT@31..34 "bar"
-          COMMA@34..35 ","
-          WHITESPACE@35..36 " "
-          STRING@36..41 "\"baz\""
-          COMMA@41..42 ","
-          WHITESPACE@42..43 " "
-          INT_NUMBER@43..44 "1"
-          COMMA@44..45 ","
-          WHITESPACE@45..46 " "
-          FLOAT_NUMBER@46..49 "2.0"
-      WHITESPACE@49..54 "\n    "
-      R_CURLY@54..55 "}"
+      STMT_LIST@10..55
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        MACRO_CALL@16..49
+          PATH@16..19
+            PATH_SEGMENT@16..19
+              NAME_REF@16..19
+                IDENT@16..19 "foo"
+          BANG@19..20 "!"
+          WHITESPACE@20..21 " "
+          TOKEN_TREE@21..49
+            L_PAREN@21..22 "("
+            WHITESPACE@22..31 "\n        "
+            IDENT@31..34 "bar"
+            COMMA@34..35 ","
+            WHITESPACE@35..36 " "
+            STRING@36..41 "\"baz\""
+            COMMA@41..42 ","
+            WHITESPACE@42..43 " "
+            INT_NUMBER@43..44 "1"
+            COMMA@44..45 ","
+            WHITESPACE@45..46 " "
+            FLOAT_NUMBER@46..49 "2.0"
+        WHITESPACE@49..54 "\n    "
+        R_CURLY@54..55 "}"
   WHITESPACE@55..56 " "
   COMMENT@56..91 "//~ ERROR incorrect c ..."
   WHITESPACE@91..92 "\n"
diff --git a/crates/syntax/test_data/parser/err/0024_many_type_parens.rast b/crates/syntax/test_data/parser/err/0024_many_type_parens.rast
index d29f12c1e51..39a317137f3 100644
--- a/crates/syntax/test_data/parser/err/0024_many_type_parens.rast
+++ b/crates/syntax/test_data/parser/err/0024_many_type_parens.rast
@@ -64,8 +64,9 @@ SOURCE_FILE@0..240
       R_PAREN@49..50 ")"
     WHITESPACE@50..51 " "
     BLOCK_EXPR@51..53
-      L_CURLY@51..52 "{"
-      R_CURLY@52..53 "}"
+      STMT_LIST@51..53
+        L_CURLY@51..52 "{"
+        R_CURLY@52..53 "}"
   WHITESPACE@53..55 "\n\n"
   FN@55..239
     FN_KW@55..57 "fn"
@@ -77,219 +78,220 @@ SOURCE_FILE@0..240
       R_PAREN@63..64 ")"
     WHITESPACE@64..65 " "
     BLOCK_EXPR@65..239
-      L_CURLY@65..66 "{"
-      WHITESPACE@66..71 "\n    "
-      LET_STMT@71..121
-        LET_KW@71..74 "let"
-        WHITESPACE@74..75 " "
-        WILDCARD_PAT@75..76
-          UNDERSCORE@75..76 "_"
-        COLON@76..77 ":"
-        WHITESPACE@77..78 " "
-        DYN_TRAIT_TYPE@78..121
-          TYPE_BOUND_LIST@78..121
-            TYPE_BOUND@78..88
-              PATH_TYPE@78..88
-                PATH@78..88
-                  PATH_SEGMENT@78..88
-                    NAME_REF@78..81
-                      IDENT@78..81 "Box"
-                    GENERIC_ARG_LIST@81..88
-                      L_ANGLE@81..82 "<"
-                      TYPE_ARG@82..88
-                        PAREN_TYPE@82..88
-                          L_PAREN@82..83 "("
-                          PATH_TYPE@83..87
-                            PATH@83..87
-                              PATH_SEGMENT@83..87
-                                NAME_REF@83..87
-                                  IDENT@83..87 "Copy"
-                          R_PAREN@87..88 ")"
-            WHITESPACE@88..89 " "
-            PLUS@89..90 "+"
-            WHITESPACE@90..91 " "
-            TYPE_BOUND@91..99
-              L_PAREN@91..92 "("
-              QUESTION@92..93 "?"
-              PATH_TYPE@93..98
-                PATH@93..98
-                  PATH_SEGMENT@93..98
-                    NAME_REF@93..98
-                      IDENT@93..98 "Sized"
-              R_PAREN@98..99 ")"
-            WHITESPACE@99..100 " "
-            PLUS@100..101 "+"
-            WHITESPACE@101..102 " "
-            TYPE_BOUND@102..121
-              L_PAREN@102..103 "("
-              FOR_TYPE@103..120
-                FOR_KW@103..106 "for"
-                GENERIC_PARAM_LIST@106..110
-                  L_ANGLE@106..107 "<"
-                  LIFETIME_PARAM@107..109
-                    LIFETIME@107..109
-                      LIFETIME_IDENT@107..109 "'a"
-                  R_ANGLE@109..110 ">"
-                WHITESPACE@110..111 " "
-                PATH_TYPE@111..120
-                  PATH@111..120
-                    PATH_SEGMENT@111..120
-                      NAME_REF@111..116
-                        IDENT@111..116 "Trait"
-                      GENERIC_ARG_LIST@116..120
-                        L_ANGLE@116..117 "<"
-                        LIFETIME_ARG@117..119
-                          LIFETIME@117..119
-                            LIFETIME_IDENT@117..119 "'a"
-                        R_ANGLE@119..120 ">"
-              R_PAREN@120..121 ")"
-      ERROR@121..122
-        R_ANGLE@121..122 ">"
-      SEMICOLON@122..123 ";"
-      WHITESPACE@123..128 "\n    "
-      LET_STMT@128..141
-        LET_KW@128..131 "let"
-        WHITESPACE@131..132 " "
-        WILDCARD_PAT@132..133
-          UNDERSCORE@132..133 "_"
-        COLON@133..134 ":"
-        WHITESPACE@134..135 " "
-        PATH_TYPE@135..141
-          PATH@135..141
-            PATH_SEGMENT@135..141
-              NAME_REF@135..138
-                IDENT@135..138 "Box"
-              GENERIC_ARG_LIST@138..141
-                L_ANGLE@138..139 "<"
-                TYPE_ARG@139..141
-                  PAREN_TYPE@139..141
-                    L_PAREN@139..140 "("
-                    ERROR@140..141
-                      QUESTION@140..141 "?"
-      EXPR_STMT@141..146
-        PATH_EXPR@141..146
-          PATH@141..146
-            PATH_SEGMENT@141..146
-              NAME_REF@141..146
-                IDENT@141..146 "Sized"
-      ERROR@146..147
-        R_PAREN@146..147 ")"
-      WHITESPACE@147..148 " "
-      ERROR@148..149
-        PLUS@148..149 "+"
-      WHITESPACE@149..150 " "
-      EXPR_STMT@150..180
-        TUPLE_EXPR@150..180
-          L_PAREN@150..151 "("
-          FOR_EXPR@151..180
-            FOR_KW@151..154 "for"
-            PATH_PAT@154..158
-              PATH@154..158
-                PATH_SEGMENT@154..158
-                  L_ANGLE@154..155 "<"
-                  ERROR@155..157
-                    LIFETIME_IDENT@155..157 "'a"
-                  R_ANGLE@157..158 ">"
-            WHITESPACE@158..159 " "
-            BIN_EXPR@159..180
-              BIN_EXPR@159..178
-                BIN_EXPR@159..169
-                  BIN_EXPR@159..167
-                    PATH_EXPR@159..164
-                      PATH@159..164
-                        PATH_SEGMENT@159..164
-                          NAME_REF@159..164
-                            IDENT@159..164 "Trait"
-                    L_ANGLE@164..165 "<"
-                    ERROR@165..167
-                      LIFETIME_IDENT@165..167 "'a"
-                  R_ANGLE@167..168 ">"
-                  ERROR@168..169
-                    R_PAREN@168..169 ")"
-                WHITESPACE@169..170 " "
-                PLUS@170..171 "+"
-                WHITESPACE@171..172 " "
-                PAREN_EXPR@172..178
-                  L_PAREN@172..173 "("
-                  PATH_EXPR@173..177
-                    PATH@173..177
-                      PATH_SEGMENT@173..177
-                        NAME_REF@173..177
-                          IDENT@173..177 "Copy"
-                  R_PAREN@177..178 ")"
-              R_ANGLE@178..179 ">"
-              ERROR@179..180
-                SEMICOLON@179..180 ";"
-      WHITESPACE@180..185 "\n    "
-      LET_STMT@185..235
-        LET_KW@185..188 "let"
-        WHITESPACE@188..189 " "
-        WILDCARD_PAT@189..190
-          UNDERSCORE@189..190 "_"
-        COLON@190..191 ":"
-        WHITESPACE@191..192 " "
-        DYN_TRAIT_TYPE@192..235
-          TYPE_BOUND_LIST@192..235
-            TYPE_BOUND@192..215
-              PATH_TYPE@192..215
-                PATH@192..215
-                  PATH_SEGMENT@192..215
-                    NAME_REF@192..195
-                      IDENT@192..195 "Box"
-                    GENERIC_ARG_LIST@195..215
-                      L_ANGLE@195..196 "<"
-                      TYPE_ARG@196..215
-                        PAREN_TYPE@196..215
-                          L_PAREN@196..197 "("
-                          FOR_TYPE@197..214
-                            FOR_KW@197..200 "for"
-                            GENERIC_PARAM_LIST@200..204
-                              L_ANGLE@200..201 "<"
-                              LIFETIME_PARAM@201..203
-                                LIFETIME@201..203
-                                  LIFETIME_IDENT@201..203 "'a"
-                              R_ANGLE@203..204 ">"
-                            WHITESPACE@204..205 " "
-                            PATH_TYPE@205..214
-                              PATH@205..214
-                                PATH_SEGMENT@205..214
-                                  NAME_REF@205..210
-                                    IDENT@205..210 "Trait"
-                                  GENERIC_ARG_LIST@210..214
-                                    L_ANGLE@210..211 "<"
-                                    LIFETIME_ARG@211..213
-                                      LIFETIME@211..213
-                                        LIFETIME_IDENT@211..213 "'a"
-                                    R_ANGLE@213..214 ">"
-                          R_PAREN@214..215 ")"
-            WHITESPACE@215..216 " "
-            PLUS@216..217 "+"
-            WHITESPACE@217..218 " "
-            TYPE_BOUND@218..224
-              L_PAREN@218..219 "("
-              PATH_TYPE@219..223
-                PATH@219..223
-                  PATH_SEGMENT@219..223
-                    NAME_REF@219..223
-                      IDENT@219..223 "Copy"
-              R_PAREN@223..224 ")"
-            WHITESPACE@224..225 " "
-            PLUS@225..226 "+"
-            WHITESPACE@226..227 " "
-            TYPE_BOUND@227..235
-              L_PAREN@227..228 "("
-              QUESTION@228..229 "?"
-              PATH_TYPE@229..234
-                PATH@229..234
-                  PATH_SEGMENT@229..234
-                    NAME_REF@229..234
-                      IDENT@229..234 "Sized"
-              R_PAREN@234..235 ")"
-      ERROR@235..236
-        R_ANGLE@235..236 ">"
-      SEMICOLON@236..237 ";"
-      WHITESPACE@237..238 "\n"
-      R_CURLY@238..239 "}"
+      STMT_LIST@65..239
+        L_CURLY@65..66 "{"
+        WHITESPACE@66..71 "\n    "
+        LET_STMT@71..121
+          LET_KW@71..74 "let"
+          WHITESPACE@74..75 " "
+          WILDCARD_PAT@75..76
+            UNDERSCORE@75..76 "_"
+          COLON@76..77 ":"
+          WHITESPACE@77..78 " "
+          DYN_TRAIT_TYPE@78..121
+            TYPE_BOUND_LIST@78..121
+              TYPE_BOUND@78..88
+                PATH_TYPE@78..88
+                  PATH@78..88
+                    PATH_SEGMENT@78..88
+                      NAME_REF@78..81
+                        IDENT@78..81 "Box"
+                      GENERIC_ARG_LIST@81..88
+                        L_ANGLE@81..82 "<"
+                        TYPE_ARG@82..88
+                          PAREN_TYPE@82..88
+                            L_PAREN@82..83 "("
+                            PATH_TYPE@83..87
+                              PATH@83..87
+                                PATH_SEGMENT@83..87
+                                  NAME_REF@83..87
+                                    IDENT@83..87 "Copy"
+                            R_PAREN@87..88 ")"
+              WHITESPACE@88..89 " "
+              PLUS@89..90 "+"
+              WHITESPACE@90..91 " "
+              TYPE_BOUND@91..99
+                L_PAREN@91..92 "("
+                QUESTION@92..93 "?"
+                PATH_TYPE@93..98
+                  PATH@93..98
+                    PATH_SEGMENT@93..98
+                      NAME_REF@93..98
+                        IDENT@93..98 "Sized"
+                R_PAREN@98..99 ")"
+              WHITESPACE@99..100 " "
+              PLUS@100..101 "+"
+              WHITESPACE@101..102 " "
+              TYPE_BOUND@102..121
+                L_PAREN@102..103 "("
+                FOR_TYPE@103..120
+                  FOR_KW@103..106 "for"
+                  GENERIC_PARAM_LIST@106..110
+                    L_ANGLE@106..107 "<"
+                    LIFETIME_PARAM@107..109
+                      LIFETIME@107..109
+                        LIFETIME_IDENT@107..109 "'a"
+                    R_ANGLE@109..110 ">"
+                  WHITESPACE@110..111 " "
+                  PATH_TYPE@111..120
+                    PATH@111..120
+                      PATH_SEGMENT@111..120
+                        NAME_REF@111..116
+                          IDENT@111..116 "Trait"
+                        GENERIC_ARG_LIST@116..120
+                          L_ANGLE@116..117 "<"
+                          LIFETIME_ARG@117..119
+                            LIFETIME@117..119
+                              LIFETIME_IDENT@117..119 "'a"
+                          R_ANGLE@119..120 ">"
+                R_PAREN@120..121 ")"
+        ERROR@121..122
+          R_ANGLE@121..122 ">"
+        SEMICOLON@122..123 ";"
+        WHITESPACE@123..128 "\n    "
+        LET_STMT@128..141
+          LET_KW@128..131 "let"
+          WHITESPACE@131..132 " "
+          WILDCARD_PAT@132..133
+            UNDERSCORE@132..133 "_"
+          COLON@133..134 ":"
+          WHITESPACE@134..135 " "
+          PATH_TYPE@135..141
+            PATH@135..141
+              PATH_SEGMENT@135..141
+                NAME_REF@135..138
+                  IDENT@135..138 "Box"
+                GENERIC_ARG_LIST@138..141
+                  L_ANGLE@138..139 "<"
+                  TYPE_ARG@139..141
+                    PAREN_TYPE@139..141
+                      L_PAREN@139..140 "("
+                      ERROR@140..141
+                        QUESTION@140..141 "?"
+        EXPR_STMT@141..146
+          PATH_EXPR@141..146
+            PATH@141..146
+              PATH_SEGMENT@141..146
+                NAME_REF@141..146
+                  IDENT@141..146 "Sized"
+        ERROR@146..147
+          R_PAREN@146..147 ")"
+        WHITESPACE@147..148 " "
+        ERROR@148..149
+          PLUS@148..149 "+"
+        WHITESPACE@149..150 " "
+        EXPR_STMT@150..180
+          TUPLE_EXPR@150..180
+            L_PAREN@150..151 "("
+            FOR_EXPR@151..180
+              FOR_KW@151..154 "for"
+              PATH_PAT@154..158
+                PATH@154..158
+                  PATH_SEGMENT@154..158
+                    L_ANGLE@154..155 "<"
+                    ERROR@155..157
+                      LIFETIME_IDENT@155..157 "'a"
+                    R_ANGLE@157..158 ">"
+              WHITESPACE@158..159 " "
+              BIN_EXPR@159..180
+                BIN_EXPR@159..178
+                  BIN_EXPR@159..169
+                    BIN_EXPR@159..167
+                      PATH_EXPR@159..164
+                        PATH@159..164
+                          PATH_SEGMENT@159..164
+                            NAME_REF@159..164
+                              IDENT@159..164 "Trait"
+                      L_ANGLE@164..165 "<"
+                      ERROR@165..167
+                        LIFETIME_IDENT@165..167 "'a"
+                    R_ANGLE@167..168 ">"
+                    ERROR@168..169
+                      R_PAREN@168..169 ")"
+                  WHITESPACE@169..170 " "
+                  PLUS@170..171 "+"
+                  WHITESPACE@171..172 " "
+                  PAREN_EXPR@172..178
+                    L_PAREN@172..173 "("
+                    PATH_EXPR@173..177
+                      PATH@173..177
+                        PATH_SEGMENT@173..177
+                          NAME_REF@173..177
+                            IDENT@173..177 "Copy"
+                    R_PAREN@177..178 ")"
+                R_ANGLE@178..179 ">"
+                ERROR@179..180
+                  SEMICOLON@179..180 ";"
+        WHITESPACE@180..185 "\n    "
+        LET_STMT@185..235
+          LET_KW@185..188 "let"
+          WHITESPACE@188..189 " "
+          WILDCARD_PAT@189..190
+            UNDERSCORE@189..190 "_"
+          COLON@190..191 ":"
+          WHITESPACE@191..192 " "
+          DYN_TRAIT_TYPE@192..235
+            TYPE_BOUND_LIST@192..235
+              TYPE_BOUND@192..215
+                PATH_TYPE@192..215
+                  PATH@192..215
+                    PATH_SEGMENT@192..215
+                      NAME_REF@192..195
+                        IDENT@192..195 "Box"
+                      GENERIC_ARG_LIST@195..215
+                        L_ANGLE@195..196 "<"
+                        TYPE_ARG@196..215
+                          PAREN_TYPE@196..215
+                            L_PAREN@196..197 "("
+                            FOR_TYPE@197..214
+                              FOR_KW@197..200 "for"
+                              GENERIC_PARAM_LIST@200..204
+                                L_ANGLE@200..201 "<"
+                                LIFETIME_PARAM@201..203
+                                  LIFETIME@201..203
+                                    LIFETIME_IDENT@201..203 "'a"
+                                R_ANGLE@203..204 ">"
+                              WHITESPACE@204..205 " "
+                              PATH_TYPE@205..214
+                                PATH@205..214
+                                  PATH_SEGMENT@205..214
+                                    NAME_REF@205..210
+                                      IDENT@205..210 "Trait"
+                                    GENERIC_ARG_LIST@210..214
+                                      L_ANGLE@210..211 "<"
+                                      LIFETIME_ARG@211..213
+                                        LIFETIME@211..213
+                                          LIFETIME_IDENT@211..213 "'a"
+                                      R_ANGLE@213..214 ">"
+                            R_PAREN@214..215 ")"
+              WHITESPACE@215..216 " "
+              PLUS@216..217 "+"
+              WHITESPACE@217..218 " "
+              TYPE_BOUND@218..224
+                L_PAREN@218..219 "("
+                PATH_TYPE@219..223
+                  PATH@219..223
+                    PATH_SEGMENT@219..223
+                      NAME_REF@219..223
+                        IDENT@219..223 "Copy"
+                R_PAREN@223..224 ")"
+              WHITESPACE@224..225 " "
+              PLUS@225..226 "+"
+              WHITESPACE@226..227 " "
+              TYPE_BOUND@227..235
+                L_PAREN@227..228 "("
+                QUESTION@228..229 "?"
+                PATH_TYPE@229..234
+                  PATH@229..234
+                    PATH_SEGMENT@229..234
+                      NAME_REF@229..234
+                        IDENT@229..234 "Sized"
+                R_PAREN@234..235 ")"
+        ERROR@235..236
+          R_ANGLE@235..236 ">"
+        SEMICOLON@236..237 ";"
+        WHITESPACE@237..238 "\n"
+        R_CURLY@238..239 "}"
   WHITESPACE@239..240 "\n"
 error 88..88: expected COMMA
 error 88..88: expected R_ANGLE
diff --git a/crates/syntax/test_data/parser/err/0025_nope.rast b/crates/syntax/test_data/parser/err/0025_nope.rast
index 83fc9fe776c..b48b4aed8dd 100644
--- a/crates/syntax/test_data/parser/err/0025_nope.rast
+++ b/crates/syntax/test_data/parser/err/0025_nope.rast
@@ -9,185 +9,187 @@ SOURCE_FILE@0..575
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..574
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      ENUM@16..152
-        ENUM_KW@16..20 "enum"
-        WHITESPACE@20..21 " "
-        NAME@21..25
-          IDENT@21..25 "Test"
-        WHITESPACE@25..26 " "
-        VARIANT_LIST@26..152
-          L_CURLY@26..27 "{"
-          WHITESPACE@27..36 "\n        "
-          VARIANT@36..40
-            NAME@36..40
-              IDENT@36..40 "Var1"
-          COMMA@40..41 ","
-          WHITESPACE@41..50 "\n        "
-          VARIANT@50..62
-            NAME@50..54
-              IDENT@50..54 "Var2"
-            TUPLE_FIELD_LIST@54..62
-              L_PAREN@54..55 "("
-              TUPLE_FIELD@55..61
-                PATH_TYPE@55..61
-                  PATH@55..61
-                    PATH_SEGMENT@55..61
-                      NAME_REF@55..61
-                        IDENT@55..61 "String"
-              R_PAREN@61..62 ")"
-          COMMA@62..63 ","
-          WHITESPACE@63..72 "\n        "
-          VARIANT@72..145
-            NAME@72..76
-              IDENT@72..76 "Var3"
-            WHITESPACE@76..77 " "
-            RECORD_FIELD_LIST@77..145
-              L_CURLY@77..78 "{"
-              WHITESPACE@78..91 "\n            "
-              RECORD_FIELD@91..95
-                NAME@91..94
-                  IDENT@91..94 "abc"
-                COLON@94..95 ":"
-              WHITESPACE@95..96 " "
-              ERROR@96..98
-                L_CURLY@96..97 "{"
-                R_CURLY@97..98 "}"
-              ERROR@98..99
-                COMMA@98..99 ","
-              WHITESPACE@99..100 " "
-              COMMENT@100..135 "//~ ERROR: expected t ..."
-              WHITESPACE@135..144 "\n        "
-              R_CURLY@144..145 "}"
-          COMMA@145..146 ","
-          WHITESPACE@146..151 "\n    "
-          R_CURLY@151..152 "}"
-      WHITESPACE@152..158 "\n\n    "
-      COMMENT@158..171 "// recover..."
-      WHITESPACE@171..176 "\n    "
-      LET_STMT@176..186
-        LET_KW@176..179 "let"
-        WHITESPACE@179..180 " "
-        IDENT_PAT@180..181
-          NAME@180..181
-            IDENT@180..181 "a"
-        WHITESPACE@181..182 " "
-        EQ@182..183 "="
-        WHITESPACE@183..184 " "
-        LITERAL@184..185
-          INT_NUMBER@184..185 "1"
-        SEMICOLON@185..186 ";"
-      WHITESPACE@186..191 "\n    "
-      ENUM@191..223
-        ENUM_KW@191..195 "enum"
-        WHITESPACE@195..196 " "
-        NAME@196..201
-          IDENT@196..201 "Test2"
-        WHITESPACE@201..202 " "
-        VARIANT_LIST@202..223
-          L_CURLY@202..203 "{"
-          WHITESPACE@203..212 "\n        "
-          VARIANT@212..216
-            NAME@212..216
-              IDENT@212..216 "Fine"
-          COMMA@216..217 ","
-          WHITESPACE@217..222 "\n    "
-          R_CURLY@222..223 "}"
-      WHITESPACE@223..229 "\n\n    "
-      ENUM@229..300
-        ENUM_KW@229..233 "enum"
-        WHITESPACE@233..234 " "
-        NAME@234..239
-          IDENT@234..239 "Test3"
-        WHITESPACE@239..240 " "
-        VARIANT_LIST@240..300
-          L_CURLY@240..241 "{"
-          WHITESPACE@241..250 "\n        "
-          VARIANT@250..293
-            NAME@250..259
-              IDENT@250..259 "StillFine"
-            WHITESPACE@259..260 " "
-            RECORD_FIELD_LIST@260..293
-              L_CURLY@260..261 "{"
-              WHITESPACE@261..274 "\n            "
-              RECORD_FIELD@274..282
-                NAME@274..277
-                  IDENT@274..277 "def"
-                COLON@277..278 ":"
-                WHITESPACE@278..279 " "
-                PATH_TYPE@279..282
-                  PATH@279..282
-                    PATH_SEGMENT@279..282
-                      NAME_REF@279..282
-                        IDENT@279..282 "i32"
-              COMMA@282..283 ","
-              WHITESPACE@283..292 "\n        "
-              R_CURLY@292..293 "}"
-          COMMA@293..294 ","
-          WHITESPACE@294..299 "\n    "
-          R_CURLY@299..300 "}"
-      WHITESPACE@300..306 "\n\n    "
-      EXPR_STMT@306..459
-        BLOCK_EXPR@306..459
-          L_CURLY@306..307 "{"
-          WHITESPACE@307..316 "\n        "
-          ENUM@316..453
-            COMMENT@316..329 "// fail again"
-            WHITESPACE@329..338 "\n        "
-            ENUM_KW@338..342 "enum"
-            WHITESPACE@342..343 " "
-            NAME@343..348
-              IDENT@343..348 "Test4"
-            WHITESPACE@348..349 " "
-            VARIANT_LIST@349..453
-              L_CURLY@349..350 "{"
-              WHITESPACE@350..363 "\n            "
-              VARIANT@363..372
-                NAME@363..367
-                  IDENT@363..367 "Nope"
-                TUPLE_FIELD_LIST@367..372
-                  L_PAREN@367..368 "("
-                  TUPLE_FIELD@368..371
-                    PATH_TYPE@368..371
-                      PATH@368..371
-                        PATH_SEGMENT@368..371
-                          NAME_REF@368..371
-                            IDENT@368..371 "i32"
-                  WHITESPACE@371..372 " "
-                  ERROR@372..372
-              ERROR@372..374
-                L_CURLY@372..373 "{"
-                R_CURLY@373..374 "}"
-              ERROR@374..375
-                R_PAREN@374..375 ")"
-              WHITESPACE@375..376 " "
-              COMMENT@376..396 "//~ ERROR: found `{`"
-              WHITESPACE@396..422 "\n                     ..."
-              COMMENT@422..443 "//~^ ERROR: found `{`"
-              WHITESPACE@443..452 "\n        "
-              R_CURLY@452..453 "}"
-          WHITESPACE@453..458 "\n    "
-          R_CURLY@458..459 "}"
-      WHITESPACE@459..464 "\n    "
-      COMMENT@464..486 "// still recover later"
-      WHITESPACE@486..491 "\n    "
-      LET_STMT@491..510
-        LET_KW@491..494 "let"
-        WHITESPACE@494..495 " "
-        IDENT_PAT@495..505
-          NAME@495..505
-            IDENT@495..505 "bad_syntax"
-        WHITESPACE@505..506 " "
-        EQ@506..507 "="
-        WHITESPACE@507..508 " "
-        ERROR@508..509
-          UNDERSCORE@508..509 "_"
-        SEMICOLON@509..510 ";"
-      WHITESPACE@510..511 " "
-      COMMENT@511..572 "//~ ERROR: expected e ..."
-      WHITESPACE@572..573 "\n"
-      R_CURLY@573..574 "}"
+      STMT_LIST@10..574
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        ENUM@16..152
+          ENUM_KW@16..20 "enum"
+          WHITESPACE@20..21 " "
+          NAME@21..25
+            IDENT@21..25 "Test"
+          WHITESPACE@25..26 " "
+          VARIANT_LIST@26..152
+            L_CURLY@26..27 "{"
+            WHITESPACE@27..36 "\n        "
+            VARIANT@36..40
+              NAME@36..40
+                IDENT@36..40 "Var1"
+            COMMA@40..41 ","
+            WHITESPACE@41..50 "\n        "
+            VARIANT@50..62
+              NAME@50..54
+                IDENT@50..54 "Var2"
+              TUPLE_FIELD_LIST@54..62
+                L_PAREN@54..55 "("
+                TUPLE_FIELD@55..61
+                  PATH_TYPE@55..61
+                    PATH@55..61
+                      PATH_SEGMENT@55..61
+                        NAME_REF@55..61
+                          IDENT@55..61 "String"
+                R_PAREN@61..62 ")"
+            COMMA@62..63 ","
+            WHITESPACE@63..72 "\n        "
+            VARIANT@72..145
+              NAME@72..76
+                IDENT@72..76 "Var3"
+              WHITESPACE@76..77 " "
+              RECORD_FIELD_LIST@77..145
+                L_CURLY@77..78 "{"
+                WHITESPACE@78..91 "\n            "
+                RECORD_FIELD@91..95
+                  NAME@91..94
+                    IDENT@91..94 "abc"
+                  COLON@94..95 ":"
+                WHITESPACE@95..96 " "
+                ERROR@96..98
+                  L_CURLY@96..97 "{"
+                  R_CURLY@97..98 "}"
+                ERROR@98..99
+                  COMMA@98..99 ","
+                WHITESPACE@99..100 " "
+                COMMENT@100..135 "//~ ERROR: expected t ..."
+                WHITESPACE@135..144 "\n        "
+                R_CURLY@144..145 "}"
+            COMMA@145..146 ","
+            WHITESPACE@146..151 "\n    "
+            R_CURLY@151..152 "}"
+        WHITESPACE@152..158 "\n\n    "
+        COMMENT@158..171 "// recover..."
+        WHITESPACE@171..176 "\n    "
+        LET_STMT@176..186
+          LET_KW@176..179 "let"
+          WHITESPACE@179..180 " "
+          IDENT_PAT@180..181
+            NAME@180..181
+              IDENT@180..181 "a"
+          WHITESPACE@181..182 " "
+          EQ@182..183 "="
+          WHITESPACE@183..184 " "
+          LITERAL@184..185
+            INT_NUMBER@184..185 "1"
+          SEMICOLON@185..186 ";"
+        WHITESPACE@186..191 "\n    "
+        ENUM@191..223
+          ENUM_KW@191..195 "enum"
+          WHITESPACE@195..196 " "
+          NAME@196..201
+            IDENT@196..201 "Test2"
+          WHITESPACE@201..202 " "
+          VARIANT_LIST@202..223
+            L_CURLY@202..203 "{"
+            WHITESPACE@203..212 "\n        "
+            VARIANT@212..216
+              NAME@212..216
+                IDENT@212..216 "Fine"
+            COMMA@216..217 ","
+            WHITESPACE@217..222 "\n    "
+            R_CURLY@222..223 "}"
+        WHITESPACE@223..229 "\n\n    "
+        ENUM@229..300
+          ENUM_KW@229..233 "enum"
+          WHITESPACE@233..234 " "
+          NAME@234..239
+            IDENT@234..239 "Test3"
+          WHITESPACE@239..240 " "
+          VARIANT_LIST@240..300
+            L_CURLY@240..241 "{"
+            WHITESPACE@241..250 "\n        "
+            VARIANT@250..293
+              NAME@250..259
+                IDENT@250..259 "StillFine"
+              WHITESPACE@259..260 " "
+              RECORD_FIELD_LIST@260..293
+                L_CURLY@260..261 "{"
+                WHITESPACE@261..274 "\n            "
+                RECORD_FIELD@274..282
+                  NAME@274..277
+                    IDENT@274..277 "def"
+                  COLON@277..278 ":"
+                  WHITESPACE@278..279 " "
+                  PATH_TYPE@279..282
+                    PATH@279..282
+                      PATH_SEGMENT@279..282
+                        NAME_REF@279..282
+                          IDENT@279..282 "i32"
+                COMMA@282..283 ","
+                WHITESPACE@283..292 "\n        "
+                R_CURLY@292..293 "}"
+            COMMA@293..294 ","
+            WHITESPACE@294..299 "\n    "
+            R_CURLY@299..300 "}"
+        WHITESPACE@300..306 "\n\n    "
+        EXPR_STMT@306..459
+          BLOCK_EXPR@306..459
+            STMT_LIST@306..459
+              L_CURLY@306..307 "{"
+              WHITESPACE@307..316 "\n        "
+              ENUM@316..453
+                COMMENT@316..329 "// fail again"
+                WHITESPACE@329..338 "\n        "
+                ENUM_KW@338..342 "enum"
+                WHITESPACE@342..343 " "
+                NAME@343..348
+                  IDENT@343..348 "Test4"
+                WHITESPACE@348..349 " "
+                VARIANT_LIST@349..453
+                  L_CURLY@349..350 "{"
+                  WHITESPACE@350..363 "\n            "
+                  VARIANT@363..372
+                    NAME@363..367
+                      IDENT@363..367 "Nope"
+                    TUPLE_FIELD_LIST@367..372
+                      L_PAREN@367..368 "("
+                      TUPLE_FIELD@368..371
+                        PATH_TYPE@368..371
+                          PATH@368..371
+                            PATH_SEGMENT@368..371
+                              NAME_REF@368..371
+                                IDENT@368..371 "i32"
+                      WHITESPACE@371..372 " "
+                      ERROR@372..372
+                  ERROR@372..374
+                    L_CURLY@372..373 "{"
+                    R_CURLY@373..374 "}"
+                  ERROR@374..375
+                    R_PAREN@374..375 ")"
+                  WHITESPACE@375..376 " "
+                  COMMENT@376..396 "//~ ERROR: found `{`"
+                  WHITESPACE@396..422 "\n                     ..."
+                  COMMENT@422..443 "//~^ ERROR: found `{`"
+                  WHITESPACE@443..452 "\n        "
+                  R_CURLY@452..453 "}"
+              WHITESPACE@453..458 "\n    "
+              R_CURLY@458..459 "}"
+        WHITESPACE@459..464 "\n    "
+        COMMENT@464..486 "// still recover later"
+        WHITESPACE@486..491 "\n    "
+        LET_STMT@491..510
+          LET_KW@491..494 "let"
+          WHITESPACE@494..495 " "
+          IDENT_PAT@495..505
+            NAME@495..505
+              IDENT@495..505 "bad_syntax"
+          WHITESPACE@505..506 " "
+          EQ@506..507 "="
+          WHITESPACE@507..508 " "
+          ERROR@508..509
+            UNDERSCORE@508..509 "_"
+          SEMICOLON@509..510 ";"
+        WHITESPACE@510..511 " "
+        COMMENT@511..572 "//~ ERROR: expected e ..."
+        WHITESPACE@572..573 "\n"
+        R_CURLY@573..574 "}"
   WHITESPACE@574..575 "\n"
 error 95..95: expected type
 error 95..95: expected COMMA
diff --git a/crates/syntax/test_data/parser/err/0027_incomplere_where_for.rast b/crates/syntax/test_data/parser/err/0027_incomplere_where_for.rast
index b021783fc74..ec585a42356 100644
--- a/crates/syntax/test_data/parser/err/0027_incomplere_where_for.rast
+++ b/crates/syntax/test_data/parser/err/0027_incomplere_where_for.rast
@@ -21,8 +21,9 @@ SOURCE_FILE@0..30
           R_ANGLE@25..26 ">"
     WHITESPACE@26..27 "\n"
     BLOCK_EXPR@27..29
-      L_CURLY@27..28 "{"
-      R_CURLY@28..29 "}"
+      STMT_LIST@27..29
+        L_CURLY@27..28 "{"
+        R_CURLY@28..29 "}"
   WHITESPACE@29..30 "\n"
 error 26..26: expected type
 error 26..26: expected colon
diff --git a/crates/syntax/test_data/parser/err/0029_field_completion.rast b/crates/syntax/test_data/parser/err/0029_field_completion.rast
index c6402cdd847..183cf32030b 100644
--- a/crates/syntax/test_data/parser/err/0029_field_completion.rast
+++ b/crates/syntax/test_data/parser/err/0029_field_completion.rast
@@ -20,16 +20,17 @@ SOURCE_FILE@0..24
       R_PAREN@11..12 ")"
     WHITESPACE@12..13 " "
     BLOCK_EXPR@13..23
-      L_CURLY@13..14 "{"
-      WHITESPACE@14..19 "\n    "
-      FIELD_EXPR@19..21
-        PATH_EXPR@19..20
-          PATH@19..20
-            PATH_SEGMENT@19..20
-              NAME_REF@19..20
-                IDENT@19..20 "a"
-        DOT@20..21 "."
-      WHITESPACE@21..22 "\n"
-      R_CURLY@22..23 "}"
+      STMT_LIST@13..23
+        L_CURLY@13..14 "{"
+        WHITESPACE@14..19 "\n    "
+        FIELD_EXPR@19..21
+          PATH_EXPR@19..20
+            PATH@19..20
+              PATH_SEGMENT@19..20
+                NAME_REF@19..20
+                  IDENT@19..20 "a"
+          DOT@20..21 "."
+        WHITESPACE@21..22 "\n"
+        R_CURLY@22..23 "}"
   WHITESPACE@23..24 "\n"
 error 21..21: expected field name or number
diff --git a/crates/syntax/test_data/parser/err/0031_block_inner_attrs.rast b/crates/syntax/test_data/parser/err/0031_block_inner_attrs.rast
index 8462797486f..d4963979c86 100644
--- a/crates/syntax/test_data/parser/err/0031_block_inner_attrs.rast
+++ b/crates/syntax/test_data/parser/err/0031_block_inner_attrs.rast
@@ -9,115 +9,119 @@ SOURCE_FILE@0..350
       R_PAREN@9..10 ")"
     WHITESPACE@10..11 " "
     BLOCK_EXPR@11..349
-      L_CURLY@11..12 "{"
-      WHITESPACE@12..17 "\n    "
-      LET_STMT@17..129
-        LET_KW@17..20 "let"
-        WHITESPACE@20..21 " "
-        IDENT_PAT@21..26
-          NAME@21..26
-            IDENT@21..26 "inner"
-        WHITESPACE@26..27 " "
-        EQ@27..28 "="
-        WHITESPACE@28..29 " "
-        BLOCK_EXPR@29..128
-          L_CURLY@29..30 "{"
-          WHITESPACE@30..39 "\n        "
-          ATTR@39..83
-            POUND@39..40 "#"
-            BANG@40..41 "!"
-            L_BRACK@41..42 "["
-            META@42..82
-              PATH@42..45
-                PATH_SEGMENT@42..45
-                  NAME_REF@42..45
-                    IDENT@42..45 "doc"
-              TOKEN_TREE@45..82
-                L_PAREN@45..46 "("
-                STRING@46..81 "\"Inner attributes not ..."
-                R_PAREN@81..82 ")"
-            R_BRACK@82..83 "]"
-          WHITESPACE@83..92 "\n        "
-          COMMENT@92..122 "//! Nor are ModuleDoc ..."
-          WHITESPACE@122..127 "\n    "
-          R_CURLY@127..128 "}"
-        SEMICOLON@128..129 ";"
-      WHITESPACE@129..134 "\n    "
-      EXPR_STMT@134..257
-        IF_EXPR@134..257
-          IF_KW@134..136 "if"
-          WHITESPACE@136..137 " "
-          CONDITION@137..141
-            LITERAL@137..141
-              TRUE_KW@137..141 "true"
-          WHITESPACE@141..142 " "
-          BLOCK_EXPR@142..257
-            L_CURLY@142..143 "{"
-            WHITESPACE@143..152 "\n        "
-            ATTR@152..171
-              POUND@152..153 "#"
-              BANG@153..154 "!"
-              L_BRACK@154..155 "["
-              META@155..170
-                PATH@155..158
-                  PATH_SEGMENT@155..158
-                    NAME_REF@155..158
-                      IDENT@155..158 "doc"
-                TOKEN_TREE@158..170
-                  L_PAREN@158..159 "("
-                  STRING@159..169 "\"Nor here\""
-                  R_PAREN@169..170 ")"
-              R_BRACK@170..171 "]"
-            WHITESPACE@171..180 "\n        "
-            ATTR@180..212
-              POUND@180..181 "#"
-              BANG@181..182 "!"
-              L_BRACK@182..183 "["
-              META@183..211
-                PATH@183..186
-                  PATH_SEGMENT@183..186
-                    NAME_REF@183..186
-                      IDENT@183..186 "doc"
-                TOKEN_TREE@186..211
-                  L_PAREN@186..187 "("
-                  STRING@187..210 "\"We error on each attr\""
-                  R_PAREN@210..211 ")"
-              R_BRACK@211..212 "]"
-            WHITESPACE@212..221 "\n        "
-            COMMENT@221..251 "//! Nor are ModuleDoc ..."
-            WHITESPACE@251..256 "\n    "
-            R_CURLY@256..257 "}"
-      WHITESPACE@257..262 "\n    "
-      WHILE_EXPR@262..347
-        WHILE_KW@262..267 "while"
-        WHITESPACE@267..268 " "
-        CONDITION@268..272
-          LITERAL@268..272
-            TRUE_KW@268..272 "true"
-        WHITESPACE@272..273 " "
-        BLOCK_EXPR@273..347
-          L_CURLY@273..274 "{"
-          WHITESPACE@274..283 "\n        "
-          ATTR@283..302
-            POUND@283..284 "#"
-            BANG@284..285 "!"
-            L_BRACK@285..286 "["
-            META@286..301
-              PATH@286..289
-                PATH_SEGMENT@286..289
-                  NAME_REF@286..289
-                    IDENT@286..289 "doc"
-              TOKEN_TREE@289..301
-                L_PAREN@289..290 "("
-                STRING@290..300 "\"Nor here\""
-                R_PAREN@300..301 ")"
-            R_BRACK@301..302 "]"
-          WHITESPACE@302..311 "\n        "
-          COMMENT@311..341 "//! Nor are ModuleDoc ..."
-          WHITESPACE@341..346 "\n    "
-          R_CURLY@346..347 "}"
-      WHITESPACE@347..348 "\n"
-      R_CURLY@348..349 "}"
+      STMT_LIST@11..349
+        L_CURLY@11..12 "{"
+        WHITESPACE@12..17 "\n    "
+        LET_STMT@17..129
+          LET_KW@17..20 "let"
+          WHITESPACE@20..21 " "
+          IDENT_PAT@21..26
+            NAME@21..26
+              IDENT@21..26 "inner"
+          WHITESPACE@26..27 " "
+          EQ@27..28 "="
+          WHITESPACE@28..29 " "
+          BLOCK_EXPR@29..128
+            STMT_LIST@29..128
+              L_CURLY@29..30 "{"
+              WHITESPACE@30..39 "\n        "
+              ATTR@39..83
+                POUND@39..40 "#"
+                BANG@40..41 "!"
+                L_BRACK@41..42 "["
+                META@42..82
+                  PATH@42..45
+                    PATH_SEGMENT@42..45
+                      NAME_REF@42..45
+                        IDENT@42..45 "doc"
+                  TOKEN_TREE@45..82
+                    L_PAREN@45..46 "("
+                    STRING@46..81 "\"Inner attributes not ..."
+                    R_PAREN@81..82 ")"
+                R_BRACK@82..83 "]"
+              WHITESPACE@83..92 "\n        "
+              COMMENT@92..122 "//! Nor are ModuleDoc ..."
+              WHITESPACE@122..127 "\n    "
+              R_CURLY@127..128 "}"
+          SEMICOLON@128..129 ";"
+        WHITESPACE@129..134 "\n    "
+        EXPR_STMT@134..257
+          IF_EXPR@134..257
+            IF_KW@134..136 "if"
+            WHITESPACE@136..137 " "
+            CONDITION@137..141
+              LITERAL@137..141
+                TRUE_KW@137..141 "true"
+            WHITESPACE@141..142 " "
+            BLOCK_EXPR@142..257
+              STMT_LIST@142..257
+                L_CURLY@142..143 "{"
+                WHITESPACE@143..152 "\n        "
+                ATTR@152..171
+                  POUND@152..153 "#"
+                  BANG@153..154 "!"
+                  L_BRACK@154..155 "["
+                  META@155..170
+                    PATH@155..158
+                      PATH_SEGMENT@155..158
+                        NAME_REF@155..158
+                          IDENT@155..158 "doc"
+                    TOKEN_TREE@158..170
+                      L_PAREN@158..159 "("
+                      STRING@159..169 "\"Nor here\""
+                      R_PAREN@169..170 ")"
+                  R_BRACK@170..171 "]"
+                WHITESPACE@171..180 "\n        "
+                ATTR@180..212
+                  POUND@180..181 "#"
+                  BANG@181..182 "!"
+                  L_BRACK@182..183 "["
+                  META@183..211
+                    PATH@183..186
+                      PATH_SEGMENT@183..186
+                        NAME_REF@183..186
+                          IDENT@183..186 "doc"
+                    TOKEN_TREE@186..211
+                      L_PAREN@186..187 "("
+                      STRING@187..210 "\"We error on each attr\""
+                      R_PAREN@210..211 ")"
+                  R_BRACK@211..212 "]"
+                WHITESPACE@212..221 "\n        "
+                COMMENT@221..251 "//! Nor are ModuleDoc ..."
+                WHITESPACE@251..256 "\n    "
+                R_CURLY@256..257 "}"
+        WHITESPACE@257..262 "\n    "
+        WHILE_EXPR@262..347
+          WHILE_KW@262..267 "while"
+          WHITESPACE@267..268 " "
+          CONDITION@268..272
+            LITERAL@268..272
+              TRUE_KW@268..272 "true"
+          WHITESPACE@272..273 " "
+          BLOCK_EXPR@273..347
+            STMT_LIST@273..347
+              L_CURLY@273..274 "{"
+              WHITESPACE@274..283 "\n        "
+              ATTR@283..302
+                POUND@283..284 "#"
+                BANG@284..285 "!"
+                L_BRACK@285..286 "["
+                META@286..301
+                  PATH@286..289
+                    PATH_SEGMENT@286..289
+                      NAME_REF@286..289
+                        IDENT@286..289 "doc"
+                  TOKEN_TREE@289..301
+                    L_PAREN@289..290 "("
+                    STRING@290..300 "\"Nor here\""
+                    R_PAREN@300..301 ")"
+                R_BRACK@301..302 "]"
+              WHITESPACE@302..311 "\n        "
+              COMMENT@311..341 "//! Nor are ModuleDoc ..."
+              WHITESPACE@341..346 "\n    "
+              R_CURLY@346..347 "}"
+        WHITESPACE@347..348 "\n"
+        R_CURLY@348..349 "}"
   WHITESPACE@349..350 "\n"
 error 39..83: A block in this position cannot accept inner attributes
 error 152..171: A block in this position cannot accept inner attributes
diff --git a/crates/syntax/test_data/parser/err/0032_match_arms_inner_attrs.rast b/crates/syntax/test_data/parser/err/0032_match_arms_inner_attrs.rast
index 9524f5ccc78..2438b104bf4 100644
--- a/crates/syntax/test_data/parser/err/0032_match_arms_inner_attrs.rast
+++ b/crates/syntax/test_data/parser/err/0032_match_arms_inner_attrs.rast
@@ -9,187 +9,188 @@ SOURCE_FILE@0..293
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..292
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..101
-        MATCH_EXPR@15..101
-          MATCH_KW@15..20 "match"
-          WHITESPACE@20..21 " "
-          TUPLE_EXPR@21..23
-            L_PAREN@21..22 "("
-            R_PAREN@22..23 ")"
-          WHITESPACE@23..24 " "
-          MATCH_ARM_LIST@24..101
-            L_CURLY@24..25 "{"
-            WHITESPACE@25..34 "\n        "
-            MATCH_ARM@34..42
-              WILDCARD_PAT@34..35
-                UNDERSCORE@34..35 "_"
-              WHITESPACE@35..36 " "
-              FAT_ARROW@36..38 "=>"
-              WHITESPACE@38..39 " "
-              TUPLE_EXPR@39..41
-                L_PAREN@39..40 "("
-                R_PAREN@40..41 ")"
-              COMMA@41..42 ","
-            WHITESPACE@42..51 "\n        "
-            MATCH_ARM@51..78
-              ATTR@51..52
-                POUND@51..52 "#"
-              ERROR@52..53
-                BANG@52..53 "!"
-              ARRAY_EXPR@53..78
-                L_BRACK@53..54 "["
-                CALL_EXPR@54..77
-                  PATH_EXPR@54..57
-                    PATH@54..57
-                      PATH_SEGMENT@54..57
-                        NAME_REF@54..57
-                          IDENT@54..57 "doc"
-                  ARG_LIST@57..77
-                    L_PAREN@57..58 "("
-                    LITERAL@58..76
-                      STRING@58..76 "\"Not allowed here\""
-                    R_PAREN@76..77 ")"
-                R_BRACK@77..78 "]"
-            WHITESPACE@78..87 "\n        "
-            MATCH_ARM@87..95
-              WILDCARD_PAT@87..88
-                UNDERSCORE@87..88 "_"
-              WHITESPACE@88..89 " "
-              FAT_ARROW@89..91 "=>"
-              WHITESPACE@91..92 " "
-              TUPLE_EXPR@92..94
-                L_PAREN@92..93 "("
-                R_PAREN@93..94 ")"
-              COMMA@94..95 ","
-            WHITESPACE@95..100 "\n    "
-            R_CURLY@100..101 "}"
-      WHITESPACE@101..107 "\n\n    "
-      EXPR_STMT@107..185
-        MATCH_EXPR@107..185
-          MATCH_KW@107..112 "match"
-          WHITESPACE@112..113 " "
-          TUPLE_EXPR@113..115
-            L_PAREN@113..114 "("
-            R_PAREN@114..115 ")"
-          WHITESPACE@115..116 " "
-          MATCH_ARM_LIST@116..185
-            L_CURLY@116..117 "{"
-            WHITESPACE@117..126 "\n        "
-            MATCH_ARM@126..134
-              WILDCARD_PAT@126..127
-                UNDERSCORE@126..127 "_"
-              WHITESPACE@127..128 " "
-              FAT_ARROW@128..130 "=>"
-              WHITESPACE@130..131 " "
-              TUPLE_EXPR@131..133
-                L_PAREN@131..132 "("
-                R_PAREN@132..133 ")"
-              COMMA@133..134 ","
-            WHITESPACE@134..143 "\n        "
-            MATCH_ARM@143..151
-              WILDCARD_PAT@143..144
-                UNDERSCORE@143..144 "_"
-              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..160 "\n        "
-            MATCH_ARM@160..179
-              ATTR@160..161
-                POUND@160..161 "#"
-              ERROR@161..162
-                BANG@161..162 "!"
-              ARRAY_EXPR@162..179
-                L_BRACK@162..163 "["
-                CALL_EXPR@163..178
-                  PATH_EXPR@163..166
-                    PATH@163..166
-                      PATH_SEGMENT@163..166
-                        NAME_REF@163..166
-                          IDENT@163..166 "doc"
-                  ARG_LIST@166..178
-                    L_PAREN@166..167 "("
-                    LITERAL@167..177
-                      STRING@167..177 "\"Nor here\""
-                    R_PAREN@177..178 ")"
-                R_BRACK@178..179 "]"
-            WHITESPACE@179..184 "\n    "
-            R_CURLY@184..185 "}"
-      WHITESPACE@185..191 "\n\n    "
-      MATCH_EXPR@191..290
-        MATCH_KW@191..196 "match"
-        WHITESPACE@196..197 " "
-        TUPLE_EXPR@197..199
-          L_PAREN@197..198 "("
-          R_PAREN@198..199 ")"
-        WHITESPACE@199..200 " "
-        MATCH_ARM_LIST@200..290
-          L_CURLY@200..201 "{"
-          WHITESPACE@201..210 "\n        "
-          MATCH_ARM@210..250
-            ATTR@210..222
-              POUND@210..211 "#"
-              L_BRACK@211..212 "["
-              META@212..221
-                PATH@212..215
-                  PATH_SEGMENT@212..215
-                    NAME_REF@212..215
-                      IDENT@212..215 "cfg"
-                TOKEN_TREE@215..221
-                  L_PAREN@215..216 "("
-                  IDENT@216..220 "test"
-                  R_PAREN@220..221 ")"
-              R_BRACK@221..222 "]"
-            WHITESPACE@222..231 "\n        "
-            ATTR@231..232
-              POUND@231..232 "#"
-            ERROR@232..233
-              BANG@232..233 "!"
-            ARRAY_EXPR@233..250
-              L_BRACK@233..234 "["
-              CALL_EXPR@234..249
-                PATH_EXPR@234..237
-                  PATH@234..237
-                    PATH_SEGMENT@234..237
-                      NAME_REF@234..237
-                        IDENT@234..237 "doc"
-                ARG_LIST@237..249
-                  L_PAREN@237..238 "("
-                  LITERAL@238..248
-                    STRING@238..248 "\"Nor here\""
-                  R_PAREN@248..249 ")"
-              R_BRACK@249..250 "]"
-          WHITESPACE@250..259 "\n        "
-          MATCH_ARM@259..267
-            WILDCARD_PAT@259..260
-              UNDERSCORE@259..260 "_"
-            WHITESPACE@260..261 " "
-            FAT_ARROW@261..263 "=>"
-            WHITESPACE@263..264 " "
-            TUPLE_EXPR@264..266
-              L_PAREN@264..265 "("
-              R_PAREN@265..266 ")"
-            COMMA@266..267 ","
-          WHITESPACE@267..276 "\n        "
-          MATCH_ARM@276..284
-            WILDCARD_PAT@276..277
-              UNDERSCORE@276..277 "_"
-            WHITESPACE@277..278 " "
-            FAT_ARROW@278..280 "=>"
-            WHITESPACE@280..281 " "
-            TUPLE_EXPR@281..283
-              L_PAREN@281..282 "("
-              R_PAREN@282..283 ")"
-            COMMA@283..284 ","
-          WHITESPACE@284..289 "\n    "
-          R_CURLY@289..290 "}"
-      WHITESPACE@290..291 "\n"
-      R_CURLY@291..292 "}"
+      STMT_LIST@9..292
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..101
+          MATCH_EXPR@15..101
+            MATCH_KW@15..20 "match"
+            WHITESPACE@20..21 " "
+            TUPLE_EXPR@21..23
+              L_PAREN@21..22 "("
+              R_PAREN@22..23 ")"
+            WHITESPACE@23..24 " "
+            MATCH_ARM_LIST@24..101
+              L_CURLY@24..25 "{"
+              WHITESPACE@25..34 "\n        "
+              MATCH_ARM@34..42
+                WILDCARD_PAT@34..35
+                  UNDERSCORE@34..35 "_"
+                WHITESPACE@35..36 " "
+                FAT_ARROW@36..38 "=>"
+                WHITESPACE@38..39 " "
+                TUPLE_EXPR@39..41
+                  L_PAREN@39..40 "("
+                  R_PAREN@40..41 ")"
+                COMMA@41..42 ","
+              WHITESPACE@42..51 "\n        "
+              MATCH_ARM@51..78
+                ATTR@51..52
+                  POUND@51..52 "#"
+                ERROR@52..53
+                  BANG@52..53 "!"
+                ARRAY_EXPR@53..78
+                  L_BRACK@53..54 "["
+                  CALL_EXPR@54..77
+                    PATH_EXPR@54..57
+                      PATH@54..57
+                        PATH_SEGMENT@54..57
+                          NAME_REF@54..57
+                            IDENT@54..57 "doc"
+                    ARG_LIST@57..77
+                      L_PAREN@57..58 "("
+                      LITERAL@58..76
+                        STRING@58..76 "\"Not allowed here\""
+                      R_PAREN@76..77 ")"
+                  R_BRACK@77..78 "]"
+              WHITESPACE@78..87 "\n        "
+              MATCH_ARM@87..95
+                WILDCARD_PAT@87..88
+                  UNDERSCORE@87..88 "_"
+                WHITESPACE@88..89 " "
+                FAT_ARROW@89..91 "=>"
+                WHITESPACE@91..92 " "
+                TUPLE_EXPR@92..94
+                  L_PAREN@92..93 "("
+                  R_PAREN@93..94 ")"
+                COMMA@94..95 ","
+              WHITESPACE@95..100 "\n    "
+              R_CURLY@100..101 "}"
+        WHITESPACE@101..107 "\n\n    "
+        EXPR_STMT@107..185
+          MATCH_EXPR@107..185
+            MATCH_KW@107..112 "match"
+            WHITESPACE@112..113 " "
+            TUPLE_EXPR@113..115
+              L_PAREN@113..114 "("
+              R_PAREN@114..115 ")"
+            WHITESPACE@115..116 " "
+            MATCH_ARM_LIST@116..185
+              L_CURLY@116..117 "{"
+              WHITESPACE@117..126 "\n        "
+              MATCH_ARM@126..134
+                WILDCARD_PAT@126..127
+                  UNDERSCORE@126..127 "_"
+                WHITESPACE@127..128 " "
+                FAT_ARROW@128..130 "=>"
+                WHITESPACE@130..131 " "
+                TUPLE_EXPR@131..133
+                  L_PAREN@131..132 "("
+                  R_PAREN@132..133 ")"
+                COMMA@133..134 ","
+              WHITESPACE@134..143 "\n        "
+              MATCH_ARM@143..151
+                WILDCARD_PAT@143..144
+                  UNDERSCORE@143..144 "_"
+                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..160 "\n        "
+              MATCH_ARM@160..179
+                ATTR@160..161
+                  POUND@160..161 "#"
+                ERROR@161..162
+                  BANG@161..162 "!"
+                ARRAY_EXPR@162..179
+                  L_BRACK@162..163 "["
+                  CALL_EXPR@163..178
+                    PATH_EXPR@163..166
+                      PATH@163..166
+                        PATH_SEGMENT@163..166
+                          NAME_REF@163..166
+                            IDENT@163..166 "doc"
+                    ARG_LIST@166..178
+                      L_PAREN@166..167 "("
+                      LITERAL@167..177
+                        STRING@167..177 "\"Nor here\""
+                      R_PAREN@177..178 ")"
+                  R_BRACK@178..179 "]"
+              WHITESPACE@179..184 "\n    "
+              R_CURLY@184..185 "}"
+        WHITESPACE@185..191 "\n\n    "
+        MATCH_EXPR@191..290
+          MATCH_KW@191..196 "match"
+          WHITESPACE@196..197 " "
+          TUPLE_EXPR@197..199
+            L_PAREN@197..198 "("
+            R_PAREN@198..199 ")"
+          WHITESPACE@199..200 " "
+          MATCH_ARM_LIST@200..290
+            L_CURLY@200..201 "{"
+            WHITESPACE@201..210 "\n        "
+            MATCH_ARM@210..250
+              ATTR@210..222
+                POUND@210..211 "#"
+                L_BRACK@211..212 "["
+                META@212..221
+                  PATH@212..215
+                    PATH_SEGMENT@212..215
+                      NAME_REF@212..215
+                        IDENT@212..215 "cfg"
+                  TOKEN_TREE@215..221
+                    L_PAREN@215..216 "("
+                    IDENT@216..220 "test"
+                    R_PAREN@220..221 ")"
+                R_BRACK@221..222 "]"
+              WHITESPACE@222..231 "\n        "
+              ATTR@231..232
+                POUND@231..232 "#"
+              ERROR@232..233
+                BANG@232..233 "!"
+              ARRAY_EXPR@233..250
+                L_BRACK@233..234 "["
+                CALL_EXPR@234..249
+                  PATH_EXPR@234..237
+                    PATH@234..237
+                      PATH_SEGMENT@234..237
+                        NAME_REF@234..237
+                          IDENT@234..237 "doc"
+                  ARG_LIST@237..249
+                    L_PAREN@237..238 "("
+                    LITERAL@238..248
+                      STRING@238..248 "\"Nor here\""
+                    R_PAREN@248..249 ")"
+                R_BRACK@249..250 "]"
+            WHITESPACE@250..259 "\n        "
+            MATCH_ARM@259..267
+              WILDCARD_PAT@259..260
+                UNDERSCORE@259..260 "_"
+              WHITESPACE@260..261 " "
+              FAT_ARROW@261..263 "=>"
+              WHITESPACE@263..264 " "
+              TUPLE_EXPR@264..266
+                L_PAREN@264..265 "("
+                R_PAREN@265..266 ")"
+              COMMA@266..267 ","
+            WHITESPACE@267..276 "\n        "
+            MATCH_ARM@276..284
+              WILDCARD_PAT@276..277
+                UNDERSCORE@276..277 "_"
+              WHITESPACE@277..278 " "
+              FAT_ARROW@278..280 "=>"
+              WHITESPACE@280..281 " "
+              TUPLE_EXPR@281..283
+                L_PAREN@281..282 "("
+                R_PAREN@282..283 ")"
+              COMMA@283..284 ","
+            WHITESPACE@284..289 "\n    "
+            R_CURLY@289..290 "}"
+        WHITESPACE@290..291 "\n"
+        R_CURLY@291..292 "}"
   WHITESPACE@292..293 "\n"
 error 52..52: expected `[`
 error 52..52: expected pattern
diff --git a/crates/syntax/test_data/parser/err/0033_match_arms_outer_attrs.rast b/crates/syntax/test_data/parser/err/0033_match_arms_outer_attrs.rast
index b6095d5030f..66fc2ccbd20 100644
--- a/crates/syntax/test_data/parser/err/0033_match_arms_outer_attrs.rast
+++ b/crates/syntax/test_data/parser/err/0033_match_arms_outer_attrs.rast
@@ -9,58 +9,59 @@ SOURCE_FILE@0..89
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..88
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      MATCH_EXPR@15..86
-        MATCH_KW@15..20 "match"
-        WHITESPACE@20..21 " "
-        TUPLE_EXPR@21..23
-          L_PAREN@21..22 "("
-          R_PAREN@22..23 ")"
-        WHITESPACE@23..24 " "
-        MATCH_ARM_LIST@24..86
-          L_CURLY@24..25 "{"
-          WHITESPACE@25..34 "\n        "
-          MATCH_ARM@34..42
-            WILDCARD_PAT@34..35
-              UNDERSCORE@34..35 "_"
-            WHITESPACE@35..36 " "
-            FAT_ARROW@36..38 "=>"
-            WHITESPACE@38..39 " "
-            TUPLE_EXPR@39..41
-              L_PAREN@39..40 "("
-              R_PAREN@40..41 ")"
-            COMMA@41..42 ","
-          WHITESPACE@42..51 "\n        "
-          MATCH_ARM@51..59
-            WILDCARD_PAT@51..52
-              UNDERSCORE@51..52 "_"
-            WHITESPACE@52..53 " "
-            FAT_ARROW@53..55 "=>"
-            WHITESPACE@55..56 " "
-            TUPLE_EXPR@56..58
-              L_PAREN@56..57 "("
-              R_PAREN@57..58 ")"
-            COMMA@58..59 ","
-          WHITESPACE@59..68 "\n        "
-          MATCH_ARM@68..80
-            ATTR@68..80
-              POUND@68..69 "#"
-              L_BRACK@69..70 "["
-              META@70..79
-                PATH@70..73
-                  PATH_SEGMENT@70..73
-                    NAME_REF@70..73
-                      IDENT@70..73 "cfg"
-                TOKEN_TREE@73..79
-                  L_PAREN@73..74 "("
-                  IDENT@74..78 "test"
-                  R_PAREN@78..79 ")"
-              R_BRACK@79..80 "]"
-          WHITESPACE@80..85 "\n    "
-          R_CURLY@85..86 "}"
-      WHITESPACE@86..87 "\n"
-      R_CURLY@87..88 "}"
+      STMT_LIST@9..88
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        MATCH_EXPR@15..86
+          MATCH_KW@15..20 "match"
+          WHITESPACE@20..21 " "
+          TUPLE_EXPR@21..23
+            L_PAREN@21..22 "("
+            R_PAREN@22..23 ")"
+          WHITESPACE@23..24 " "
+          MATCH_ARM_LIST@24..86
+            L_CURLY@24..25 "{"
+            WHITESPACE@25..34 "\n        "
+            MATCH_ARM@34..42
+              WILDCARD_PAT@34..35
+                UNDERSCORE@34..35 "_"
+              WHITESPACE@35..36 " "
+              FAT_ARROW@36..38 "=>"
+              WHITESPACE@38..39 " "
+              TUPLE_EXPR@39..41
+                L_PAREN@39..40 "("
+                R_PAREN@40..41 ")"
+              COMMA@41..42 ","
+            WHITESPACE@42..51 "\n        "
+            MATCH_ARM@51..59
+              WILDCARD_PAT@51..52
+                UNDERSCORE@51..52 "_"
+              WHITESPACE@52..53 " "
+              FAT_ARROW@53..55 "=>"
+              WHITESPACE@55..56 " "
+              TUPLE_EXPR@56..58
+                L_PAREN@56..57 "("
+                R_PAREN@57..58 ")"
+              COMMA@58..59 ","
+            WHITESPACE@59..68 "\n        "
+            MATCH_ARM@68..80
+              ATTR@68..80
+                POUND@68..69 "#"
+                L_BRACK@69..70 "["
+                META@70..79
+                  PATH@70..73
+                    PATH_SEGMENT@70..73
+                      NAME_REF@70..73
+                        IDENT@70..73 "cfg"
+                  TOKEN_TREE@73..79
+                    L_PAREN@73..74 "("
+                    IDENT@74..78 "test"
+                    R_PAREN@78..79 ")"
+                R_BRACK@79..80 "]"
+            WHITESPACE@80..85 "\n    "
+            R_CURLY@85..86 "}"
+        WHITESPACE@86..87 "\n"
+        R_CURLY@87..88 "}"
   WHITESPACE@88..89 "\n"
 error 80..80: expected pattern
 error 80..80: expected FAT_ARROW
diff --git a/crates/syntax/test_data/parser/err/0034_bad_box_pattern.rast b/crates/syntax/test_data/parser/err/0034_bad_box_pattern.rast
index d9d49bfb5ff..583e62c77a3 100644
--- a/crates/syntax/test_data/parser/err/0034_bad_box_pattern.rast
+++ b/crates/syntax/test_data/parser/err/0034_bad_box_pattern.rast
@@ -9,83 +9,84 @@ SOURCE_FILE@0..91
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..89
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      LET_STMT@16..27
-        LET_KW@16..19 "let"
-        WHITESPACE@19..20 " "
-        IDENT_PAT@20..27
-          REF_KW@20..23 "ref"
-          WHITESPACE@23..24 " "
-          ERROR@24..27
-            BOX_KW@24..27 "box"
-      WHITESPACE@27..28 " "
-      EXPR_STMT@28..35
-        BIN_EXPR@28..34
-          PATH_EXPR@28..29
-            PATH@28..29
-              PATH_SEGMENT@28..29
-                NAME_REF@28..29
-                  IDENT@28..29 "i"
-          WHITESPACE@29..30 " "
-          EQ@30..31 "="
-          WHITESPACE@31..32 " "
-          TUPLE_EXPR@32..34
-            L_PAREN@32..33 "("
-            R_PAREN@33..34 ")"
-        SEMICOLON@34..35 ";"
-      WHITESPACE@35..40 "\n    "
-      LET_STMT@40..51
-        LET_KW@40..43 "let"
-        WHITESPACE@43..44 " "
-        IDENT_PAT@44..51
-          MUT_KW@44..47 "mut"
-          WHITESPACE@47..48 " "
-          ERROR@48..51
-            BOX_KW@48..51 "box"
-      WHITESPACE@51..52 " "
-      EXPR_STMT@52..59
-        BIN_EXPR@52..58
-          PATH_EXPR@52..53
-            PATH@52..53
-              PATH_SEGMENT@52..53
-                NAME_REF@52..53
-                  IDENT@52..53 "i"
-          WHITESPACE@53..54 " "
-          EQ@54..55 "="
-          WHITESPACE@55..56 " "
-          TUPLE_EXPR@56..58
-            L_PAREN@56..57 "("
-            R_PAREN@57..58 ")"
-        SEMICOLON@58..59 ";"
-      WHITESPACE@59..64 "\n    "
-      LET_STMT@64..79
-        LET_KW@64..67 "let"
-        WHITESPACE@67..68 " "
-        IDENT_PAT@68..79
-          REF_KW@68..71 "ref"
-          WHITESPACE@71..72 " "
-          MUT_KW@72..75 "mut"
-          WHITESPACE@75..76 " "
-          ERROR@76..79
-            BOX_KW@76..79 "box"
-      WHITESPACE@79..80 " "
-      EXPR_STMT@80..87
-        BIN_EXPR@80..86
-          PATH_EXPR@80..81
-            PATH@80..81
-              PATH_SEGMENT@80..81
-                NAME_REF@80..81
-                  IDENT@80..81 "i"
-          WHITESPACE@81..82 " "
-          EQ@82..83 "="
-          WHITESPACE@83..84 " "
-          TUPLE_EXPR@84..86
-            L_PAREN@84..85 "("
-            R_PAREN@85..86 ")"
-        SEMICOLON@86..87 ";"
-      WHITESPACE@87..88 "\n"
-      R_CURLY@88..89 "}"
+      STMT_LIST@10..89
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        LET_STMT@16..27
+          LET_KW@16..19 "let"
+          WHITESPACE@19..20 " "
+          IDENT_PAT@20..27
+            REF_KW@20..23 "ref"
+            WHITESPACE@23..24 " "
+            ERROR@24..27
+              BOX_KW@24..27 "box"
+        WHITESPACE@27..28 " "
+        EXPR_STMT@28..35
+          BIN_EXPR@28..34
+            PATH_EXPR@28..29
+              PATH@28..29
+                PATH_SEGMENT@28..29
+                  NAME_REF@28..29
+                    IDENT@28..29 "i"
+            WHITESPACE@29..30 " "
+            EQ@30..31 "="
+            WHITESPACE@31..32 " "
+            TUPLE_EXPR@32..34
+              L_PAREN@32..33 "("
+              R_PAREN@33..34 ")"
+          SEMICOLON@34..35 ";"
+        WHITESPACE@35..40 "\n    "
+        LET_STMT@40..51
+          LET_KW@40..43 "let"
+          WHITESPACE@43..44 " "
+          IDENT_PAT@44..51
+            MUT_KW@44..47 "mut"
+            WHITESPACE@47..48 " "
+            ERROR@48..51
+              BOX_KW@48..51 "box"
+        WHITESPACE@51..52 " "
+        EXPR_STMT@52..59
+          BIN_EXPR@52..58
+            PATH_EXPR@52..53
+              PATH@52..53
+                PATH_SEGMENT@52..53
+                  NAME_REF@52..53
+                    IDENT@52..53 "i"
+            WHITESPACE@53..54 " "
+            EQ@54..55 "="
+            WHITESPACE@55..56 " "
+            TUPLE_EXPR@56..58
+              L_PAREN@56..57 "("
+              R_PAREN@57..58 ")"
+          SEMICOLON@58..59 ";"
+        WHITESPACE@59..64 "\n    "
+        LET_STMT@64..79
+          LET_KW@64..67 "let"
+          WHITESPACE@67..68 " "
+          IDENT_PAT@68..79
+            REF_KW@68..71 "ref"
+            WHITESPACE@71..72 " "
+            MUT_KW@72..75 "mut"
+            WHITESPACE@75..76 " "
+            ERROR@76..79
+              BOX_KW@76..79 "box"
+        WHITESPACE@79..80 " "
+        EXPR_STMT@80..87
+          BIN_EXPR@80..86
+            PATH_EXPR@80..81
+              PATH@80..81
+                PATH_SEGMENT@80..81
+                  NAME_REF@80..81
+                    IDENT@80..81 "i"
+            WHITESPACE@81..82 " "
+            EQ@82..83 "="
+            WHITESPACE@83..84 " "
+            TUPLE_EXPR@84..86
+              L_PAREN@84..85 "("
+              R_PAREN@85..86 ")"
+          SEMICOLON@86..87 ";"
+        WHITESPACE@87..88 "\n"
+        R_CURLY@88..89 "}"
   WHITESPACE@89..91 "\n\n"
 error 24..24: expected a name
 error 27..27: expected SEMICOLON
diff --git a/crates/syntax/test_data/parser/err/0035_use_recover.rast b/crates/syntax/test_data/parser/err/0035_use_recover.rast
index a95151bc5bf..14eaf9e9b02 100644
--- a/crates/syntax/test_data/parser/err/0035_use_recover.rast
+++ b/crates/syntax/test_data/parser/err/0035_use_recover.rast
@@ -45,8 +45,9 @@ SOURCE_FILE@0..48
       R_PAREN@43..44 ")"
     WHITESPACE@44..45 " "
     BLOCK_EXPR@45..47
-      L_CURLY@45..46 "{"
-      R_CURLY@46..47 "}"
+      STMT_LIST@45..47
+        L_CURLY@45..46 "{"
+        R_CURLY@46..47 "}"
   WHITESPACE@47..48 "\n"
 error 17..17: expected one of `*`, `::`, `{`, `self`, `super` or an identifier
 error 17..17: expected SEMICOLON
diff --git a/crates/syntax/test_data/parser/err/0037_visibility_in_traits.rast b/crates/syntax/test_data/parser/err/0037_visibility_in_traits.rast
index ae4dd2f3b21..90c258cd1a6 100644
--- a/crates/syntax/test_data/parser/err/0037_visibility_in_traits.rast
+++ b/crates/syntax/test_data/parser/err/0037_visibility_in_traits.rast
@@ -27,8 +27,9 @@ SOURCE_FILE@0..118
           R_PAREN@27..28 ")"
         WHITESPACE@28..29 " "
         BLOCK_EXPR@29..31
-          L_CURLY@29..30 "{"
-          R_CURLY@30..31 "}"
+          STMT_LIST@29..31
+            L_CURLY@29..30 "{"
+            R_CURLY@30..31 "}"
       WHITESPACE@31..36 "\n    "
       FN@36..51
         VISIBILITY@36..39
@@ -43,8 +44,9 @@ SOURCE_FILE@0..118
           R_PAREN@47..48 ")"
         WHITESPACE@48..49 " "
         BLOCK_EXPR@49..51
-          L_CURLY@49..50 "{"
-          R_CURLY@50..51 "}"
+          STMT_LIST@49..51
+            L_CURLY@49..50 "{"
+            R_CURLY@50..51 "}"
       WHITESPACE@51..56 "\n    "
       TYPE_ALIAS@56..81
         VISIBILITY@56..66
diff --git a/crates/syntax/test_data/parser/err/0038_endless_inclusive_range.rast b/crates/syntax/test_data/parser/err/0038_endless_inclusive_range.rast
index bed7ad6c332..fd302fb4d55 100644
--- a/crates/syntax/test_data/parser/err/0038_endless_inclusive_range.rast
+++ b/crates/syntax/test_data/parser/err/0038_endless_inclusive_range.rast
@@ -9,21 +9,22 @@ SOURCE_FILE@0..33
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..32
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      EXPR_STMT@16..21
-        RANGE_EXPR@16..20
-          LITERAL@16..17
-            INT_NUMBER@16..17 "0"
-          DOT2EQ@17..20 "..="
-        SEMICOLON@20..21 ";"
-      WHITESPACE@21..26 "\n    "
-      EXPR_STMT@26..30
-        RANGE_EXPR@26..29
-          DOT2EQ@26..29 "..="
-        SEMICOLON@29..30 ";"
-      WHITESPACE@30..31 "\n"
-      R_CURLY@31..32 "}"
+      STMT_LIST@10..32
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        EXPR_STMT@16..21
+          RANGE_EXPR@16..20
+            LITERAL@16..17
+              INT_NUMBER@16..17 "0"
+            DOT2EQ@17..20 "..="
+          SEMICOLON@20..21 ";"
+        WHITESPACE@21..26 "\n    "
+        EXPR_STMT@26..30
+          RANGE_EXPR@26..29
+            DOT2EQ@26..29 "..="
+          SEMICOLON@29..30 ";"
+        WHITESPACE@30..31 "\n"
+        R_CURLY@31..32 "}"
   WHITESPACE@32..33 "\n"
 error 16..20: An inclusive range must have an end expression
 error 26..29: An inclusive range must have an end expression
diff --git a/crates/syntax/test_data/parser/err/0039_lambda_recovery.rast b/crates/syntax/test_data/parser/err/0039_lambda_recovery.rast
index a9c5b70fd3d..b9b9f2e4b1b 100644
--- a/crates/syntax/test_data/parser/err/0039_lambda_recovery.rast
+++ b/crates/syntax/test_data/parser/err/0039_lambda_recovery.rast
@@ -18,65 +18,66 @@ SOURCE_FILE@0..83
               IDENT@12..15 "i32"
     WHITESPACE@15..16 " "
     BLOCK_EXPR@16..82
-      L_CURLY@16..17 "{"
-      WHITESPACE@17..22 "\n    "
-      EXPR_STMT@22..80
-        METHOD_CALL_EXPR@22..79
-          METHOD_CALL_EXPR@22..57
-            METHOD_CALL_EXPR@22..38
-              ARRAY_EXPR@22..31
-                L_BRACK@22..23 "["
-                LITERAL@23..24
-                  INT_NUMBER@23..24 "1"
-                COMMA@24..25 ","
-                WHITESPACE@25..26 " "
-                LITERAL@26..27
-                  INT_NUMBER@26..27 "2"
-                COMMA@27..28 ","
-                WHITESPACE@28..29 " "
-                LITERAL@29..30
-                  INT_NUMBER@29..30 "3"
-                R_BRACK@30..31 "]"
-              DOT@31..32 "."
-              NAME_REF@32..36
-                IDENT@32..36 "iter"
-              ARG_LIST@36..38
-                L_PAREN@36..37 "("
-                R_PAREN@37..38 ")"
-            WHITESPACE@38..47 "\n        "
-            DOT@47..48 "."
-            NAME_REF@48..51
-              IDENT@48..51 "map"
-            ARG_LIST@51..57
-              L_PAREN@51..52 "("
-              CLOSURE_EXPR@52..56
-                PARAM_LIST@52..56
-                  PIPE@52..53 "|"
-                  PARAM@53..55
-                    IDENT_PAT@53..55
-                      NAME@53..55
-                        IDENT@53..55 "it"
-                  PIPE@55..56 "|"
-              R_PAREN@56..57 ")"
-          WHITESPACE@57..66 "\n        "
-          DOT@66..67 "."
-          NAME_REF@67..70
-            IDENT@67..70 "max"
-          GENERIC_ARG_LIST@70..77
-            COLON2@70..72 "::"
-            L_ANGLE@72..73 "<"
-            TYPE_ARG@73..76
-              PATH_TYPE@73..76
-                PATH@73..76
-                  PATH_SEGMENT@73..76
-                    NAME_REF@73..76
-                      IDENT@73..76 "i32"
-            R_ANGLE@76..77 ">"
-          ARG_LIST@77..79
-            L_PAREN@77..78 "("
-            R_PAREN@78..79 ")"
-        SEMICOLON@79..80 ";"
-      WHITESPACE@80..81 "\n"
-      R_CURLY@81..82 "}"
+      STMT_LIST@16..82
+        L_CURLY@16..17 "{"
+        WHITESPACE@17..22 "\n    "
+        EXPR_STMT@22..80
+          METHOD_CALL_EXPR@22..79
+            METHOD_CALL_EXPR@22..57
+              METHOD_CALL_EXPR@22..38
+                ARRAY_EXPR@22..31
+                  L_BRACK@22..23 "["
+                  LITERAL@23..24
+                    INT_NUMBER@23..24 "1"
+                  COMMA@24..25 ","
+                  WHITESPACE@25..26 " "
+                  LITERAL@26..27
+                    INT_NUMBER@26..27 "2"
+                  COMMA@27..28 ","
+                  WHITESPACE@28..29 " "
+                  LITERAL@29..30
+                    INT_NUMBER@29..30 "3"
+                  R_BRACK@30..31 "]"
+                DOT@31..32 "."
+                NAME_REF@32..36
+                  IDENT@32..36 "iter"
+                ARG_LIST@36..38
+                  L_PAREN@36..37 "("
+                  R_PAREN@37..38 ")"
+              WHITESPACE@38..47 "\n        "
+              DOT@47..48 "."
+              NAME_REF@48..51
+                IDENT@48..51 "map"
+              ARG_LIST@51..57
+                L_PAREN@51..52 "("
+                CLOSURE_EXPR@52..56
+                  PARAM_LIST@52..56
+                    PIPE@52..53 "|"
+                    PARAM@53..55
+                      IDENT_PAT@53..55
+                        NAME@53..55
+                          IDENT@53..55 "it"
+                    PIPE@55..56 "|"
+                R_PAREN@56..57 ")"
+            WHITESPACE@57..66 "\n        "
+            DOT@66..67 "."
+            NAME_REF@67..70
+              IDENT@67..70 "max"
+            GENERIC_ARG_LIST@70..77
+              COLON2@70..72 "::"
+              L_ANGLE@72..73 "<"
+              TYPE_ARG@73..76
+                PATH_TYPE@73..76
+                  PATH@73..76
+                    PATH_SEGMENT@73..76
+                      NAME_REF@73..76
+                        IDENT@73..76 "i32"
+              R_ANGLE@76..77 ">"
+            ARG_LIST@77..79
+              L_PAREN@77..78 "("
+              R_PAREN@78..79 ")"
+          SEMICOLON@79..80 ";"
+        WHITESPACE@80..81 "\n"
+        R_CURLY@81..82 "}"
   WHITESPACE@82..83 "\n"
 error 56..56: expected expression
diff --git a/crates/syntax/test_data/parser/err/0043_weird_blocks.rast b/crates/syntax/test_data/parser/err/0043_weird_blocks.rast
index 797a0896482..25910cb4052 100644
--- a/crates/syntax/test_data/parser/err/0043_weird_blocks.rast
+++ b/crates/syntax/test_data/parser/err/0043_weird_blocks.rast
@@ -9,60 +9,65 @@ SOURCE_FILE@0..83
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..82
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      EXPR_STMT@16..29
-        BLOCK_EXPR@16..29
-          L_CURLY@16..17 "{"
-          WHITESPACE@17..18 " "
-          ERROR@18..24
-            UNSAFE_KW@18..24 "unsafe"
-          WHITESPACE@24..25 " "
-          LITERAL@25..27
-            INT_NUMBER@25..27 "92"
-          WHITESPACE@27..28 " "
-          R_CURLY@28..29 "}"
-      WHITESPACE@29..34 "\n    "
-      EXPR_STMT@34..46
-        BLOCK_EXPR@34..46
-          L_CURLY@34..35 "{"
-          WHITESPACE@35..36 " "
-          ERROR@36..41
-            ASYNC_KW@36..41 "async"
-          WHITESPACE@41..42 " "
-          LITERAL@42..44
-            INT_NUMBER@42..44 "92"
-          WHITESPACE@44..45 " "
-          R_CURLY@45..46 "}"
-      WHITESPACE@46..51 "\n    "
-      EXPR_STMT@51..61
-        BLOCK_EXPR@51..61
-          L_CURLY@51..52 "{"
-          WHITESPACE@52..53 " "
-          EXPR_STMT@53..56
-            EFFECT_EXPR@53..56
-              TRY_KW@53..56 "try"
-          WHITESPACE@56..57 " "
-          LITERAL@57..59
-            INT_NUMBER@57..59 "92"
-          WHITESPACE@59..60 " "
-          R_CURLY@60..61 "}"
-      WHITESPACE@61..66 "\n    "
-      BLOCK_EXPR@66..80
-        L_CURLY@66..67 "{"
-        WHITESPACE@67..68 " "
-        ERROR@68..75
-          LABEL@68..75
-            LIFETIME@68..74
-              LIFETIME_IDENT@68..74 "'label"
-            COLON@74..75 ":"
-        WHITESPACE@75..76 " "
-        LITERAL@76..78
-          INT_NUMBER@76..78 "92"
-        WHITESPACE@78..79 " "
-        R_CURLY@79..80 "}"
-      WHITESPACE@80..81 "\n"
-      R_CURLY@81..82 "}"
+      STMT_LIST@10..82
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        EXPR_STMT@16..29
+          BLOCK_EXPR@16..29
+            STMT_LIST@16..29
+              L_CURLY@16..17 "{"
+              WHITESPACE@17..18 " "
+              ERROR@18..24
+                UNSAFE_KW@18..24 "unsafe"
+              WHITESPACE@24..25 " "
+              LITERAL@25..27
+                INT_NUMBER@25..27 "92"
+              WHITESPACE@27..28 " "
+              R_CURLY@28..29 "}"
+        WHITESPACE@29..34 "\n    "
+        EXPR_STMT@34..46
+          BLOCK_EXPR@34..46
+            STMT_LIST@34..46
+              L_CURLY@34..35 "{"
+              WHITESPACE@35..36 " "
+              ERROR@36..41
+                ASYNC_KW@36..41 "async"
+              WHITESPACE@41..42 " "
+              LITERAL@42..44
+                INT_NUMBER@42..44 "92"
+              WHITESPACE@44..45 " "
+              R_CURLY@45..46 "}"
+        WHITESPACE@46..51 "\n    "
+        EXPR_STMT@51..61
+          BLOCK_EXPR@51..61
+            STMT_LIST@51..61
+              L_CURLY@51..52 "{"
+              WHITESPACE@52..53 " "
+              EXPR_STMT@53..56
+                BLOCK_EXPR@53..56
+                  TRY_KW@53..56 "try"
+              WHITESPACE@56..57 " "
+              LITERAL@57..59
+                INT_NUMBER@57..59 "92"
+              WHITESPACE@59..60 " "
+              R_CURLY@60..61 "}"
+        WHITESPACE@61..66 "\n    "
+        BLOCK_EXPR@66..80
+          STMT_LIST@66..80
+            L_CURLY@66..67 "{"
+            WHITESPACE@67..68 " "
+            ERROR@68..75
+              LABEL@68..75
+                LIFETIME@68..74
+                  LIFETIME_IDENT@68..74 "'label"
+                COLON@74..75 ":"
+            WHITESPACE@75..76 " "
+            LITERAL@76..78
+              INT_NUMBER@76..78 "92"
+            WHITESPACE@78..79 " "
+            R_CURLY@79..80 "}"
+        WHITESPACE@80..81 "\n"
+        R_CURLY@81..82 "}"
   WHITESPACE@82..83 "\n"
 error 24..24: expected existential, fn, trait or impl
 error 41..41: expected existential, fn, trait or impl
diff --git a/crates/syntax/test_data/parser/err/0044_unexpected_for_type.rast b/crates/syntax/test_data/parser/err/0044_unexpected_for_type.rast
index a2460a7eca3..d4e4bf102ed 100644
--- a/crates/syntax/test_data/parser/err/0044_unexpected_for_type.rast
+++ b/crates/syntax/test_data/parser/err/0044_unexpected_for_type.rast
@@ -244,9 +244,10 @@ SOURCE_FILE@0..239
       COMMA@233..234 ","
     WHITESPACE@234..235 "\n"
     BLOCK_EXPR@235..238
-      L_CURLY@235..236 "{"
-      WHITESPACE@236..237 "\n"
-      R_CURLY@237..238 "}"
+      STMT_LIST@235..238
+        L_CURLY@235..236 "{"
+        WHITESPACE@236..237 "\n"
+        R_CURLY@237..238 "}"
   WHITESPACE@238..239 "\n"
 error 21..21: expected a function pointer or path
 error 52..52: expected a function pointer or path
diff --git a/crates/syntax/test_data/parser/err/0045_item_modifiers.rast b/crates/syntax/test_data/parser/err/0045_item_modifiers.rast
index e9dad0b7a03..b4ff1a14a7c 100644
--- a/crates/syntax/test_data/parser/err/0045_item_modifiers.rast
+++ b/crates/syntax/test_data/parser/err/0045_item_modifiers.rast
@@ -14,8 +14,9 @@ SOURCE_FILE@0..50
       R_PAREN@20..21 ")"
     WHITESPACE@21..22 " "
     BLOCK_EXPR@22..24
-      L_CURLY@22..23 "{"
-      R_CURLY@23..24 "}"
+      STMT_LIST@22..24
+        L_CURLY@22..23 "{"
+        R_CURLY@23..24 "}"
   WHITESPACE@24..25 "\n"
   CONST@25..40
     UNSAFE_KW@25..31 "unsafe"
diff --git a/crates/syntax/test_data/parser/err/0046_ambiguous_trait_object.rast b/crates/syntax/test_data/parser/err/0046_ambiguous_trait_object.rast
index 6eaa32b9695..d94daacdc1d 100644
--- a/crates/syntax/test_data/parser/err/0046_ambiguous_trait_object.rast
+++ b/crates/syntax/test_data/parser/err/0046_ambiguous_trait_object.rast
@@ -117,77 +117,78 @@ SOURCE_FILE@0..187
       R_PAREN@118..119 ")"
     WHITESPACE@119..120 " "
     BLOCK_EXPR@120..186
-      L_CURLY@120..121 "{"
-      WHITESPACE@121..126 "\n    "
-      LET_STMT@126..184
-        LET_KW@126..129 "let"
-        WHITESPACE@129..130 " "
-        IDENT_PAT@130..131
-          NAME@130..131
-            IDENT@130..131 "b"
-        WHITESPACE@131..132 " "
-        EQ@132..133 "="
-        WHITESPACE@133..134 " "
-        CAST_EXPR@134..183
-          PAREN_EXPR@134..138
-            L_PAREN@134..135 "("
-            REF_EXPR@135..137
-              AMP@135..136 "&"
-              PATH_EXPR@136..137
-                PATH@136..137
-                  PATH_SEGMENT@136..137
-                    NAME_REF@136..137
-                      IDENT@136..137 "a"
-            R_PAREN@137..138 ")"
-          WHITESPACE@138..139 " "
-          AS_KW@139..141 "as"
-          WHITESPACE@141..142 " "
-          REF_TYPE@142..183
-            AMP@142..143 "&"
-            DYN_TRAIT_TYPE@143..183
-              DYN_KW@143..146 "dyn"
-              WHITESPACE@146..147 " "
-              TYPE_BOUND_LIST@147..183
-                TYPE_BOUND@147..175
-                  PATH_TYPE@147..175
-                    PATH@147..175
-                      PATH_SEGMENT@147..175
-                        NAME_REF@147..150
-                          IDENT@147..150 "Add"
-                        GENERIC_ARG_LIST@150..175
-                          L_ANGLE@150..151 "<"
-                          TYPE_ARG@151..156
-                            PATH_TYPE@151..156
-                              PATH@151..156
-                                PATH_SEGMENT@151..156
-                                  NAME_REF@151..156
-                                    IDENT@151..156 "Other"
-                          COMMA@156..157 ","
-                          WHITESPACE@157..158 " "
-                          ASSOC_TYPE_ARG@158..174
-                            NAME_REF@158..164
-                              IDENT@158..164 "Output"
-                            WHITESPACE@164..165 " "
-                            EQ@165..166 "="
-                            WHITESPACE@166..167 " "
-                            PATH_TYPE@167..174
-                              PATH@167..174
-                                PATH_SEGMENT@167..174
-                                  NAME_REF@167..174
-                                    IDENT@167..174 "Addable"
-                          R_ANGLE@174..175 ">"
-                WHITESPACE@175..176 " "
-                PLUS@176..177 "+"
-                WHITESPACE@177..178 " "
-                TYPE_BOUND@178..183
-                  PATH_TYPE@178..183
-                    PATH@178..183
-                      PATH_SEGMENT@178..183
-                        NAME_REF@178..183
-                          IDENT@178..183 "Other"
-        SEMICOLON@183..184 ";"
-      WHITESPACE@184..185 "\n"
-      R_CURLY@185..186 "}"
+      STMT_LIST@120..186
+        L_CURLY@120..121 "{"
+        WHITESPACE@121..126 "\n    "
+        LET_STMT@126..184
+          LET_KW@126..129 "let"
+          WHITESPACE@129..130 " "
+          IDENT_PAT@130..131
+            NAME@130..131
+              IDENT@130..131 "b"
+          WHITESPACE@131..132 " "
+          EQ@132..133 "="
+          WHITESPACE@133..134 " "
+          CAST_EXPR@134..183
+            PAREN_EXPR@134..138
+              L_PAREN@134..135 "("
+              REF_EXPR@135..137
+                AMP@135..136 "&"
+                PATH_EXPR@136..137
+                  PATH@136..137
+                    PATH_SEGMENT@136..137
+                      NAME_REF@136..137
+                        IDENT@136..137 "a"
+              R_PAREN@137..138 ")"
+            WHITESPACE@138..139 " "
+            AS_KW@139..141 "as"
+            WHITESPACE@141..142 " "
+            REF_TYPE@142..183
+              AMP@142..143 "&"
+              DYN_TRAIT_TYPE@143..183
+                DYN_KW@143..146 "dyn"
+                WHITESPACE@146..147 " "
+                TYPE_BOUND_LIST@147..183
+                  TYPE_BOUND@147..175
+                    PATH_TYPE@147..175
+                      PATH@147..175
+                        PATH_SEGMENT@147..175
+                          NAME_REF@147..150
+                            IDENT@147..150 "Add"
+                          GENERIC_ARG_LIST@150..175
+                            L_ANGLE@150..151 "<"
+                            TYPE_ARG@151..156
+                              PATH_TYPE@151..156
+                                PATH@151..156
+                                  PATH_SEGMENT@151..156
+                                    NAME_REF@151..156
+                                      IDENT@151..156 "Other"
+                            COMMA@156..157 ","
+                            WHITESPACE@157..158 " "
+                            ASSOC_TYPE_ARG@158..174
+                              NAME_REF@158..164
+                                IDENT@158..164 "Output"
+                              WHITESPACE@164..165 " "
+                              EQ@165..166 "="
+                              WHITESPACE@166..167 " "
+                              PATH_TYPE@167..174
+                                PATH@167..174
+                                  PATH_SEGMENT@167..174
+                                    NAME_REF@167..174
+                                      IDENT@167..174 "Addable"
+                            R_ANGLE@174..175 ">"
+                  WHITESPACE@175..176 " "
+                  PLUS@176..177 "+"
+                  WHITESPACE@177..178 " "
+                  TYPE_BOUND@178..183
+                    PATH_TYPE@178..183
+                      PATH@178..183
+                        PATH_SEGMENT@178..183
+                          NAME_REF@178..183
+                            IDENT@178..183 "Other"
+          SEMICOLON@183..184 ";"
+        WHITESPACE@184..185 "\n"
+        R_CURLY@185..186 "}"
   WHITESPACE@186..187 "\n"
 error 19..34: ambiguous `+` in a type
 error 54..69: ambiguous `+` in a type
diff --git a/crates/syntax/test_data/parser/err/0049_double_fish.rast b/crates/syntax/test_data/parser/err/0049_double_fish.rast
index 51e36543ac8..ca52166fbc4 100644
--- a/crates/syntax/test_data/parser/err/0049_double_fish.rast
+++ b/crates/syntax/test_data/parser/err/0049_double_fish.rast
@@ -9,48 +9,49 @@ SOURCE_FILE@0..90
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..40
-      L_CURLY@7..8 "{"
-      WHITESPACE@8..13 "\n    "
-      EXPR_STMT@13..31
-        PATH_EXPR@13..31
-          PATH@13..31
-            PATH_SEGMENT@13..31
-              NAME_REF@13..14
-                IDENT@13..14 "S"
-              GENERIC_ARG_LIST@14..31
-                COLON2@14..16 "::"
-                L_ANGLE@16..17 "<"
-                TYPE_ARG@17..31
-                  PATH_TYPE@17..31
-                    PATH@17..31
-                      PATH@17..28
-                        PATH_SEGMENT@17..28
-                          NAME_REF@17..21
-                            IDENT@17..21 "Item"
-                          GENERIC_ARG_LIST@21..28
-                            COLON2@21..23 "::"
-                            L_ANGLE@23..24 "<"
-                            TYPE_ARG@24..27
-                              PATH_TYPE@24..27
-                                PATH@24..27
-                                  PATH_SEGMENT@24..27
-                                    NAME_REF@24..27
-                                      IDENT@24..27 "lol"
-                            R_ANGLE@27..28 ">"
-                      COLON2@28..30 "::"
-                      ERROR@30..31
-                        L_ANGLE@30..31 "<"
-      BIN_EXPR@31..38
-        PATH_EXPR@31..35
-          PATH@31..35
-            PATH_SEGMENT@31..35
-              NAME_REF@31..35
-                IDENT@31..35 "nope"
-        SHR@35..37 ">>"
-        ERROR@37..38
-          SEMICOLON@37..38 ";"
-      WHITESPACE@38..39 "\n"
-      R_CURLY@39..40 "}"
+      STMT_LIST@7..40
+        L_CURLY@7..8 "{"
+        WHITESPACE@8..13 "\n    "
+        EXPR_STMT@13..31
+          PATH_EXPR@13..31
+            PATH@13..31
+              PATH_SEGMENT@13..31
+                NAME_REF@13..14
+                  IDENT@13..14 "S"
+                GENERIC_ARG_LIST@14..31
+                  COLON2@14..16 "::"
+                  L_ANGLE@16..17 "<"
+                  TYPE_ARG@17..31
+                    PATH_TYPE@17..31
+                      PATH@17..31
+                        PATH@17..28
+                          PATH_SEGMENT@17..28
+                            NAME_REF@17..21
+                              IDENT@17..21 "Item"
+                            GENERIC_ARG_LIST@21..28
+                              COLON2@21..23 "::"
+                              L_ANGLE@23..24 "<"
+                              TYPE_ARG@24..27
+                                PATH_TYPE@24..27
+                                  PATH@24..27
+                                    PATH_SEGMENT@24..27
+                                      NAME_REF@24..27
+                                        IDENT@24..27 "lol"
+                              R_ANGLE@27..28 ">"
+                        COLON2@28..30 "::"
+                        ERROR@30..31
+                          L_ANGLE@30..31 "<"
+        BIN_EXPR@31..38
+          PATH_EXPR@31..35
+            PATH@31..35
+              PATH_SEGMENT@31..35
+                NAME_REF@31..35
+                  IDENT@31..35 "nope"
+          SHR@35..37 ">>"
+          ERROR@37..38
+            SEMICOLON@37..38 ";"
+        WHITESPACE@38..39 "\n"
+        R_CURLY@39..40 "}"
   WHITESPACE@40..42 "\n\n"
   FN@42..89
     FN_KW@42..44 "fn"
@@ -62,53 +63,54 @@ SOURCE_FILE@0..90
       R_PAREN@47..48 ")"
     WHITESPACE@48..49 " "
     BLOCK_EXPR@49..89
-      L_CURLY@49..50 "{"
-      WHITESPACE@50..55 "\n    "
-      LET_STMT@55..76
-        LET_KW@55..58 "let"
-        WHITESPACE@58..59 " "
-        WILDCARD_PAT@59..60
-          UNDERSCORE@59..60 "_"
-        COLON@60..61 ":"
-        WHITESPACE@61..62 " "
-        PATH_TYPE@62..76
-          PATH@62..76
-            PATH@62..73
-              PATH_SEGMENT@62..73
-                NAME_REF@62..66
-                  IDENT@62..66 "Item"
-                GENERIC_ARG_LIST@66..73
-                  COLON2@66..68 "::"
-                  L_ANGLE@68..69 "<"
-                  TYPE_ARG@69..72
-                    PATH_TYPE@69..72
-                      PATH@69..72
-                        PATH_SEGMENT@69..72
-                          NAME_REF@69..72
-                            IDENT@69..72 "lol"
-                  R_ANGLE@72..73 ">"
-            COLON2@73..75 "::"
-            ERROR@75..76
-              L_ANGLE@75..76 "<"
-      EXPR_STMT@76..83
-        BIN_EXPR@76..83
-          PATH_EXPR@76..80
-            PATH@76..80
-              PATH_SEGMENT@76..80
-                NAME_REF@76..80
-                  IDENT@76..80 "nope"
-          R_ANGLE@80..81 ">"
-          WHITESPACE@81..82 " "
-          ERROR@82..83
-            EQ@82..83 "="
-      WHITESPACE@83..84 " "
-      EXPR_STMT@84..87
-        TUPLE_EXPR@84..86
-          L_PAREN@84..85 "("
-          R_PAREN@85..86 ")"
-        SEMICOLON@86..87 ";"
-      WHITESPACE@87..88 "\n"
-      R_CURLY@88..89 "}"
+      STMT_LIST@49..89
+        L_CURLY@49..50 "{"
+        WHITESPACE@50..55 "\n    "
+        LET_STMT@55..76
+          LET_KW@55..58 "let"
+          WHITESPACE@58..59 " "
+          WILDCARD_PAT@59..60
+            UNDERSCORE@59..60 "_"
+          COLON@60..61 ":"
+          WHITESPACE@61..62 " "
+          PATH_TYPE@62..76
+            PATH@62..76
+              PATH@62..73
+                PATH_SEGMENT@62..73
+                  NAME_REF@62..66
+                    IDENT@62..66 "Item"
+                  GENERIC_ARG_LIST@66..73
+                    COLON2@66..68 "::"
+                    L_ANGLE@68..69 "<"
+                    TYPE_ARG@69..72
+                      PATH_TYPE@69..72
+                        PATH@69..72
+                          PATH_SEGMENT@69..72
+                            NAME_REF@69..72
+                              IDENT@69..72 "lol"
+                    R_ANGLE@72..73 ">"
+              COLON2@73..75 "::"
+              ERROR@75..76
+                L_ANGLE@75..76 "<"
+        EXPR_STMT@76..83
+          BIN_EXPR@76..83
+            PATH_EXPR@76..80
+              PATH@76..80
+                PATH_SEGMENT@76..80
+                  NAME_REF@76..80
+                    IDENT@76..80 "nope"
+            R_ANGLE@80..81 ">"
+            WHITESPACE@81..82 " "
+            ERROR@82..83
+              EQ@82..83 "="
+        WHITESPACE@83..84 " "
+        EXPR_STMT@84..87
+          TUPLE_EXPR@84..86
+            L_PAREN@84..85 "("
+            R_PAREN@85..86 ")"
+          SEMICOLON@86..87 ";"
+        WHITESPACE@87..88 "\n"
+        R_CURLY@88..89 "}"
   WHITESPACE@89..90 "\n"
 error 30..30: expected identifier
 error 31..31: expected COMMA
diff --git a/crates/syntax/test_data/parser/fragments/item/ok/0000_fn.rast b/crates/syntax/test_data/parser/fragments/item/ok/0000_fn.rast
index 93c429e128c..4ff9967beac 100644
--- a/crates/syntax/test_data/parser/fragments/item/ok/0000_fn.rast
+++ b/crates/syntax/test_data/parser/fragments/item/ok/0000_fn.rast
@@ -8,5 +8,6 @@ FN@0..11
     R_PAREN@7..8 ")"
   WHITESPACE@8..9 " "
   BLOCK_EXPR@9..11
-    L_CURLY@9..10 "{"
-    R_CURLY@10..11 "}"
+    STMT_LIST@9..11
+      L_CURLY@9..10 "{"
+      R_CURLY@10..11 "}"
diff --git a/crates/syntax/test_data/parser/fragments/stmt/ok/0000_expr_block.rast b/crates/syntax/test_data/parser/fragments/stmt/ok/0000_expr_block.rast
index 6c946091f38..a2d4f18988a 100644
--- a/crates/syntax/test_data/parser/fragments/stmt/ok/0000_expr_block.rast
+++ b/crates/syntax/test_data/parser/fragments/stmt/ok/0000_expr_block.rast
@@ -1,69 +1,70 @@
 EXPR_STMT@0..55
   BLOCK_EXPR@0..55
-    L_CURLY@0..1 "{"
-    WHITESPACE@1..6 "\n    "
-    LET_STMT@6..20
-      LET_KW@6..9 "let"
-      WHITESPACE@9..10 " "
-      IDENT_PAT@10..11
-        NAME@10..11
-          IDENT@10..11 "x"
-      WHITESPACE@11..12 " "
-      EQ@12..13 "="
-      WHITESPACE@13..14 " "
-      CALL_EXPR@14..19
-        PATH_EXPR@14..17
-          PATH@14..17
-            PATH_SEGMENT@14..17
-              NAME_REF@14..17
-                IDENT@14..17 "foo"
-        ARG_LIST@17..19
-          L_PAREN@17..18 "("
-          R_PAREN@18..19 ")"
-      SEMICOLON@19..20 ";"
-    WHITESPACE@20..25 "\n    "
-    LET_STMT@25..39
-      LET_KW@25..28 "let"
-      WHITESPACE@28..29 " "
-      IDENT_PAT@29..30
-        NAME@29..30
-          IDENT@29..30 "y"
-      WHITESPACE@30..31 " "
-      EQ@31..32 "="
-      WHITESPACE@32..33 " "
-      CALL_EXPR@33..38
-        PATH_EXPR@33..36
-          PATH@33..36
-            PATH_SEGMENT@33..36
-              NAME_REF@33..36
-                IDENT@33..36 "bar"
-        ARG_LIST@36..38
-          L_PAREN@36..37 "("
-          R_PAREN@37..38 ")"
-      SEMICOLON@38..39 ";"
-    WHITESPACE@39..44 "\n    "
-    CALL_EXPR@44..53
-      PATH_EXPR@44..46
-        PATH@44..46
-          PATH_SEGMENT@44..46
-            NAME_REF@44..46
-              IDENT@44..46 "Ok"
-      ARG_LIST@46..53
-        L_PAREN@46..47 "("
-        BIN_EXPR@47..52
-          PATH_EXPR@47..48
-            PATH@47..48
-              PATH_SEGMENT@47..48
-                NAME_REF@47..48
-                  IDENT@47..48 "x"
-          WHITESPACE@48..49 " "
-          PLUS@49..50 "+"
-          WHITESPACE@50..51 " "
-          PATH_EXPR@51..52
-            PATH@51..52
-              PATH_SEGMENT@51..52
-                NAME_REF@51..52
-                  IDENT@51..52 "y"
-        R_PAREN@52..53 ")"
-    WHITESPACE@53..54 "\n"
-    R_CURLY@54..55 "}"
+    STMT_LIST@0..55
+      L_CURLY@0..1 "{"
+      WHITESPACE@1..6 "\n    "
+      LET_STMT@6..20
+        LET_KW@6..9 "let"
+        WHITESPACE@9..10 " "
+        IDENT_PAT@10..11
+          NAME@10..11
+            IDENT@10..11 "x"
+        WHITESPACE@11..12 " "
+        EQ@12..13 "="
+        WHITESPACE@13..14 " "
+        CALL_EXPR@14..19
+          PATH_EXPR@14..17
+            PATH@14..17
+              PATH_SEGMENT@14..17
+                NAME_REF@14..17
+                  IDENT@14..17 "foo"
+          ARG_LIST@17..19
+            L_PAREN@17..18 "("
+            R_PAREN@18..19 ")"
+        SEMICOLON@19..20 ";"
+      WHITESPACE@20..25 "\n    "
+      LET_STMT@25..39
+        LET_KW@25..28 "let"
+        WHITESPACE@28..29 " "
+        IDENT_PAT@29..30
+          NAME@29..30
+            IDENT@29..30 "y"
+        WHITESPACE@30..31 " "
+        EQ@31..32 "="
+        WHITESPACE@32..33 " "
+        CALL_EXPR@33..38
+          PATH_EXPR@33..36
+            PATH@33..36
+              PATH_SEGMENT@33..36
+                NAME_REF@33..36
+                  IDENT@33..36 "bar"
+          ARG_LIST@36..38
+            L_PAREN@36..37 "("
+            R_PAREN@37..38 ")"
+        SEMICOLON@38..39 ";"
+      WHITESPACE@39..44 "\n    "
+      CALL_EXPR@44..53
+        PATH_EXPR@44..46
+          PATH@44..46
+            PATH_SEGMENT@44..46
+              NAME_REF@44..46
+                IDENT@44..46 "Ok"
+        ARG_LIST@46..53
+          L_PAREN@46..47 "("
+          BIN_EXPR@47..52
+            PATH_EXPR@47..48
+              PATH@47..48
+                PATH_SEGMENT@47..48
+                  NAME_REF@47..48
+                    IDENT@47..48 "x"
+            WHITESPACE@48..49 " "
+            PLUS@49..50 "+"
+            WHITESPACE@50..51 " "
+            PATH_EXPR@51..52
+              PATH@51..52
+                PATH_SEGMENT@51..52
+                  NAME_REF@51..52
+                    IDENT@51..52 "y"
+          R_PAREN@52..53 ")"
+      WHITESPACE@53..54 "\n"
+      R_CURLY@54..55 "}"
diff --git a/crates/syntax/test_data/parser/inline/err/0002_misplaced_label_err.rast b/crates/syntax/test_data/parser/inline/err/0002_misplaced_label_err.rast
index 3774dd0733e..06abd807f17 100644
--- a/crates/syntax/test_data/parser/inline/err/0002_misplaced_label_err.rast
+++ b/crates/syntax/test_data/parser/inline/err/0002_misplaced_label_err.rast
@@ -9,18 +9,19 @@ SOURCE_FILE@0..30
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..29
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      ERROR@16..22
-        LABEL@16..22
-          LIFETIME@16..21
-            LIFETIME_IDENT@16..21 "'loop"
-          COLON@21..22 ":"
-      WHITESPACE@22..23 " "
-      IMPL@23..27
-        IMPL_KW@23..27 "impl"
-      WHITESPACE@27..28 "\n"
-      R_CURLY@28..29 "}"
+      STMT_LIST@10..29
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        ERROR@16..22
+          LABEL@16..22
+            LIFETIME@16..21
+              LIFETIME_IDENT@16..21 "'loop"
+            COLON@21..22 ":"
+        WHITESPACE@22..23 " "
+        IMPL@23..27
+          IMPL_KW@23..27 "impl"
+        WHITESPACE@27..28 "\n"
+        R_CURLY@28..29 "}"
   WHITESPACE@29..30 "\n"
 error 22..22: expected a loop
 error 27..27: expected type
diff --git a/crates/syntax/test_data/parser/inline/err/0006_unsafe_block_in_mod.rast b/crates/syntax/test_data/parser/inline/err/0006_unsafe_block_in_mod.rast
index cc0f8bcaf9f..04bac982114 100644
--- a/crates/syntax/test_data/parser/inline/err/0006_unsafe_block_in_mod.rast
+++ b/crates/syntax/test_data/parser/inline/err/0006_unsafe_block_in_mod.rast
@@ -8,8 +8,9 @@ SOURCE_FILE@0..33
       L_PAREN@6..7 "("
       R_PAREN@7..8 ")"
     BLOCK_EXPR@8..10
-      L_CURLY@8..9 "{"
-      R_CURLY@9..10 "}"
+      STMT_LIST@8..10
+        L_CURLY@8..9 "{"
+        R_CURLY@9..10 "}"
   WHITESPACE@10..11 " "
   ERROR@11..17
     UNSAFE_KW@11..17 "unsafe"
@@ -28,8 +29,9 @@ SOURCE_FILE@0..33
       L_PAREN@28..29 "("
       R_PAREN@29..30 ")"
     BLOCK_EXPR@30..32
-      L_CURLY@30..31 "{"
-      R_CURLY@31..32 "}"
+      STMT_LIST@30..32
+        L_CURLY@30..31 "{"
+        R_CURLY@31..32 "}"
   WHITESPACE@32..33 "\n"
 error 11..11: expected an item
 error 18..18: expected an item
diff --git a/crates/syntax/test_data/parser/inline/err/0007_async_without_semicolon.rast b/crates/syntax/test_data/parser/inline/err/0007_async_without_semicolon.rast
index 2c9570678ed..c9a84a0ce44 100644
--- a/crates/syntax/test_data/parser/inline/err/0007_async_without_semicolon.rast
+++ b/crates/syntax/test_data/parser/inline/err/0007_async_without_semicolon.rast
@@ -9,23 +9,24 @@ SOURCE_FILE@0..30
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..29
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..11 " "
-      LET_STMT@11..27
-        LET_KW@11..14 "let"
-        WHITESPACE@14..15 " "
-        WILDCARD_PAT@15..16
-          UNDERSCORE@15..16 "_"
-        WHITESPACE@16..17 " "
-        EQ@17..18 "="
-        WHITESPACE@18..19 " "
-        EFFECT_EXPR@19..27
-          ASYNC_KW@19..24 "async"
-          WHITESPACE@24..25 " "
-          BLOCK_EXPR@25..27
-            L_CURLY@25..26 "{"
-            R_CURLY@26..27 "}"
-      WHITESPACE@27..28 " "
-      R_CURLY@28..29 "}"
+      STMT_LIST@9..29
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..11 " "
+        LET_STMT@11..27
+          LET_KW@11..14 "let"
+          WHITESPACE@14..15 " "
+          WILDCARD_PAT@15..16
+            UNDERSCORE@15..16 "_"
+          WHITESPACE@16..17 " "
+          EQ@17..18 "="
+          WHITESPACE@18..19 " "
+          BLOCK_EXPR@19..27
+            ASYNC_KW@19..24 "async"
+            WHITESPACE@24..25 " "
+            STMT_LIST@25..27
+              L_CURLY@25..26 "{"
+              R_CURLY@26..27 "}"
+        WHITESPACE@27..28 " "
+        R_CURLY@28..29 "}"
   WHITESPACE@29..30 "\n"
 error 27..27: expected SEMICOLON
diff --git a/crates/syntax/test_data/parser/inline/err/0008_pub_expr.rast b/crates/syntax/test_data/parser/inline/err/0008_pub_expr.rast
index 63a10127dd9..57c1d2051b8 100644
--- a/crates/syntax/test_data/parser/inline/err/0008_pub_expr.rast
+++ b/crates/syntax/test_data/parser/inline/err/0008_pub_expr.rast
@@ -9,17 +9,18 @@ SOURCE_FILE@0..21
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..20
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..11 " "
-      ERROR@11..14
-        VISIBILITY@11..14
-          PUB_KW@11..14 "pub"
-      WHITESPACE@14..15 " "
-      EXPR_STMT@15..18
-        LITERAL@15..17
-          INT_NUMBER@15..17 "92"
-        SEMICOLON@17..18 ";"
-      WHITESPACE@18..19 " "
-      R_CURLY@19..20 "}"
+      STMT_LIST@9..20
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..11 " "
+        ERROR@11..14
+          VISIBILITY@11..14
+            PUB_KW@11..14 "pub"
+        WHITESPACE@14..15 " "
+        EXPR_STMT@15..18
+          LITERAL@15..17
+            INT_NUMBER@15..17 "92"
+          SEMICOLON@17..18 ";"
+        WHITESPACE@18..19 " "
+        R_CURLY@19..20 "}"
   WHITESPACE@20..21 "\n"
 error 14..14: expected an item
diff --git a/crates/syntax/test_data/parser/inline/err/0010_bad_tuple_index_expr.rast b/crates/syntax/test_data/parser/inline/err/0010_bad_tuple_index_expr.rast
index fa14e1e6de5..005f6db3c5f 100644
--- a/crates/syntax/test_data/parser/inline/err/0010_bad_tuple_index_expr.rast
+++ b/crates/syntax/test_data/parser/inline/err/0010_bad_tuple_index_expr.rast
@@ -9,44 +9,45 @@ SOURCE_FILE@0..47
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..46
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..20
-        FIELD_EXPR@15..19
-          PATH_EXPR@15..16
-            PATH@15..16
-              PATH_SEGMENT@15..16
-                NAME_REF@15..16
-                  IDENT@15..16 "x"
-          DOT@16..17 "."
-          FLOAT_NUMBER@17..19 "0."
-        SEMICOLON@19..20 ";"
-      WHITESPACE@20..25 "\n    "
-      EXPR_STMT@25..32
-        FIELD_EXPR@25..31
-          PATH_EXPR@25..26
-            PATH@25..26
-              PATH_SEGMENT@25..26
-                NAME_REF@25..26
-                  IDENT@25..26 "x"
-          DOT@26..27 "."
-          NAME_REF@27..31
-            INT_NUMBER@27..31 "1i32"
-        SEMICOLON@31..32 ";"
-      WHITESPACE@32..37 "\n    "
-      EXPR_STMT@37..44
-        FIELD_EXPR@37..43
-          PATH_EXPR@37..38
-            PATH@37..38
-              PATH_SEGMENT@37..38
-                NAME_REF@37..38
-                  IDENT@37..38 "x"
-          DOT@38..39 "."
-          NAME_REF@39..43
-            INT_NUMBER@39..43 "0x01"
-        SEMICOLON@43..44 ";"
-      WHITESPACE@44..45 "\n"
-      R_CURLY@45..46 "}"
+      STMT_LIST@9..46
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..20
+          FIELD_EXPR@15..19
+            PATH_EXPR@15..16
+              PATH@15..16
+                PATH_SEGMENT@15..16
+                  NAME_REF@15..16
+                    IDENT@15..16 "x"
+            DOT@16..17 "."
+            FLOAT_NUMBER@17..19 "0."
+          SEMICOLON@19..20 ";"
+        WHITESPACE@20..25 "\n    "
+        EXPR_STMT@25..32
+          FIELD_EXPR@25..31
+            PATH_EXPR@25..26
+              PATH@25..26
+                PATH_SEGMENT@25..26
+                  NAME_REF@25..26
+                    IDENT@25..26 "x"
+            DOT@26..27 "."
+            NAME_REF@27..31
+              INT_NUMBER@27..31 "1i32"
+          SEMICOLON@31..32 ";"
+        WHITESPACE@32..37 "\n    "
+        EXPR_STMT@37..44
+          FIELD_EXPR@37..43
+            PATH_EXPR@37..38
+              PATH@37..38
+                PATH_SEGMENT@37..38
+                  NAME_REF@37..38
+                    IDENT@37..38 "x"
+            DOT@38..39 "."
+            NAME_REF@39..43
+              INT_NUMBER@39..43 "0x01"
+          SEMICOLON@43..44 ";"
+        WHITESPACE@44..45 "\n"
+        R_CURLY@45..46 "}"
   WHITESPACE@46..47 "\n"
 error 27..31: Tuple (struct) field access is only allowed through decimal integers with no underscores or suffix
 error 39..43: Tuple (struct) field access is only allowed through decimal integers with no underscores or suffix
diff --git a/crates/syntax/test_data/parser/inline/err/0014_record_literal_before_ellipsis_recovery.rast b/crates/syntax/test_data/parser/inline/err/0014_record_literal_before_ellipsis_recovery.rast
index a81c442c0d8..f8cdddb6e84 100644
--- a/crates/syntax/test_data/parser/inline/err/0014_record_literal_before_ellipsis_recovery.rast
+++ b/crates/syntax/test_data/parser/inline/err/0014_record_literal_before_ellipsis_recovery.rast
@@ -9,40 +9,41 @@ SOURCE_FILE@0..45
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..44
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      RECORD_EXPR@16..42
-        PATH@16..17
-          PATH_SEGMENT@16..17
-            NAME_REF@16..17
-              IDENT@16..17 "S"
-        WHITESPACE@17..18 " "
-        RECORD_EXPR_FIELD_LIST@18..42
-          L_CURLY@18..19 "{"
-          WHITESPACE@19..20 " "
-          RECORD_EXPR_FIELD@20..40
-            NAME_REF@20..25
-              IDENT@20..25 "field"
-            WHITESPACE@25..26 " "
-            RANGE_EXPR@26..40
-              DOT2@26..28 ".."
-              CALL_EXPR@28..40
-                PATH_EXPR@28..38
-                  PATH@28..38
-                    PATH@28..29
-                      PATH_SEGMENT@28..29
-                        NAME_REF@28..29
-                          IDENT@28..29 "S"
-                    COLON2@29..31 "::"
-                    PATH_SEGMENT@31..38
-                      NAME_REF@31..38
-                        IDENT@31..38 "default"
-                ARG_LIST@38..40
-                  L_PAREN@38..39 "("
-                  R_PAREN@39..40 ")"
-          WHITESPACE@40..41 " "
-          R_CURLY@41..42 "}"
-      WHITESPACE@42..43 "\n"
-      R_CURLY@43..44 "}"
+      STMT_LIST@10..44
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        RECORD_EXPR@16..42
+          PATH@16..17
+            PATH_SEGMENT@16..17
+              NAME_REF@16..17
+                IDENT@16..17 "S"
+          WHITESPACE@17..18 " "
+          RECORD_EXPR_FIELD_LIST@18..42
+            L_CURLY@18..19 "{"
+            WHITESPACE@19..20 " "
+            RECORD_EXPR_FIELD@20..40
+              NAME_REF@20..25
+                IDENT@20..25 "field"
+              WHITESPACE@25..26 " "
+              RANGE_EXPR@26..40
+                DOT2@26..28 ".."
+                CALL_EXPR@28..40
+                  PATH_EXPR@28..38
+                    PATH@28..38
+                      PATH@28..29
+                        PATH_SEGMENT@28..29
+                          NAME_REF@28..29
+                            IDENT@28..29 "S"
+                      COLON2@29..31 "::"
+                      PATH_SEGMENT@31..38
+                        NAME_REF@31..38
+                          IDENT@31..38 "default"
+                  ARG_LIST@38..40
+                    L_PAREN@38..39 "("
+                    R_PAREN@39..40 ")"
+            WHITESPACE@40..41 " "
+            R_CURLY@41..42 "}"
+        WHITESPACE@42..43 "\n"
+        R_CURLY@43..44 "}"
   WHITESPACE@44..45 "\n"
 error 25..25: expected COLON
diff --git a/crates/syntax/test_data/parser/inline/err/0015_missing_fn_param_type.rast b/crates/syntax/test_data/parser/inline/err/0015_missing_fn_param_type.rast
index 99391c266ab..6c634b4f743 100644
--- a/crates/syntax/test_data/parser/inline/err/0015_missing_fn_param_type.rast
+++ b/crates/syntax/test_data/parser/inline/err/0015_missing_fn_param_type.rast
@@ -44,8 +44,9 @@ SOURCE_FILE@0..29
       R_PAREN@24..25 ")"
     WHITESPACE@25..26 " "
     BLOCK_EXPR@26..28
-      L_CURLY@26..27 "{"
-      R_CURLY@27..28 "}"
+      STMT_LIST@26..28
+        L_CURLY@26..27 "{"
+        R_CURLY@27..28 "}"
   WHITESPACE@28..29 "\n"
 error 6..6: missing type for function parameter
 error 6..6: expected COMMA
diff --git a/crates/syntax/test_data/parser/inline/ok/0003_where_pred_for.rast b/crates/syntax/test_data/parser/inline/ok/0003_where_pred_for.rast
index 12f5040f90d..174733a867f 100644
--- a/crates/syntax/test_data/parser/inline/ok/0003_where_pred_for.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0003_where_pred_for.rast
@@ -56,7 +56,8 @@ SOURCE_FILE@0..54
                     R_PAREN@48..49 ")"
     WHITESPACE@49..50 "\n"
     BLOCK_EXPR@50..53
-      L_CURLY@50..51 "{"
-      WHITESPACE@51..52 " "
-      R_CURLY@52..53 "}"
+      STMT_LIST@50..53
+        L_CURLY@50..51 "{"
+        WHITESPACE@51..52 " "
+        R_CURLY@52..53 "}"
   WHITESPACE@53..54 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0005_function_type_params.rast b/crates/syntax/test_data/parser/inline/ok/0005_function_type_params.rast
index 8e0252ce743..5308dce6a26 100644
--- a/crates/syntax/test_data/parser/inline/ok/0005_function_type_params.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0005_function_type_params.rast
@@ -32,6 +32,7 @@ SOURCE_FILE@0..28
       L_PAREN@23..24 "("
       R_PAREN@24..25 ")"
     BLOCK_EXPR@25..27
-      L_CURLY@25..26 "{"
-      R_CURLY@26..27 "}"
+      STMT_LIST@25..27
+        L_CURLY@25..26 "{"
+        R_CURLY@26..27 "}"
   WHITESPACE@27..28 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0006_self_param.rast b/crates/syntax/test_data/parser/inline/ok/0006_self_param.rast
index d4c8b9d67aa..90667cb7c2e 100644
--- a/crates/syntax/test_data/parser/inline/ok/0006_self_param.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0006_self_param.rast
@@ -24,8 +24,9 @@ SOURCE_FILE@0..128
           R_PAREN@22..23 ")"
         WHITESPACE@23..24 " "
         BLOCK_EXPR@24..26
-          L_CURLY@24..25 "{"
-          R_CURLY@25..26 "}"
+          STMT_LIST@24..26
+            L_CURLY@24..25 "{"
+            R_CURLY@25..26 "}"
       WHITESPACE@26..31 "\n    "
       FN@31..46
         FN_KW@31..33 "fn"
@@ -42,8 +43,9 @@ SOURCE_FILE@0..128
           R_PAREN@42..43 ")"
         WHITESPACE@43..44 " "
         BLOCK_EXPR@44..46
-          L_CURLY@44..45 "{"
-          R_CURLY@45..46 "}"
+          STMT_LIST@44..46
+            L_CURLY@44..45 "{"
+            R_CURLY@45..46 "}"
       WHITESPACE@46..51 "\n    "
       FN@51..69
         FN_KW@51..53 "fn"
@@ -63,8 +65,9 @@ SOURCE_FILE@0..128
           R_PAREN@65..66 ")"
         WHITESPACE@66..67 " "
         BLOCK_EXPR@67..69
-          L_CURLY@67..68 "{"
-          R_CURLY@68..69 "}"
+          STMT_LIST@67..69
+            L_CURLY@67..68 "{"
+            R_CURLY@68..69 "}"
       WHITESPACE@69..74 "\n    "
       FN@74..103
         FN_KW@74..76 "fn"
@@ -98,8 +101,9 @@ SOURCE_FILE@0..128
           R_PAREN@99..100 ")"
         WHITESPACE@100..101 " "
         BLOCK_EXPR@101..103
-          L_CURLY@101..102 "{"
-          R_CURLY@102..103 "}"
+          STMT_LIST@101..103
+            L_CURLY@101..102 "{"
+            R_CURLY@102..103 "}"
       WHITESPACE@103..108 "\n    "
       FN@108..125
         FN_KW@108..110 "fn"
@@ -116,8 +120,9 @@ SOURCE_FILE@0..128
           R_PAREN@121..122 ")"
         WHITESPACE@122..123 " "
         BLOCK_EXPR@123..125
-          L_CURLY@123..124 "{"
-          R_CURLY@124..125 "}"
+          STMT_LIST@123..125
+            L_CURLY@123..124 "{"
+            R_CURLY@124..125 "}"
       WHITESPACE@125..126 "\n"
       R_CURLY@126..127 "}"
   WHITESPACE@127..128 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0008_path_part.rast b/crates/syntax/test_data/parser/inline/ok/0008_path_part.rast
index 7d2f7eab05b..ff813071288 100644
--- a/crates/syntax/test_data/parser/inline/ok/0008_path_part.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0008_path_part.rast
@@ -9,88 +9,89 @@ SOURCE_FILE@0..103
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..102
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      LET_STMT@15..33
-        LET_KW@15..18 "let"
-        WHITESPACE@18..19 " "
-        PATH_PAT@19..27
-          PATH@19..27
-            PATH@19..22
-              PATH_SEGMENT@19..22
-                NAME_REF@19..22
-                  IDENT@19..22 "foo"
-            COLON2@22..24 "::"
-            PATH_SEGMENT@24..27
-              NAME_REF@24..27
-                IDENT@24..27 "Bar"
-        WHITESPACE@27..28 " "
-        EQ@28..29 "="
-        WHITESPACE@29..30 " "
-        TUPLE_EXPR@30..32
-          L_PAREN@30..31 "("
-          R_PAREN@31..32 ")"
-        SEMICOLON@32..33 ";"
-      WHITESPACE@33..38 "\n    "
-      LET_STMT@38..53
-        LET_KW@38..41 "let"
-        WHITESPACE@41..42 " "
-        PATH_PAT@42..47
-          PATH@42..47
-            PATH_SEGMENT@42..47
-              COLON2@42..44 "::"
-              NAME_REF@44..47
-                IDENT@44..47 "Bar"
-        WHITESPACE@47..48 " "
-        EQ@48..49 "="
-        WHITESPACE@49..50 " "
-        TUPLE_EXPR@50..52
-          L_PAREN@50..51 "("
-          R_PAREN@51..52 ")"
-        SEMICOLON@52..53 ";"
-      WHITESPACE@53..58 "\n    "
-      LET_STMT@58..78
-        LET_KW@58..61 "let"
-        WHITESPACE@61..62 " "
-        RECORD_PAT@62..72
-          PATH@62..65
-            PATH_SEGMENT@62..65
-              NAME_REF@62..65
-                IDENT@62..65 "Bar"
-          WHITESPACE@65..66 " "
-          RECORD_PAT_FIELD_LIST@66..72
-            L_CURLY@66..67 "{"
-            WHITESPACE@67..68 " "
-            DOT2@68..70 ".."
-            WHITESPACE@70..71 " "
-            R_CURLY@71..72 "}"
-        WHITESPACE@72..73 " "
-        EQ@73..74 "="
-        WHITESPACE@74..75 " "
-        TUPLE_EXPR@75..77
-          L_PAREN@75..76 "("
-          R_PAREN@76..77 ")"
-        SEMICOLON@77..78 ";"
-      WHITESPACE@78..83 "\n    "
-      LET_STMT@83..100
-        LET_KW@83..86 "let"
-        WHITESPACE@86..87 " "
-        TUPLE_STRUCT_PAT@87..94
-          PATH@87..90
-            PATH_SEGMENT@87..90
-              NAME_REF@87..90
-                IDENT@87..90 "Bar"
-          L_PAREN@90..91 "("
-          REST_PAT@91..93
-            DOT2@91..93 ".."
-          R_PAREN@93..94 ")"
-        WHITESPACE@94..95 " "
-        EQ@95..96 "="
-        WHITESPACE@96..97 " "
-        TUPLE_EXPR@97..99
-          L_PAREN@97..98 "("
-          R_PAREN@98..99 ")"
-        SEMICOLON@99..100 ";"
-      WHITESPACE@100..101 "\n"
-      R_CURLY@101..102 "}"
+      STMT_LIST@9..102
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        LET_STMT@15..33
+          LET_KW@15..18 "let"
+          WHITESPACE@18..19 " "
+          PATH_PAT@19..27
+            PATH@19..27
+              PATH@19..22
+                PATH_SEGMENT@19..22
+                  NAME_REF@19..22
+                    IDENT@19..22 "foo"
+              COLON2@22..24 "::"
+              PATH_SEGMENT@24..27
+                NAME_REF@24..27
+                  IDENT@24..27 "Bar"
+          WHITESPACE@27..28 " "
+          EQ@28..29 "="
+          WHITESPACE@29..30 " "
+          TUPLE_EXPR@30..32
+            L_PAREN@30..31 "("
+            R_PAREN@31..32 ")"
+          SEMICOLON@32..33 ";"
+        WHITESPACE@33..38 "\n    "
+        LET_STMT@38..53
+          LET_KW@38..41 "let"
+          WHITESPACE@41..42 " "
+          PATH_PAT@42..47
+            PATH@42..47
+              PATH_SEGMENT@42..47
+                COLON2@42..44 "::"
+                NAME_REF@44..47
+                  IDENT@44..47 "Bar"
+          WHITESPACE@47..48 " "
+          EQ@48..49 "="
+          WHITESPACE@49..50 " "
+          TUPLE_EXPR@50..52
+            L_PAREN@50..51 "("
+            R_PAREN@51..52 ")"
+          SEMICOLON@52..53 ";"
+        WHITESPACE@53..58 "\n    "
+        LET_STMT@58..78
+          LET_KW@58..61 "let"
+          WHITESPACE@61..62 " "
+          RECORD_PAT@62..72
+            PATH@62..65
+              PATH_SEGMENT@62..65
+                NAME_REF@62..65
+                  IDENT@62..65 "Bar"
+            WHITESPACE@65..66 " "
+            RECORD_PAT_FIELD_LIST@66..72
+              L_CURLY@66..67 "{"
+              WHITESPACE@67..68 " "
+              DOT2@68..70 ".."
+              WHITESPACE@70..71 " "
+              R_CURLY@71..72 "}"
+          WHITESPACE@72..73 " "
+          EQ@73..74 "="
+          WHITESPACE@74..75 " "
+          TUPLE_EXPR@75..77
+            L_PAREN@75..76 "("
+            R_PAREN@76..77 ")"
+          SEMICOLON@77..78 ";"
+        WHITESPACE@78..83 "\n    "
+        LET_STMT@83..100
+          LET_KW@83..86 "let"
+          WHITESPACE@86..87 " "
+          TUPLE_STRUCT_PAT@87..94
+            PATH@87..90
+              PATH_SEGMENT@87..90
+                NAME_REF@87..90
+                  IDENT@87..90 "Bar"
+            L_PAREN@90..91 "("
+            REST_PAT@91..93
+              DOT2@91..93 ".."
+            R_PAREN@93..94 ")"
+          WHITESPACE@94..95 " "
+          EQ@95..96 "="
+          WHITESPACE@96..97 " "
+          TUPLE_EXPR@97..99
+            L_PAREN@97..98 "("
+            R_PAREN@98..99 ")"
+          SEMICOLON@99..100 ";"
+        WHITESPACE@100..101 "\n"
+        R_CURLY@101..102 "}"
   WHITESPACE@102..103 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0009_loop_expr.rast b/crates/syntax/test_data/parser/inline/ok/0009_loop_expr.rast
index f62826fd55d..0e2ddb9f2f4 100644
--- a/crates/syntax/test_data/parser/inline/ok/0009_loop_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0009_loop_expr.rast
@@ -9,16 +9,18 @@ SOURCE_FILE@0..26
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..25
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..23
-        LOOP_EXPR@15..22
-          LOOP_KW@15..19 "loop"
-          WHITESPACE@19..20 " "
-          BLOCK_EXPR@20..22
-            L_CURLY@20..21 "{"
-            R_CURLY@21..22 "}"
-        SEMICOLON@22..23 ";"
-      WHITESPACE@23..24 "\n"
-      R_CURLY@24..25 "}"
+      STMT_LIST@9..25
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..23
+          LOOP_EXPR@15..22
+            LOOP_KW@15..19 "loop"
+            WHITESPACE@19..20 " "
+            BLOCK_EXPR@20..22
+              STMT_LIST@20..22
+                L_CURLY@20..21 "{"
+                R_CURLY@21..22 "}"
+          SEMICOLON@22..23 ";"
+        WHITESPACE@23..24 "\n"
+        R_CURLY@24..25 "}"
   WHITESPACE@25..26 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0011_field_expr.rast b/crates/syntax/test_data/parser/inline/ok/0011_field_expr.rast
index 66a609346ae..9475e3e2179 100644
--- a/crates/syntax/test_data/parser/inline/ok/0011_field_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0011_field_expr.rast
@@ -9,51 +9,52 @@ SOURCE_FILE@0..48
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..47
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..21
-        FIELD_EXPR@15..20
-          PATH_EXPR@15..16
-            PATH@15..16
-              PATH_SEGMENT@15..16
-                NAME_REF@15..16
-                  IDENT@15..16 "x"
-          DOT@16..17 "."
-          NAME_REF@17..20
-            IDENT@17..20 "foo"
-        SEMICOLON@20..21 ";"
-      WHITESPACE@21..26 "\n    "
-      EXPR_STMT@26..34
-        FIELD_EXPR@26..33
-          FIELD_EXPR@26..29
-            PATH_EXPR@26..27
-              PATH@26..27
-                PATH_SEGMENT@26..27
-                  NAME_REF@26..27
-                    IDENT@26..27 "x"
-            DOT@27..28 "."
-            NAME_REF@28..29
-              INT_NUMBER@28..29 "0"
-          DOT@29..30 "."
-          NAME_REF@30..33
-            IDENT@30..33 "bar"
-        SEMICOLON@33..34 ";"
-      WHITESPACE@34..39 "\n    "
-      EXPR_STMT@39..45
-        CALL_EXPR@39..44
-          FIELD_EXPR@39..42
-            PATH_EXPR@39..40
-              PATH@39..40
-                PATH_SEGMENT@39..40
-                  NAME_REF@39..40
-                    IDENT@39..40 "x"
-            DOT@40..41 "."
-            NAME_REF@41..42
-              INT_NUMBER@41..42 "0"
-          ARG_LIST@42..44
-            L_PAREN@42..43 "("
-            R_PAREN@43..44 ")"
-        SEMICOLON@44..45 ";"
-      WHITESPACE@45..46 "\n"
-      R_CURLY@46..47 "}"
+      STMT_LIST@9..47
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..21
+          FIELD_EXPR@15..20
+            PATH_EXPR@15..16
+              PATH@15..16
+                PATH_SEGMENT@15..16
+                  NAME_REF@15..16
+                    IDENT@15..16 "x"
+            DOT@16..17 "."
+            NAME_REF@17..20
+              IDENT@17..20 "foo"
+          SEMICOLON@20..21 ";"
+        WHITESPACE@21..26 "\n    "
+        EXPR_STMT@26..34
+          FIELD_EXPR@26..33
+            FIELD_EXPR@26..29
+              PATH_EXPR@26..27
+                PATH@26..27
+                  PATH_SEGMENT@26..27
+                    NAME_REF@26..27
+                      IDENT@26..27 "x"
+              DOT@27..28 "."
+              NAME_REF@28..29
+                INT_NUMBER@28..29 "0"
+            DOT@29..30 "."
+            NAME_REF@30..33
+              IDENT@30..33 "bar"
+          SEMICOLON@33..34 ";"
+        WHITESPACE@34..39 "\n    "
+        EXPR_STMT@39..45
+          CALL_EXPR@39..44
+            FIELD_EXPR@39..42
+              PATH_EXPR@39..40
+                PATH@39..40
+                  PATH_SEGMENT@39..40
+                    NAME_REF@39..40
+                      IDENT@39..40 "x"
+              DOT@40..41 "."
+              NAME_REF@41..42
+                INT_NUMBER@41..42 "0"
+            ARG_LIST@42..44
+              L_PAREN@42..43 "("
+              R_PAREN@43..44 ")"
+          SEMICOLON@44..45 ";"
+        WHITESPACE@45..46 "\n"
+        R_CURLY@46..47 "}"
   WHITESPACE@47..48 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0015_continue_expr.rast b/crates/syntax/test_data/parser/inline/ok/0015_continue_expr.rast
index b67ea2682c5..81c916fe1ed 100644
--- a/crates/syntax/test_data/parser/inline/ok/0015_continue_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0015_continue_expr.rast
@@ -9,28 +9,30 @@ SOURCE_FILE@0..69
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..68
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      LOOP_EXPR@15..66
-        LOOP_KW@15..19 "loop"
-        WHITESPACE@19..20 " "
-        BLOCK_EXPR@20..66
-          L_CURLY@20..21 "{"
-          WHITESPACE@21..30 "\n        "
-          EXPR_STMT@30..39
-            CONTINUE_EXPR@30..38
-              CONTINUE_KW@30..38 "continue"
-            SEMICOLON@38..39 ";"
-          WHITESPACE@39..48 "\n        "
-          EXPR_STMT@48..60
-            CONTINUE_EXPR@48..59
-              CONTINUE_KW@48..56 "continue"
-              WHITESPACE@56..57 " "
-              LIFETIME@57..59
-                LIFETIME_IDENT@57..59 "'l"
-            SEMICOLON@59..60 ";"
-          WHITESPACE@60..65 "\n    "
-          R_CURLY@65..66 "}"
-      WHITESPACE@66..67 "\n"
-      R_CURLY@67..68 "}"
+      STMT_LIST@9..68
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        LOOP_EXPR@15..66
+          LOOP_KW@15..19 "loop"
+          WHITESPACE@19..20 " "
+          BLOCK_EXPR@20..66
+            STMT_LIST@20..66
+              L_CURLY@20..21 "{"
+              WHITESPACE@21..30 "\n        "
+              EXPR_STMT@30..39
+                CONTINUE_EXPR@30..38
+                  CONTINUE_KW@30..38 "continue"
+                SEMICOLON@38..39 ";"
+              WHITESPACE@39..48 "\n        "
+              EXPR_STMT@48..60
+                CONTINUE_EXPR@48..59
+                  CONTINUE_KW@48..56 "continue"
+                  WHITESPACE@56..57 " "
+                  LIFETIME@57..59
+                    LIFETIME_IDENT@57..59 "'l"
+                SEMICOLON@59..60 ";"
+              WHITESPACE@60..65 "\n    "
+              R_CURLY@65..66 "}"
+        WHITESPACE@66..67 "\n"
+        R_CURLY@67..68 "}"
   WHITESPACE@68..69 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0018_arb_self_types.rast b/crates/syntax/test_data/parser/inline/ok/0018_arb_self_types.rast
index df59f37a251..48b11844cdd 100644
--- a/crates/syntax/test_data/parser/inline/ok/0018_arb_self_types.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0018_arb_self_types.rast
@@ -33,8 +33,9 @@ SOURCE_FILE@0..69
           R_PAREN@29..30 ")"
         WHITESPACE@30..31 " "
         BLOCK_EXPR@31..33
-          L_CURLY@31..32 "{"
-          R_CURLY@32..33 "}"
+          STMT_LIST@31..33
+            L_CURLY@31..32 "{"
+            R_CURLY@32..33 "}"
       WHITESPACE@33..38 "\n    "
       FN@38..66
         FN_KW@38..40 "fn"
@@ -67,8 +68,9 @@ SOURCE_FILE@0..69
           R_PAREN@62..63 ")"
         WHITESPACE@63..64 " "
         BLOCK_EXPR@64..66
-          L_CURLY@64..65 "{"
-          R_CURLY@65..66 "}"
+          STMT_LIST@64..66
+            L_CURLY@64..65 "{"
+            R_CURLY@65..66 "}"
       WHITESPACE@66..67 "\n"
       R_CURLY@67..68 "}"
   WHITESPACE@68..69 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0019_unary_expr.rast b/crates/syntax/test_data/parser/inline/ok/0019_unary_expr.rast
index 7db38ea4da5..8a67c60e79a 100644
--- a/crates/syntax/test_data/parser/inline/ok/0019_unary_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0019_unary_expr.rast
@@ -9,36 +9,37 @@ SOURCE_FILE@0..44
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..43
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..20
-        PREFIX_EXPR@15..19
-          STAR@15..16 "*"
-          PREFIX_EXPR@16..19
-            STAR@16..17 "*"
-            REF_EXPR@17..19
-              AMP@17..18 "&"
-              LITERAL@18..19
-                INT_NUMBER@18..19 "1"
-        SEMICOLON@19..20 ";"
-      WHITESPACE@20..25 "\n    "
-      EXPR_STMT@25..32
-        PREFIX_EXPR@25..31
-          BANG@25..26 "!"
-          PREFIX_EXPR@26..31
-            BANG@26..27 "!"
-            LITERAL@27..31
-              TRUE_KW@27..31 "true"
-        SEMICOLON@31..32 ";"
-      WHITESPACE@32..37 "\n    "
-      EXPR_STMT@37..41
-        PREFIX_EXPR@37..40
-          MINUS@37..38 "-"
-          PREFIX_EXPR@38..40
-            MINUS@38..39 "-"
-            LITERAL@39..40
-              INT_NUMBER@39..40 "1"
-        SEMICOLON@40..41 ";"
-      WHITESPACE@41..42 "\n"
-      R_CURLY@42..43 "}"
+      STMT_LIST@9..43
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..20
+          PREFIX_EXPR@15..19
+            STAR@15..16 "*"
+            PREFIX_EXPR@16..19
+              STAR@16..17 "*"
+              REF_EXPR@17..19
+                AMP@17..18 "&"
+                LITERAL@18..19
+                  INT_NUMBER@18..19 "1"
+          SEMICOLON@19..20 ";"
+        WHITESPACE@20..25 "\n    "
+        EXPR_STMT@25..32
+          PREFIX_EXPR@25..31
+            BANG@25..26 "!"
+            PREFIX_EXPR@26..31
+              BANG@26..27 "!"
+              LITERAL@27..31
+                TRUE_KW@27..31 "true"
+          SEMICOLON@31..32 ";"
+        WHITESPACE@32..37 "\n    "
+        EXPR_STMT@37..41
+          PREFIX_EXPR@37..40
+            MINUS@37..38 "-"
+            PREFIX_EXPR@38..40
+              MINUS@38..39 "-"
+              LITERAL@39..40
+                INT_NUMBER@39..40 "1"
+          SEMICOLON@40..41 ";"
+        WHITESPACE@41..42 "\n"
+        R_CURLY@42..43 "}"
   WHITESPACE@43..44 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0021_assoc_item_list.rast b/crates/syntax/test_data/parser/inline/ok/0021_assoc_item_list.rast
index dc7f6295b22..d57e315a340 100644
--- a/crates/syntax/test_data/parser/inline/ok/0021_assoc_item_list.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0021_assoc_item_list.rast
@@ -55,8 +55,9 @@ SOURCE_FILE@0..89
           R_PAREN@61..62 ")"
         WHITESPACE@62..63 " "
         BLOCK_EXPR@63..65
-          L_CURLY@63..64 "{"
-          R_CURLY@64..65 "}"
+          STMT_LIST@63..65
+            L_CURLY@63..64 "{"
+            R_CURLY@64..65 "}"
       WHITESPACE@65..70 "\n    "
       FN@70..86
         FN_KW@70..72 "fn"
@@ -72,8 +73,9 @@ SOURCE_FILE@0..89
           R_PAREN@82..83 ")"
         WHITESPACE@83..84 " "
         BLOCK_EXPR@84..86
-          L_CURLY@84..85 "{"
-          R_CURLY@85..86 "}"
+          STMT_LIST@84..86
+            L_CURLY@84..85 "{"
+            R_CURLY@85..86 "}"
       WHITESPACE@86..87 "\n"
       R_CURLY@87..88 "}"
   WHITESPACE@88..89 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0024_slice_pat.rast b/crates/syntax/test_data/parser/inline/ok/0024_slice_pat.rast
index 2dbce34b61e..970260df818 100644
--- a/crates/syntax/test_data/parser/inline/ok/0024_slice_pat.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0024_slice_pat.rast
@@ -9,33 +9,34 @@ SOURCE_FILE@0..39
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..38
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      LET_STMT@16..36
-        LET_KW@16..19 "let"
-        WHITESPACE@19..20 " "
-        SLICE_PAT@20..30
-          L_BRACK@20..21 "["
-          IDENT_PAT@21..22
-            NAME@21..22
-              IDENT@21..22 "a"
-          COMMA@22..23 ","
-          WHITESPACE@23..24 " "
-          IDENT_PAT@24..25
-            NAME@24..25
-              IDENT@24..25 "b"
-          COMMA@25..26 ","
-          WHITESPACE@26..27 " "
-          REST_PAT@27..29
-            DOT2@27..29 ".."
-          R_BRACK@29..30 "]"
-        WHITESPACE@30..31 " "
-        EQ@31..32 "="
-        WHITESPACE@32..33 " "
-        ARRAY_EXPR@33..35
-          L_BRACK@33..34 "["
-          R_BRACK@34..35 "]"
-        SEMICOLON@35..36 ";"
-      WHITESPACE@36..37 "\n"
-      R_CURLY@37..38 "}"
+      STMT_LIST@10..38
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        LET_STMT@16..36
+          LET_KW@16..19 "let"
+          WHITESPACE@19..20 " "
+          SLICE_PAT@20..30
+            L_BRACK@20..21 "["
+            IDENT_PAT@21..22
+              NAME@21..22
+                IDENT@21..22 "a"
+            COMMA@22..23 ","
+            WHITESPACE@23..24 " "
+            IDENT_PAT@24..25
+              NAME@24..25
+                IDENT@24..25 "b"
+            COMMA@25..26 ","
+            WHITESPACE@26..27 " "
+            REST_PAT@27..29
+              DOT2@27..29 ".."
+            R_BRACK@29..30 "]"
+          WHITESPACE@30..31 " "
+          EQ@31..32 "="
+          WHITESPACE@32..33 " "
+          ARRAY_EXPR@33..35
+            L_BRACK@33..34 "["
+            R_BRACK@34..35 "]"
+          SEMICOLON@35..36 ";"
+        WHITESPACE@36..37 "\n"
+        R_CURLY@37..38 "}"
   WHITESPACE@38..39 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0026_tuple_pat_fields.rast b/crates/syntax/test_data/parser/inline/ok/0026_tuple_pat_fields.rast
index 467a3013469..d1be7e6e0a7 100644
--- a/crates/syntax/test_data/parser/inline/ok/0026_tuple_pat_fields.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0026_tuple_pat_fields.rast
@@ -9,96 +9,97 @@ SOURCE_FILE@0..97
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..96
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      LET_STMT@15..28
-        LET_KW@15..18 "let"
-        WHITESPACE@18..19 " "
-        TUPLE_STRUCT_PAT@19..22
-          PATH@19..20
-            PATH_SEGMENT@19..20
-              NAME_REF@19..20
-                IDENT@19..20 "S"
-          L_PAREN@20..21 "("
-          R_PAREN@21..22 ")"
-        WHITESPACE@22..23 " "
-        EQ@23..24 "="
-        WHITESPACE@24..25 " "
-        TUPLE_EXPR@25..27
-          L_PAREN@25..26 "("
-          R_PAREN@26..27 ")"
-        SEMICOLON@27..28 ";"
-      WHITESPACE@28..33 "\n    "
-      LET_STMT@33..47
-        LET_KW@33..36 "let"
-        WHITESPACE@36..37 " "
-        TUPLE_STRUCT_PAT@37..41
-          PATH@37..38
-            PATH_SEGMENT@37..38
-              NAME_REF@37..38
-                IDENT@37..38 "S"
-          L_PAREN@38..39 "("
-          WILDCARD_PAT@39..40
-            UNDERSCORE@39..40 "_"
-          R_PAREN@40..41 ")"
-        WHITESPACE@41..42 " "
-        EQ@42..43 "="
-        WHITESPACE@43..44 " "
-        TUPLE_EXPR@44..46
-          L_PAREN@44..45 "("
-          R_PAREN@45..46 ")"
-        SEMICOLON@46..47 ";"
-      WHITESPACE@47..52 "\n    "
-      LET_STMT@52..67
-        LET_KW@52..55 "let"
-        WHITESPACE@55..56 " "
-        TUPLE_STRUCT_PAT@56..61
-          PATH@56..57
-            PATH_SEGMENT@56..57
-              NAME_REF@56..57
-                IDENT@56..57 "S"
-          L_PAREN@57..58 "("
-          WILDCARD_PAT@58..59
-            UNDERSCORE@58..59 "_"
-          COMMA@59..60 ","
-          R_PAREN@60..61 ")"
-        WHITESPACE@61..62 " "
-        EQ@62..63 "="
-        WHITESPACE@63..64 " "
-        TUPLE_EXPR@64..66
-          L_PAREN@64..65 "("
-          R_PAREN@65..66 ")"
-        SEMICOLON@66..67 ";"
-      WHITESPACE@67..72 "\n    "
-      LET_STMT@72..94
-        LET_KW@72..75 "let"
-        WHITESPACE@75..76 " "
-        TUPLE_STRUCT_PAT@76..88
-          PATH@76..77
-            PATH_SEGMENT@76..77
-              NAME_REF@76..77
-                IDENT@76..77 "S"
-          L_PAREN@77..78 "("
-          WILDCARD_PAT@78..79
-            UNDERSCORE@78..79 "_"
-          COMMA@79..80 ","
-          WHITESPACE@80..81 " "
-          REST_PAT@81..83
-            DOT2@81..83 ".."
-          WHITESPACE@83..84 " "
-          COMMA@84..85 ","
-          WHITESPACE@85..86 " "
-          IDENT_PAT@86..87
-            NAME@86..87
-              IDENT@86..87 "x"
-          R_PAREN@87..88 ")"
-        WHITESPACE@88..89 " "
-        EQ@89..90 "="
-        WHITESPACE@90..91 " "
-        TUPLE_EXPR@91..93
-          L_PAREN@91..92 "("
-          R_PAREN@92..93 ")"
-        SEMICOLON@93..94 ";"
-      WHITESPACE@94..95 "\n"
-      R_CURLY@95..96 "}"
+      STMT_LIST@9..96
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        LET_STMT@15..28
+          LET_KW@15..18 "let"
+          WHITESPACE@18..19 " "
+          TUPLE_STRUCT_PAT@19..22
+            PATH@19..20
+              PATH_SEGMENT@19..20
+                NAME_REF@19..20
+                  IDENT@19..20 "S"
+            L_PAREN@20..21 "("
+            R_PAREN@21..22 ")"
+          WHITESPACE@22..23 " "
+          EQ@23..24 "="
+          WHITESPACE@24..25 " "
+          TUPLE_EXPR@25..27
+            L_PAREN@25..26 "("
+            R_PAREN@26..27 ")"
+          SEMICOLON@27..28 ";"
+        WHITESPACE@28..33 "\n    "
+        LET_STMT@33..47
+          LET_KW@33..36 "let"
+          WHITESPACE@36..37 " "
+          TUPLE_STRUCT_PAT@37..41
+            PATH@37..38
+              PATH_SEGMENT@37..38
+                NAME_REF@37..38
+                  IDENT@37..38 "S"
+            L_PAREN@38..39 "("
+            WILDCARD_PAT@39..40
+              UNDERSCORE@39..40 "_"
+            R_PAREN@40..41 ")"
+          WHITESPACE@41..42 " "
+          EQ@42..43 "="
+          WHITESPACE@43..44 " "
+          TUPLE_EXPR@44..46
+            L_PAREN@44..45 "("
+            R_PAREN@45..46 ")"
+          SEMICOLON@46..47 ";"
+        WHITESPACE@47..52 "\n    "
+        LET_STMT@52..67
+          LET_KW@52..55 "let"
+          WHITESPACE@55..56 " "
+          TUPLE_STRUCT_PAT@56..61
+            PATH@56..57
+              PATH_SEGMENT@56..57
+                NAME_REF@56..57
+                  IDENT@56..57 "S"
+            L_PAREN@57..58 "("
+            WILDCARD_PAT@58..59
+              UNDERSCORE@58..59 "_"
+            COMMA@59..60 ","
+            R_PAREN@60..61 ")"
+          WHITESPACE@61..62 " "
+          EQ@62..63 "="
+          WHITESPACE@63..64 " "
+          TUPLE_EXPR@64..66
+            L_PAREN@64..65 "("
+            R_PAREN@65..66 ")"
+          SEMICOLON@66..67 ";"
+        WHITESPACE@67..72 "\n    "
+        LET_STMT@72..94
+          LET_KW@72..75 "let"
+          WHITESPACE@75..76 " "
+          TUPLE_STRUCT_PAT@76..88
+            PATH@76..77
+              PATH_SEGMENT@76..77
+                NAME_REF@76..77
+                  IDENT@76..77 "S"
+            L_PAREN@77..78 "("
+            WILDCARD_PAT@78..79
+              UNDERSCORE@78..79 "_"
+            COMMA@79..80 ","
+            WHITESPACE@80..81 " "
+            REST_PAT@81..83
+              DOT2@81..83 ".."
+            WHITESPACE@83..84 " "
+            COMMA@84..85 ","
+            WHITESPACE@85..86 " "
+            IDENT_PAT@86..87
+              NAME@86..87
+                IDENT@86..87 "x"
+            R_PAREN@87..88 ")"
+          WHITESPACE@88..89 " "
+          EQ@89..90 "="
+          WHITESPACE@90..91 " "
+          TUPLE_EXPR@91..93
+            L_PAREN@91..92 "("
+            R_PAREN@92..93 ")"
+          SEMICOLON@93..94 ";"
+        WHITESPACE@94..95 "\n"
+        R_CURLY@95..96 "}"
   WHITESPACE@96..97 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0027_ref_pat.rast b/crates/syntax/test_data/parser/inline/ok/0027_ref_pat.rast
index 348b54dc9d8..ed47dc21ddc 100644
--- a/crates/syntax/test_data/parser/inline/ok/0027_ref_pat.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0027_ref_pat.rast
@@ -9,41 +9,42 @@ SOURCE_FILE@0..52
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..51
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      LET_STMT@16..28
-        LET_KW@16..19 "let"
-        WHITESPACE@19..20 " "
-        REF_PAT@20..22
-          AMP@20..21 "&"
-          IDENT_PAT@21..22
-            NAME@21..22
-              IDENT@21..22 "a"
-        WHITESPACE@22..23 " "
-        EQ@23..24 "="
-        WHITESPACE@24..25 " "
-        TUPLE_EXPR@25..27
-          L_PAREN@25..26 "("
-          R_PAREN@26..27 ")"
-        SEMICOLON@27..28 ";"
-      WHITESPACE@28..33 "\n    "
-      LET_STMT@33..49
-        LET_KW@33..36 "let"
-        WHITESPACE@36..37 " "
-        REF_PAT@37..43
-          AMP@37..38 "&"
-          MUT_KW@38..41 "mut"
-          WHITESPACE@41..42 " "
-          IDENT_PAT@42..43
-            NAME@42..43
-              IDENT@42..43 "b"
-        WHITESPACE@43..44 " "
-        EQ@44..45 "="
-        WHITESPACE@45..46 " "
-        TUPLE_EXPR@46..48
-          L_PAREN@46..47 "("
-          R_PAREN@47..48 ")"
-        SEMICOLON@48..49 ";"
-      WHITESPACE@49..50 "\n"
-      R_CURLY@50..51 "}"
+      STMT_LIST@10..51
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        LET_STMT@16..28
+          LET_KW@16..19 "let"
+          WHITESPACE@19..20 " "
+          REF_PAT@20..22
+            AMP@20..21 "&"
+            IDENT_PAT@21..22
+              NAME@21..22
+                IDENT@21..22 "a"
+          WHITESPACE@22..23 " "
+          EQ@23..24 "="
+          WHITESPACE@24..25 " "
+          TUPLE_EXPR@25..27
+            L_PAREN@25..26 "("
+            R_PAREN@26..27 ")"
+          SEMICOLON@27..28 ";"
+        WHITESPACE@28..33 "\n    "
+        LET_STMT@33..49
+          LET_KW@33..36 "let"
+          WHITESPACE@36..37 " "
+          REF_PAT@37..43
+            AMP@37..38 "&"
+            MUT_KW@38..41 "mut"
+            WHITESPACE@41..42 " "
+            IDENT_PAT@42..43
+              NAME@42..43
+                IDENT@42..43 "b"
+          WHITESPACE@43..44 " "
+          EQ@44..45 "="
+          WHITESPACE@45..46 " "
+          TUPLE_EXPR@46..48
+            L_PAREN@46..47 "("
+            R_PAREN@47..48 ")"
+          SEMICOLON@48..49 ";"
+        WHITESPACE@49..50 "\n"
+        R_CURLY@50..51 "}"
   WHITESPACE@51..52 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0029_cast_expr.rast b/crates/syntax/test_data/parser/inline/ok/0029_cast_expr.rast
index e096b3a1f64..5afd7bd8fe6 100644
--- a/crates/syntax/test_data/parser/inline/ok/0029_cast_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0029_cast_expr.rast
@@ -9,81 +9,82 @@ SOURCE_FILE@0..89
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..88
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..25
-        CAST_EXPR@15..24
-          LITERAL@15..17
-            INT_NUMBER@15..17 "82"
-          WHITESPACE@17..18 " "
-          AS_KW@18..20 "as"
-          WHITESPACE@20..21 " "
-          PATH_TYPE@21..24
-            PATH@21..24
-              PATH_SEGMENT@21..24
-                NAME_REF@21..24
-                  IDENT@21..24 "i32"
-        SEMICOLON@24..25 ";"
-      WHITESPACE@25..30 "\n    "
-      EXPR_STMT@30..43
-        BIN_EXPR@30..42
-          CAST_EXPR@30..38
-            LITERAL@30..32
-              INT_NUMBER@30..32 "81"
-            WHITESPACE@32..33 " "
-            AS_KW@33..35 "as"
-            WHITESPACE@35..36 " "
-            PATH_TYPE@36..38
-              PATH@36..38
-                PATH_SEGMENT@36..38
-                  NAME_REF@36..38
-                    IDENT@36..38 "i8"
-          WHITESPACE@38..39 " "
-          PLUS@39..40 "+"
-          WHITESPACE@40..41 " "
-          LITERAL@41..42
-            INT_NUMBER@41..42 "1"
-        SEMICOLON@42..43 ";"
-      WHITESPACE@43..48 "\n    "
-      EXPR_STMT@48..62
-        BIN_EXPR@48..61
-          CAST_EXPR@48..57
-            LITERAL@48..50
-              INT_NUMBER@48..50 "79"
-            WHITESPACE@50..51 " "
-            AS_KW@51..53 "as"
-            WHITESPACE@53..54 " "
-            PATH_TYPE@54..57
-              PATH@54..57
-                PATH_SEGMENT@54..57
-                  NAME_REF@54..57
-                    IDENT@54..57 "i16"
-          WHITESPACE@57..58 " "
-          MINUS@58..59 "-"
-          WHITESPACE@59..60 " "
-          LITERAL@60..61
-            INT_NUMBER@60..61 "1"
-        SEMICOLON@61..62 ";"
-      WHITESPACE@62..67 "\n    "
-      EXPR_STMT@67..86
-        BIN_EXPR@67..85
-          CAST_EXPR@67..77
-            LITERAL@67..71
-              INT_NUMBER@67..71 "0x36"
-            WHITESPACE@71..72 " "
-            AS_KW@72..74 "as"
-            WHITESPACE@74..75 " "
-            PATH_TYPE@75..77
-              PATH@75..77
-                PATH_SEGMENT@75..77
-                  NAME_REF@75..77
-                    IDENT@75..77 "u8"
-          WHITESPACE@77..78 " "
-          LTEQ@78..80 "<="
-          WHITESPACE@80..81 " "
-          LITERAL@81..85
-            INT_NUMBER@81..85 "0x37"
-        SEMICOLON@85..86 ";"
-      WHITESPACE@86..87 "\n"
-      R_CURLY@87..88 "}"
+      STMT_LIST@9..88
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..25
+          CAST_EXPR@15..24
+            LITERAL@15..17
+              INT_NUMBER@15..17 "82"
+            WHITESPACE@17..18 " "
+            AS_KW@18..20 "as"
+            WHITESPACE@20..21 " "
+            PATH_TYPE@21..24
+              PATH@21..24
+                PATH_SEGMENT@21..24
+                  NAME_REF@21..24
+                    IDENT@21..24 "i32"
+          SEMICOLON@24..25 ";"
+        WHITESPACE@25..30 "\n    "
+        EXPR_STMT@30..43
+          BIN_EXPR@30..42
+            CAST_EXPR@30..38
+              LITERAL@30..32
+                INT_NUMBER@30..32 "81"
+              WHITESPACE@32..33 " "
+              AS_KW@33..35 "as"
+              WHITESPACE@35..36 " "
+              PATH_TYPE@36..38
+                PATH@36..38
+                  PATH_SEGMENT@36..38
+                    NAME_REF@36..38
+                      IDENT@36..38 "i8"
+            WHITESPACE@38..39 " "
+            PLUS@39..40 "+"
+            WHITESPACE@40..41 " "
+            LITERAL@41..42
+              INT_NUMBER@41..42 "1"
+          SEMICOLON@42..43 ";"
+        WHITESPACE@43..48 "\n    "
+        EXPR_STMT@48..62
+          BIN_EXPR@48..61
+            CAST_EXPR@48..57
+              LITERAL@48..50
+                INT_NUMBER@48..50 "79"
+              WHITESPACE@50..51 " "
+              AS_KW@51..53 "as"
+              WHITESPACE@53..54 " "
+              PATH_TYPE@54..57
+                PATH@54..57
+                  PATH_SEGMENT@54..57
+                    NAME_REF@54..57
+                      IDENT@54..57 "i16"
+            WHITESPACE@57..58 " "
+            MINUS@58..59 "-"
+            WHITESPACE@59..60 " "
+            LITERAL@60..61
+              INT_NUMBER@60..61 "1"
+          SEMICOLON@61..62 ";"
+        WHITESPACE@62..67 "\n    "
+        EXPR_STMT@67..86
+          BIN_EXPR@67..85
+            CAST_EXPR@67..77
+              LITERAL@67..71
+                INT_NUMBER@67..71 "0x36"
+              WHITESPACE@71..72 " "
+              AS_KW@72..74 "as"
+              WHITESPACE@74..75 " "
+              PATH_TYPE@75..77
+                PATH@75..77
+                  PATH_SEGMENT@75..77
+                    NAME_REF@75..77
+                      IDENT@75..77 "u8"
+            WHITESPACE@77..78 " "
+            LTEQ@78..80 "<="
+            WHITESPACE@80..81 " "
+            LITERAL@81..85
+              INT_NUMBER@81..85 "0x37"
+          SEMICOLON@85..86 ";"
+        WHITESPACE@86..87 "\n"
+        R_CURLY@87..88 "}"
   WHITESPACE@88..89 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0030_cond.rast b/crates/syntax/test_data/parser/inline/ok/0030_cond.rast
index 58a97d3ad89..3aa330f55d1 100644
--- a/crates/syntax/test_data/parser/inline/ok/0030_cond.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0030_cond.rast
@@ -9,37 +9,39 @@ SOURCE_FILE@0..197
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..37
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..11 " "
-      IF_EXPR@11..35
-        IF_KW@11..13 "if"
-        WHITESPACE@13..14 " "
-        CONDITION@14..32
-          LET_KW@14..17 "let"
-          WHITESPACE@17..18 " "
-          TUPLE_STRUCT_PAT@18..25
-            PATH@18..22
-              PATH_SEGMENT@18..22
-                NAME_REF@18..22
-                  IDENT@18..22 "Some"
-            L_PAREN@22..23 "("
-            WILDCARD_PAT@23..24
-              UNDERSCORE@23..24 "_"
-            R_PAREN@24..25 ")"
-          WHITESPACE@25..26 " "
-          EQ@26..27 "="
-          WHITESPACE@27..28 " "
-          PATH_EXPR@28..32
-            PATH@28..32
-              PATH_SEGMENT@28..32
-                NAME_REF@28..32
-                  IDENT@28..32 "None"
-        WHITESPACE@32..33 " "
-        BLOCK_EXPR@33..35
-          L_CURLY@33..34 "{"
-          R_CURLY@34..35 "}"
-      WHITESPACE@35..36 " "
-      R_CURLY@36..37 "}"
+      STMT_LIST@9..37
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..11 " "
+        IF_EXPR@11..35
+          IF_KW@11..13 "if"
+          WHITESPACE@13..14 " "
+          CONDITION@14..32
+            LET_KW@14..17 "let"
+            WHITESPACE@17..18 " "
+            TUPLE_STRUCT_PAT@18..25
+              PATH@18..22
+                PATH_SEGMENT@18..22
+                  NAME_REF@18..22
+                    IDENT@18..22 "Some"
+              L_PAREN@22..23 "("
+              WILDCARD_PAT@23..24
+                UNDERSCORE@23..24 "_"
+              R_PAREN@24..25 ")"
+            WHITESPACE@25..26 " "
+            EQ@26..27 "="
+            WHITESPACE@27..28 " "
+            PATH_EXPR@28..32
+              PATH@28..32
+                PATH_SEGMENT@28..32
+                  NAME_REF@28..32
+                    IDENT@28..32 "None"
+          WHITESPACE@32..33 " "
+          BLOCK_EXPR@33..35
+            STMT_LIST@33..35
+              L_CURLY@33..34 "{"
+              R_CURLY@34..35 "}"
+        WHITESPACE@35..36 " "
+        R_CURLY@36..37 "}"
   WHITESPACE@37..38 "\n"
   FN@38..196
     FN_KW@38..40 "fn"
@@ -51,152 +53,157 @@ SOURCE_FILE@0..197
       R_PAREN@45..46 ")"
     WHITESPACE@46..47 " "
     BLOCK_EXPR@47..196
-      L_CURLY@47..48 "{"
-      WHITESPACE@48..53 "\n    "
-      EXPR_STMT@53..87
-        IF_EXPR@53..87
-          IF_KW@53..55 "if"
-          WHITESPACE@55..56 " "
-          CONDITION@56..84
-            LET_KW@56..59 "let"
-            WHITESPACE@59..60 " "
-            OR_PAT@60..77
-              TUPLE_STRUCT_PAT@60..67
-                PATH@60..64
-                  PATH_SEGMENT@60..64
-                    NAME_REF@60..64
-                      IDENT@60..64 "Some"
-                L_PAREN@64..65 "("
-                WILDCARD_PAT@65..66
-                  UNDERSCORE@65..66 "_"
-                R_PAREN@66..67 ")"
-              WHITESPACE@67..68 " "
-              PIPE@68..69 "|"
-              WHITESPACE@69..70 " "
-              TUPLE_STRUCT_PAT@70..77
-                PATH@70..74
-                  PATH_SEGMENT@70..74
-                    NAME_REF@70..74
-                      IDENT@70..74 "Some"
-                L_PAREN@74..75 "("
-                WILDCARD_PAT@75..76
-                  UNDERSCORE@75..76 "_"
-                R_PAREN@76..77 ")"
-            WHITESPACE@77..78 " "
-            EQ@78..79 "="
-            WHITESPACE@79..80 " "
-            PATH_EXPR@80..84
-              PATH@80..84
-                PATH_SEGMENT@80..84
-                  NAME_REF@80..84
-                    IDENT@80..84 "None"
-          WHITESPACE@84..85 " "
-          BLOCK_EXPR@85..87
-            L_CURLY@85..86 "{"
-            R_CURLY@86..87 "}"
-      WHITESPACE@87..92 "\n    "
-      EXPR_STMT@92..118
-        IF_EXPR@92..118
-          IF_KW@92..94 "if"
-          WHITESPACE@94..95 " "
-          CONDITION@95..115
-            LET_KW@95..98 "let"
-            WHITESPACE@98..99 " "
-            PIPE@99..100 "|"
-            WHITESPACE@100..101 " "
-            TUPLE_STRUCT_PAT@101..108
-              PATH@101..105
-                PATH_SEGMENT@101..105
-                  NAME_REF@101..105
-                    IDENT@101..105 "Some"
-              L_PAREN@105..106 "("
-              WILDCARD_PAT@106..107
-                UNDERSCORE@106..107 "_"
-              R_PAREN@107..108 ")"
-            WHITESPACE@108..109 " "
-            EQ@109..110 "="
-            WHITESPACE@110..111 " "
-            PATH_EXPR@111..115
-              PATH@111..115
-                PATH_SEGMENT@111..115
-                  NAME_REF@111..115
-                    IDENT@111..115 "None"
-          WHITESPACE@115..116 " "
-          BLOCK_EXPR@116..118
-            L_CURLY@116..117 "{"
-            R_CURLY@117..118 "}"
-      WHITESPACE@118..123 "\n    "
-      EXPR_STMT@123..160
-        WHILE_EXPR@123..160
-          WHILE_KW@123..128 "while"
-          WHITESPACE@128..129 " "
-          CONDITION@129..157
-            LET_KW@129..132 "let"
-            WHITESPACE@132..133 " "
-            OR_PAT@133..150
-              TUPLE_STRUCT_PAT@133..140
-                PATH@133..137
-                  PATH_SEGMENT@133..137
-                    NAME_REF@133..137
-                      IDENT@133..137 "Some"
-                L_PAREN@137..138 "("
-                WILDCARD_PAT@138..139
-                  UNDERSCORE@138..139 "_"
-                R_PAREN@139..140 ")"
-              WHITESPACE@140..141 " "
-              PIPE@141..142 "|"
-              WHITESPACE@142..143 " "
-              TUPLE_STRUCT_PAT@143..150
-                PATH@143..147
-                  PATH_SEGMENT@143..147
-                    NAME_REF@143..147
-                      IDENT@143..147 "Some"
-                L_PAREN@147..148 "("
-                WILDCARD_PAT@148..149
-                  UNDERSCORE@148..149 "_"
-                R_PAREN@149..150 ")"
-            WHITESPACE@150..151 " "
-            EQ@151..152 "="
-            WHITESPACE@152..153 " "
-            PATH_EXPR@153..157
-              PATH@153..157
-                PATH_SEGMENT@153..157
-                  NAME_REF@153..157
-                    IDENT@153..157 "None"
-          WHITESPACE@157..158 " "
-          BLOCK_EXPR@158..160
-            L_CURLY@158..159 "{"
-            R_CURLY@159..160 "}"
-      WHITESPACE@160..165 "\n    "
-      WHILE_EXPR@165..194
-        WHILE_KW@165..170 "while"
-        WHITESPACE@170..171 " "
-        CONDITION@171..191
-          LET_KW@171..174 "let"
-          WHITESPACE@174..175 " "
-          PIPE@175..176 "|"
-          WHITESPACE@176..177 " "
-          TUPLE_STRUCT_PAT@177..184
-            PATH@177..181
-              PATH_SEGMENT@177..181
-                NAME_REF@177..181
-                  IDENT@177..181 "Some"
-            L_PAREN@181..182 "("
-            WILDCARD_PAT@182..183
-              UNDERSCORE@182..183 "_"
-            R_PAREN@183..184 ")"
-          WHITESPACE@184..185 " "
-          EQ@185..186 "="
-          WHITESPACE@186..187 " "
-          PATH_EXPR@187..191
-            PATH@187..191
-              PATH_SEGMENT@187..191
-                NAME_REF@187..191
-                  IDENT@187..191 "None"
-        WHITESPACE@191..192 " "
-        BLOCK_EXPR@192..194
-          L_CURLY@192..193 "{"
-          R_CURLY@193..194 "}"
-      WHITESPACE@194..195 "\n"
-      R_CURLY@195..196 "}"
+      STMT_LIST@47..196
+        L_CURLY@47..48 "{"
+        WHITESPACE@48..53 "\n    "
+        EXPR_STMT@53..87
+          IF_EXPR@53..87
+            IF_KW@53..55 "if"
+            WHITESPACE@55..56 " "
+            CONDITION@56..84
+              LET_KW@56..59 "let"
+              WHITESPACE@59..60 " "
+              OR_PAT@60..77
+                TUPLE_STRUCT_PAT@60..67
+                  PATH@60..64
+                    PATH_SEGMENT@60..64
+                      NAME_REF@60..64
+                        IDENT@60..64 "Some"
+                  L_PAREN@64..65 "("
+                  WILDCARD_PAT@65..66
+                    UNDERSCORE@65..66 "_"
+                  R_PAREN@66..67 ")"
+                WHITESPACE@67..68 " "
+                PIPE@68..69 "|"
+                WHITESPACE@69..70 " "
+                TUPLE_STRUCT_PAT@70..77
+                  PATH@70..74
+                    PATH_SEGMENT@70..74
+                      NAME_REF@70..74
+                        IDENT@70..74 "Some"
+                  L_PAREN@74..75 "("
+                  WILDCARD_PAT@75..76
+                    UNDERSCORE@75..76 "_"
+                  R_PAREN@76..77 ")"
+              WHITESPACE@77..78 " "
+              EQ@78..79 "="
+              WHITESPACE@79..80 " "
+              PATH_EXPR@80..84
+                PATH@80..84
+                  PATH_SEGMENT@80..84
+                    NAME_REF@80..84
+                      IDENT@80..84 "None"
+            WHITESPACE@84..85 " "
+            BLOCK_EXPR@85..87
+              STMT_LIST@85..87
+                L_CURLY@85..86 "{"
+                R_CURLY@86..87 "}"
+        WHITESPACE@87..92 "\n    "
+        EXPR_STMT@92..118
+          IF_EXPR@92..118
+            IF_KW@92..94 "if"
+            WHITESPACE@94..95 " "
+            CONDITION@95..115
+              LET_KW@95..98 "let"
+              WHITESPACE@98..99 " "
+              PIPE@99..100 "|"
+              WHITESPACE@100..101 " "
+              TUPLE_STRUCT_PAT@101..108
+                PATH@101..105
+                  PATH_SEGMENT@101..105
+                    NAME_REF@101..105
+                      IDENT@101..105 "Some"
+                L_PAREN@105..106 "("
+                WILDCARD_PAT@106..107
+                  UNDERSCORE@106..107 "_"
+                R_PAREN@107..108 ")"
+              WHITESPACE@108..109 " "
+              EQ@109..110 "="
+              WHITESPACE@110..111 " "
+              PATH_EXPR@111..115
+                PATH@111..115
+                  PATH_SEGMENT@111..115
+                    NAME_REF@111..115
+                      IDENT@111..115 "None"
+            WHITESPACE@115..116 " "
+            BLOCK_EXPR@116..118
+              STMT_LIST@116..118
+                L_CURLY@116..117 "{"
+                R_CURLY@117..118 "}"
+        WHITESPACE@118..123 "\n    "
+        EXPR_STMT@123..160
+          WHILE_EXPR@123..160
+            WHILE_KW@123..128 "while"
+            WHITESPACE@128..129 " "
+            CONDITION@129..157
+              LET_KW@129..132 "let"
+              WHITESPACE@132..133 " "
+              OR_PAT@133..150
+                TUPLE_STRUCT_PAT@133..140
+                  PATH@133..137
+                    PATH_SEGMENT@133..137
+                      NAME_REF@133..137
+                        IDENT@133..137 "Some"
+                  L_PAREN@137..138 "("
+                  WILDCARD_PAT@138..139
+                    UNDERSCORE@138..139 "_"
+                  R_PAREN@139..140 ")"
+                WHITESPACE@140..141 " "
+                PIPE@141..142 "|"
+                WHITESPACE@142..143 " "
+                TUPLE_STRUCT_PAT@143..150
+                  PATH@143..147
+                    PATH_SEGMENT@143..147
+                      NAME_REF@143..147
+                        IDENT@143..147 "Some"
+                  L_PAREN@147..148 "("
+                  WILDCARD_PAT@148..149
+                    UNDERSCORE@148..149 "_"
+                  R_PAREN@149..150 ")"
+              WHITESPACE@150..151 " "
+              EQ@151..152 "="
+              WHITESPACE@152..153 " "
+              PATH_EXPR@153..157
+                PATH@153..157
+                  PATH_SEGMENT@153..157
+                    NAME_REF@153..157
+                      IDENT@153..157 "None"
+            WHITESPACE@157..158 " "
+            BLOCK_EXPR@158..160
+              STMT_LIST@158..160
+                L_CURLY@158..159 "{"
+                R_CURLY@159..160 "}"
+        WHITESPACE@160..165 "\n    "
+        WHILE_EXPR@165..194
+          WHILE_KW@165..170 "while"
+          WHITESPACE@170..171 " "
+          CONDITION@171..191
+            LET_KW@171..174 "let"
+            WHITESPACE@174..175 " "
+            PIPE@175..176 "|"
+            WHITESPACE@176..177 " "
+            TUPLE_STRUCT_PAT@177..184
+              PATH@177..181
+                PATH_SEGMENT@177..181
+                  NAME_REF@177..181
+                    IDENT@177..181 "Some"
+              L_PAREN@181..182 "("
+              WILDCARD_PAT@182..183
+                UNDERSCORE@182..183 "_"
+              R_PAREN@183..184 ")"
+            WHITESPACE@184..185 " "
+            EQ@185..186 "="
+            WHITESPACE@186..187 " "
+            PATH_EXPR@187..191
+              PATH@187..191
+                PATH_SEGMENT@187..191
+                  NAME_REF@187..191
+                    IDENT@187..191 "None"
+          WHITESPACE@191..192 " "
+          BLOCK_EXPR@192..194
+            STMT_LIST@192..194
+              L_CURLY@192..193 "{"
+              R_CURLY@193..194 "}"
+        WHITESPACE@194..195 "\n"
+        R_CURLY@195..196 "}"
   WHITESPACE@196..197 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0031_while_expr.rast b/crates/syntax/test_data/parser/inline/ok/0031_while_expr.rast
index 173cecf6d9d..d2d22e58ea6 100644
--- a/crates/syntax/test_data/parser/inline/ok/0031_while_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0031_while_expr.rast
@@ -9,76 +9,81 @@ SOURCE_FILE@0..93
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..92
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..29
-        WHILE_EXPR@15..28
-          WHILE_KW@15..20 "while"
-          WHITESPACE@20..21 " "
-          CONDITION@21..25
-            LITERAL@21..25
-              TRUE_KW@21..25 "true"
-          WHITESPACE@25..26 " "
-          BLOCK_EXPR@26..28
-            L_CURLY@26..27 "{"
-            R_CURLY@27..28 "}"
-        SEMICOLON@28..29 ";"
-      WHITESPACE@29..34 "\n    "
-      EXPR_STMT@34..67
-        WHILE_EXPR@34..66
-          WHILE_KW@34..39 "while"
-          WHITESPACE@39..40 " "
-          CONDITION@40..63
-            LET_KW@40..43 "let"
-            WHITESPACE@43..44 " "
-            TUPLE_STRUCT_PAT@44..51
-              PATH@44..48
-                PATH_SEGMENT@44..48
-                  NAME_REF@44..48
-                    IDENT@44..48 "Some"
-              L_PAREN@48..49 "("
-              IDENT_PAT@49..50
-                NAME@49..50
-                  IDENT@49..50 "x"
-              R_PAREN@50..51 ")"
-            WHITESPACE@51..52 " "
-            EQ@52..53 "="
-            WHITESPACE@53..54 " "
-            METHOD_CALL_EXPR@54..63
-              PATH_EXPR@54..56
-                PATH@54..56
-                  PATH_SEGMENT@54..56
-                    NAME_REF@54..56
-                      IDENT@54..56 "it"
-              DOT@56..57 "."
-              NAME_REF@57..61
-                IDENT@57..61 "next"
-              ARG_LIST@61..63
-                L_PAREN@61..62 "("
-                R_PAREN@62..63 ")"
-          WHITESPACE@63..64 " "
-          BLOCK_EXPR@64..66
-            L_CURLY@64..65 "{"
-            R_CURLY@65..66 "}"
-        SEMICOLON@66..67 ";"
-      WHITESPACE@67..72 "\n    "
-      EXPR_STMT@72..90
-        WHILE_EXPR@72..89
-          WHILE_KW@72..77 "while"
-          WHITESPACE@77..78 " "
-          CONDITION@78..86
-            BLOCK_EXPR@78..86
-              L_CURLY@78..79 "{"
-              WHITESPACE@79..80 " "
-              LITERAL@80..84
-                TRUE_KW@80..84 "true"
-              WHITESPACE@84..85 " "
-              R_CURLY@85..86 "}"
-          WHITESPACE@86..87 " "
-          BLOCK_EXPR@87..89
-            L_CURLY@87..88 "{"
-            R_CURLY@88..89 "}"
-        SEMICOLON@89..90 ";"
-      WHITESPACE@90..91 "\n"
-      R_CURLY@91..92 "}"
+      STMT_LIST@9..92
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..29
+          WHILE_EXPR@15..28
+            WHILE_KW@15..20 "while"
+            WHITESPACE@20..21 " "
+            CONDITION@21..25
+              LITERAL@21..25
+                TRUE_KW@21..25 "true"
+            WHITESPACE@25..26 " "
+            BLOCK_EXPR@26..28
+              STMT_LIST@26..28
+                L_CURLY@26..27 "{"
+                R_CURLY@27..28 "}"
+          SEMICOLON@28..29 ";"
+        WHITESPACE@29..34 "\n    "
+        EXPR_STMT@34..67
+          WHILE_EXPR@34..66
+            WHILE_KW@34..39 "while"
+            WHITESPACE@39..40 " "
+            CONDITION@40..63
+              LET_KW@40..43 "let"
+              WHITESPACE@43..44 " "
+              TUPLE_STRUCT_PAT@44..51
+                PATH@44..48
+                  PATH_SEGMENT@44..48
+                    NAME_REF@44..48
+                      IDENT@44..48 "Some"
+                L_PAREN@48..49 "("
+                IDENT_PAT@49..50
+                  NAME@49..50
+                    IDENT@49..50 "x"
+                R_PAREN@50..51 ")"
+              WHITESPACE@51..52 " "
+              EQ@52..53 "="
+              WHITESPACE@53..54 " "
+              METHOD_CALL_EXPR@54..63
+                PATH_EXPR@54..56
+                  PATH@54..56
+                    PATH_SEGMENT@54..56
+                      NAME_REF@54..56
+                        IDENT@54..56 "it"
+                DOT@56..57 "."
+                NAME_REF@57..61
+                  IDENT@57..61 "next"
+                ARG_LIST@61..63
+                  L_PAREN@61..62 "("
+                  R_PAREN@62..63 ")"
+            WHITESPACE@63..64 " "
+            BLOCK_EXPR@64..66
+              STMT_LIST@64..66
+                L_CURLY@64..65 "{"
+                R_CURLY@65..66 "}"
+          SEMICOLON@66..67 ";"
+        WHITESPACE@67..72 "\n    "
+        EXPR_STMT@72..90
+          WHILE_EXPR@72..89
+            WHILE_KW@72..77 "while"
+            WHITESPACE@77..78 " "
+            CONDITION@78..86
+              BLOCK_EXPR@78..86
+                STMT_LIST@78..86
+                  L_CURLY@78..79 "{"
+                  WHITESPACE@79..80 " "
+                  LITERAL@80..84
+                    TRUE_KW@80..84 "true"
+                  WHITESPACE@84..85 " "
+                  R_CURLY@85..86 "}"
+            WHITESPACE@86..87 " "
+            BLOCK_EXPR@87..89
+              STMT_LIST@87..89
+                L_CURLY@87..88 "{"
+                R_CURLY@88..89 "}"
+          SEMICOLON@89..90 ";"
+        WHITESPACE@90..91 "\n"
+        R_CURLY@91..92 "}"
   WHITESPACE@92..93 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0034_break_expr.rast b/crates/syntax/test_data/parser/inline/ok/0034_break_expr.rast
index 783b25338f2..a52c1c3893f 100644
--- a/crates/syntax/test_data/parser/inline/ok/0034_break_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0034_break_expr.rast
@@ -9,47 +9,49 @@ SOURCE_FILE@0..102
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..101
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      LOOP_EXPR@15..99
-        LOOP_KW@15..19 "loop"
-        WHITESPACE@19..20 " "
-        BLOCK_EXPR@20..99
-          L_CURLY@20..21 "{"
-          WHITESPACE@21..30 "\n        "
-          EXPR_STMT@30..36
-            BREAK_EXPR@30..35
-              BREAK_KW@30..35 "break"
-            SEMICOLON@35..36 ";"
-          WHITESPACE@36..45 "\n        "
-          EXPR_STMT@45..54
-            BREAK_EXPR@45..53
-              BREAK_KW@45..50 "break"
-              WHITESPACE@50..51 " "
-              LIFETIME@51..53
-                LIFETIME_IDENT@51..53 "'l"
-            SEMICOLON@53..54 ";"
-          WHITESPACE@54..63 "\n        "
-          EXPR_STMT@63..72
-            BREAK_EXPR@63..71
-              BREAK_KW@63..68 "break"
-              WHITESPACE@68..69 " "
-              LITERAL@69..71
-                INT_NUMBER@69..71 "92"
-            SEMICOLON@71..72 ";"
-          WHITESPACE@72..81 "\n        "
-          EXPR_STMT@81..93
-            BREAK_EXPR@81..92
-              BREAK_KW@81..86 "break"
-              WHITESPACE@86..87 " "
-              LIFETIME@87..89
-                LIFETIME_IDENT@87..89 "'l"
-              WHITESPACE@89..90 " "
-              LITERAL@90..92
-                INT_NUMBER@90..92 "92"
-            SEMICOLON@92..93 ";"
-          WHITESPACE@93..98 "\n    "
-          R_CURLY@98..99 "}"
-      WHITESPACE@99..100 "\n"
-      R_CURLY@100..101 "}"
+      STMT_LIST@9..101
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        LOOP_EXPR@15..99
+          LOOP_KW@15..19 "loop"
+          WHITESPACE@19..20 " "
+          BLOCK_EXPR@20..99
+            STMT_LIST@20..99
+              L_CURLY@20..21 "{"
+              WHITESPACE@21..30 "\n        "
+              EXPR_STMT@30..36
+                BREAK_EXPR@30..35
+                  BREAK_KW@30..35 "break"
+                SEMICOLON@35..36 ";"
+              WHITESPACE@36..45 "\n        "
+              EXPR_STMT@45..54
+                BREAK_EXPR@45..53
+                  BREAK_KW@45..50 "break"
+                  WHITESPACE@50..51 " "
+                  LIFETIME@51..53
+                    LIFETIME_IDENT@51..53 "'l"
+                SEMICOLON@53..54 ";"
+              WHITESPACE@54..63 "\n        "
+              EXPR_STMT@63..72
+                BREAK_EXPR@63..71
+                  BREAK_KW@63..68 "break"
+                  WHITESPACE@68..69 " "
+                  LITERAL@69..71
+                    INT_NUMBER@69..71 "92"
+                SEMICOLON@71..72 ";"
+              WHITESPACE@72..81 "\n        "
+              EXPR_STMT@81..93
+                BREAK_EXPR@81..92
+                  BREAK_KW@81..86 "break"
+                  WHITESPACE@86..87 " "
+                  LIFETIME@87..89
+                    LIFETIME_IDENT@87..89 "'l"
+                  WHITESPACE@89..90 " "
+                  LITERAL@90..92
+                    INT_NUMBER@90..92 "92"
+                SEMICOLON@92..93 ";"
+              WHITESPACE@93..98 "\n    "
+              R_CURLY@98..99 "}"
+        WHITESPACE@99..100 "\n"
+        R_CURLY@100..101 "}"
   WHITESPACE@101..102 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0037_qual_paths.rast b/crates/syntax/test_data/parser/inline/ok/0037_qual_paths.rast
index b6379e62f8c..ab22f3189d7 100644
--- a/crates/syntax/test_data/parser/inline/ok/0037_qual_paths.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0037_qual_paths.rast
@@ -42,37 +42,38 @@ SOURCE_FILE@0..71
       R_PAREN@34..35 ")"
     WHITESPACE@35..36 " "
     BLOCK_EXPR@36..70
-      L_CURLY@36..37 "{"
-      WHITESPACE@37..38 " "
-      EXPR_STMT@38..68
-        CALL_EXPR@38..67
-          PATH_EXPR@38..65
-            PATH@38..65
-              PATH@38..56
-                PATH_SEGMENT@38..56
-                  L_ANGLE@38..39 "<"
-                  PATH_TYPE@39..44
-                    PATH@39..44
-                      PATH_SEGMENT@39..44
-                        NAME_REF@39..44
-                          IDENT@39..44 "usize"
-                  WHITESPACE@44..45 " "
-                  AS_KW@45..47 "as"
-                  WHITESPACE@47..48 " "
-                  PATH_TYPE@48..55
-                    PATH@48..55
-                      PATH_SEGMENT@48..55
-                        NAME_REF@48..55
-                          IDENT@48..55 "Default"
-                  R_ANGLE@55..56 ">"
-              COLON2@56..58 "::"
-              PATH_SEGMENT@58..65
-                NAME_REF@58..65
-                  IDENT@58..65 "default"
-          ARG_LIST@65..67
-            L_PAREN@65..66 "("
-            R_PAREN@66..67 ")"
-        SEMICOLON@67..68 ";"
-      WHITESPACE@68..69 " "
-      R_CURLY@69..70 "}"
+      STMT_LIST@36..70
+        L_CURLY@36..37 "{"
+        WHITESPACE@37..38 " "
+        EXPR_STMT@38..68
+          CALL_EXPR@38..67
+            PATH_EXPR@38..65
+              PATH@38..65
+                PATH@38..56
+                  PATH_SEGMENT@38..56
+                    L_ANGLE@38..39 "<"
+                    PATH_TYPE@39..44
+                      PATH@39..44
+                        PATH_SEGMENT@39..44
+                          NAME_REF@39..44
+                            IDENT@39..44 "usize"
+                    WHITESPACE@44..45 " "
+                    AS_KW@45..47 "as"
+                    WHITESPACE@47..48 " "
+                    PATH_TYPE@48..55
+                      PATH@48..55
+                        PATH_SEGMENT@48..55
+                          NAME_REF@48..55
+                            IDENT@48..55 "Default"
+                    R_ANGLE@55..56 ">"
+                COLON2@56..58 "::"
+                PATH_SEGMENT@58..65
+                  NAME_REF@58..65
+                    IDENT@58..65 "default"
+            ARG_LIST@65..67
+              L_PAREN@65..66 "("
+              R_PAREN@66..67 ")"
+          SEMICOLON@67..68 ";"
+        WHITESPACE@68..69 " "
+        R_CURLY@69..70 "}"
   WHITESPACE@70..71 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0038_full_range_expr.rast b/crates/syntax/test_data/parser/inline/ok/0038_full_range_expr.rast
index 64e705fb3d2..9bb358f8a00 100644
--- a/crates/syntax/test_data/parser/inline/ok/0038_full_range_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0038_full_range_expr.rast
@@ -9,20 +9,21 @@ SOURCE_FILE@0..21
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..20
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..11 " "
-      EXPR_STMT@11..18
-        INDEX_EXPR@11..17
-          PATH_EXPR@11..13
-            PATH@11..13
-              PATH_SEGMENT@11..13
-                NAME_REF@11..13
-                  IDENT@11..13 "xs"
-          L_BRACK@13..14 "["
-          RANGE_EXPR@14..16
-            DOT2@14..16 ".."
-          R_BRACK@16..17 "]"
-        SEMICOLON@17..18 ";"
-      WHITESPACE@18..19 " "
-      R_CURLY@19..20 "}"
+      STMT_LIST@9..20
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..11 " "
+        EXPR_STMT@11..18
+          INDEX_EXPR@11..17
+            PATH_EXPR@11..13
+              PATH@11..13
+                PATH_SEGMENT@11..13
+                  NAME_REF@11..13
+                    IDENT@11..13 "xs"
+            L_BRACK@13..14 "["
+            RANGE_EXPR@14..16
+              DOT2@14..16 ".."
+            R_BRACK@16..17 "]"
+          SEMICOLON@17..18 ";"
+        WHITESPACE@18..19 " "
+        R_CURLY@19..20 "}"
   WHITESPACE@20..21 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0040_crate_keyword_vis.rast b/crates/syntax/test_data/parser/inline/ok/0040_crate_keyword_vis.rast
index db5bd284969..31225282865 100644
--- a/crates/syntax/test_data/parser/inline/ok/0040_crate_keyword_vis.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0040_crate_keyword_vis.rast
@@ -12,9 +12,10 @@ SOURCE_FILE@0..71
       R_PAREN@14..15 ")"
     WHITESPACE@15..16 " "
     BLOCK_EXPR@16..19
-      L_CURLY@16..17 "{"
-      WHITESPACE@17..18 " "
-      R_CURLY@18..19 "}"
+      STMT_LIST@16..19
+        L_CURLY@16..17 "{"
+        WHITESPACE@17..18 " "
+        R_CURLY@18..19 "}"
   WHITESPACE@19..20 "\n"
   STRUCT@20..49
     STRUCT_KW@20..26 "struct"
diff --git a/crates/syntax/test_data/parser/inline/ok/0042_call_expr.rast b/crates/syntax/test_data/parser/inline/ok/0042_call_expr.rast
index fa38e946673..55619dd016a 100644
--- a/crates/syntax/test_data/parser/inline/ok/0042_call_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0042_call_expr.rast
@@ -9,139 +9,140 @@ SOURCE_FILE@0..118
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..117
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      LET_STMT@15..27
-        LET_KW@15..18 "let"
-        WHITESPACE@18..19 " "
-        WILDCARD_PAT@19..20
-          UNDERSCORE@19..20 "_"
-        WHITESPACE@20..21 " "
-        EQ@21..22 "="
-        WHITESPACE@22..23 " "
-        CALL_EXPR@23..26
-          PATH_EXPR@23..24
-            PATH@23..24
-              PATH_SEGMENT@23..24
-                NAME_REF@23..24
-                  IDENT@23..24 "f"
-          ARG_LIST@24..26
-            L_PAREN@24..25 "("
-            R_PAREN@25..26 ")"
-        SEMICOLON@26..27 ";"
-      WHITESPACE@27..32 "\n    "
-      LET_STMT@32..54
-        LET_KW@32..35 "let"
-        WHITESPACE@35..36 " "
-        WILDCARD_PAT@36..37
-          UNDERSCORE@36..37 "_"
-        WHITESPACE@37..38 " "
-        EQ@38..39 "="
-        WHITESPACE@39..40 " "
-        CALL_EXPR@40..53
-          CALL_EXPR@40..46
-            CALL_EXPR@40..43
-              PATH_EXPR@40..41
-                PATH@40..41
-                  PATH_SEGMENT@40..41
-                    NAME_REF@40..41
-                      IDENT@40..41 "f"
-              ARG_LIST@41..43
-                L_PAREN@41..42 "("
-                R_PAREN@42..43 ")"
-            ARG_LIST@43..46
-              L_PAREN@43..44 "("
-              LITERAL@44..45
-                INT_NUMBER@44..45 "1"
-              R_PAREN@45..46 ")"
-          ARG_LIST@46..53
-            L_PAREN@46..47 "("
-            LITERAL@47..48
-              INT_NUMBER@47..48 "1"
-            COMMA@48..49 ","
-            WHITESPACE@49..50 " "
-            LITERAL@50..51
-              INT_NUMBER@50..51 "2"
-            COMMA@51..52 ","
-            R_PAREN@52..53 ")"
-        SEMICOLON@53..54 ";"
-      WHITESPACE@54..59 "\n    "
-      LET_STMT@59..84
-        LET_KW@59..62 "let"
-        WHITESPACE@62..63 " "
-        WILDCARD_PAT@63..64
-          UNDERSCORE@63..64 "_"
-        WHITESPACE@64..65 " "
-        EQ@65..66 "="
-        WHITESPACE@66..67 " "
-        CALL_EXPR@67..83
-          PATH_EXPR@67..68
-            PATH@67..68
-              PATH_SEGMENT@67..68
-                NAME_REF@67..68
-                  IDENT@67..68 "f"
-          ARG_LIST@68..83
-            L_PAREN@68..69 "("
-            CALL_EXPR@69..82
-              PATH_EXPR@69..80
-                PATH@69..80
-                  PATH@69..74
-                    PATH_SEGMENT@69..74
-                      L_ANGLE@69..70 "<"
-                      PATH_TYPE@70..73
-                        PATH@70..73
-                          PATH_SEGMENT@70..73
-                            NAME_REF@70..73
-                              IDENT@70..73 "Foo"
-                      R_ANGLE@73..74 ">"
-                  COLON2@74..76 "::"
-                  PATH_SEGMENT@76..80
-                    NAME_REF@76..80
-                      IDENT@76..80 "func"
-              ARG_LIST@80..82
-                L_PAREN@80..81 "("
-                R_PAREN@81..82 ")"
-            R_PAREN@82..83 ")"
-        SEMICOLON@83..84 ";"
-      WHITESPACE@84..89 "\n    "
-      EXPR_STMT@89..115
-        CALL_EXPR@89..114
-          PATH_EXPR@89..90
-            PATH@89..90
-              PATH_SEGMENT@89..90
-                NAME_REF@89..90
-                  IDENT@89..90 "f"
-          ARG_LIST@90..114
-            L_PAREN@90..91 "("
-            CALL_EXPR@91..113
-              PATH_EXPR@91..111
-                PATH@91..111
-                  PATH@91..105
-                    PATH_SEGMENT@91..105
-                      L_ANGLE@91..92 "<"
-                      PATH_TYPE@92..95
-                        PATH@92..95
-                          PATH_SEGMENT@92..95
-                            NAME_REF@92..95
-                              IDENT@92..95 "Foo"
-                      WHITESPACE@95..96 " "
-                      AS_KW@96..98 "as"
-                      WHITESPACE@98..99 " "
-                      PATH_TYPE@99..104
-                        PATH@99..104
-                          PATH_SEGMENT@99..104
-                            NAME_REF@99..104
-                              IDENT@99..104 "Trait"
-                      R_ANGLE@104..105 ">"
-                  COLON2@105..107 "::"
-                  PATH_SEGMENT@107..111
-                    NAME_REF@107..111
-                      IDENT@107..111 "func"
-              ARG_LIST@111..113
-                L_PAREN@111..112 "("
-                R_PAREN@112..113 ")"
-            R_PAREN@113..114 ")"
-        SEMICOLON@114..115 ";"
-      WHITESPACE@115..116 "\n"
-      R_CURLY@116..117 "}"
+      STMT_LIST@9..117
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        LET_STMT@15..27
+          LET_KW@15..18 "let"
+          WHITESPACE@18..19 " "
+          WILDCARD_PAT@19..20
+            UNDERSCORE@19..20 "_"
+          WHITESPACE@20..21 " "
+          EQ@21..22 "="
+          WHITESPACE@22..23 " "
+          CALL_EXPR@23..26
+            PATH_EXPR@23..24
+              PATH@23..24
+                PATH_SEGMENT@23..24
+                  NAME_REF@23..24
+                    IDENT@23..24 "f"
+            ARG_LIST@24..26
+              L_PAREN@24..25 "("
+              R_PAREN@25..26 ")"
+          SEMICOLON@26..27 ";"
+        WHITESPACE@27..32 "\n    "
+        LET_STMT@32..54
+          LET_KW@32..35 "let"
+          WHITESPACE@35..36 " "
+          WILDCARD_PAT@36..37
+            UNDERSCORE@36..37 "_"
+          WHITESPACE@37..38 " "
+          EQ@38..39 "="
+          WHITESPACE@39..40 " "
+          CALL_EXPR@40..53
+            CALL_EXPR@40..46
+              CALL_EXPR@40..43
+                PATH_EXPR@40..41
+                  PATH@40..41
+                    PATH_SEGMENT@40..41
+                      NAME_REF@40..41
+                        IDENT@40..41 "f"
+                ARG_LIST@41..43
+                  L_PAREN@41..42 "("
+                  R_PAREN@42..43 ")"
+              ARG_LIST@43..46
+                L_PAREN@43..44 "("
+                LITERAL@44..45
+                  INT_NUMBER@44..45 "1"
+                R_PAREN@45..46 ")"
+            ARG_LIST@46..53
+              L_PAREN@46..47 "("
+              LITERAL@47..48
+                INT_NUMBER@47..48 "1"
+              COMMA@48..49 ","
+              WHITESPACE@49..50 " "
+              LITERAL@50..51
+                INT_NUMBER@50..51 "2"
+              COMMA@51..52 ","
+              R_PAREN@52..53 ")"
+          SEMICOLON@53..54 ";"
+        WHITESPACE@54..59 "\n    "
+        LET_STMT@59..84
+          LET_KW@59..62 "let"
+          WHITESPACE@62..63 " "
+          WILDCARD_PAT@63..64
+            UNDERSCORE@63..64 "_"
+          WHITESPACE@64..65 " "
+          EQ@65..66 "="
+          WHITESPACE@66..67 " "
+          CALL_EXPR@67..83
+            PATH_EXPR@67..68
+              PATH@67..68
+                PATH_SEGMENT@67..68
+                  NAME_REF@67..68
+                    IDENT@67..68 "f"
+            ARG_LIST@68..83
+              L_PAREN@68..69 "("
+              CALL_EXPR@69..82
+                PATH_EXPR@69..80
+                  PATH@69..80
+                    PATH@69..74
+                      PATH_SEGMENT@69..74
+                        L_ANGLE@69..70 "<"
+                        PATH_TYPE@70..73
+                          PATH@70..73
+                            PATH_SEGMENT@70..73
+                              NAME_REF@70..73
+                                IDENT@70..73 "Foo"
+                        R_ANGLE@73..74 ">"
+                    COLON2@74..76 "::"
+                    PATH_SEGMENT@76..80
+                      NAME_REF@76..80
+                        IDENT@76..80 "func"
+                ARG_LIST@80..82
+                  L_PAREN@80..81 "("
+                  R_PAREN@81..82 ")"
+              R_PAREN@82..83 ")"
+          SEMICOLON@83..84 ";"
+        WHITESPACE@84..89 "\n    "
+        EXPR_STMT@89..115
+          CALL_EXPR@89..114
+            PATH_EXPR@89..90
+              PATH@89..90
+                PATH_SEGMENT@89..90
+                  NAME_REF@89..90
+                    IDENT@89..90 "f"
+            ARG_LIST@90..114
+              L_PAREN@90..91 "("
+              CALL_EXPR@91..113
+                PATH_EXPR@91..111
+                  PATH@91..111
+                    PATH@91..105
+                      PATH_SEGMENT@91..105
+                        L_ANGLE@91..92 "<"
+                        PATH_TYPE@92..95
+                          PATH@92..95
+                            PATH_SEGMENT@92..95
+                              NAME_REF@92..95
+                                IDENT@92..95 "Foo"
+                        WHITESPACE@95..96 " "
+                        AS_KW@96..98 "as"
+                        WHITESPACE@98..99 " "
+                        PATH_TYPE@99..104
+                          PATH@99..104
+                            PATH_SEGMENT@99..104
+                              NAME_REF@99..104
+                                IDENT@99..104 "Trait"
+                        R_ANGLE@104..105 ">"
+                    COLON2@105..107 "::"
+                    PATH_SEGMENT@107..111
+                      NAME_REF@107..111
+                        IDENT@107..111 "func"
+                ARG_LIST@111..113
+                  L_PAREN@111..112 "("
+                  R_PAREN@112..113 ")"
+              R_PAREN@113..114 ")"
+          SEMICOLON@114..115 ";"
+        WHITESPACE@115..116 "\n"
+        R_CURLY@116..117 "}"
   WHITESPACE@117..118 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0044_block_items.rast b/crates/syntax/test_data/parser/inline/ok/0044_block_items.rast
index 1fd3cd0e783..d5c755d3437 100644
--- a/crates/syntax/test_data/parser/inline/ok/0044_block_items.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0044_block_items.rast
@@ -9,20 +9,22 @@ SOURCE_FILE@0..21
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..20
-      L_CURLY@7..8 "{"
-      WHITESPACE@8..9 " "
-      FN@9..18
-        FN_KW@9..11 "fn"
-        WHITESPACE@11..12 " "
-        NAME@12..13
-          IDENT@12..13 "b"
-        PARAM_LIST@13..15
-          L_PAREN@13..14 "("
-          R_PAREN@14..15 ")"
-        WHITESPACE@15..16 " "
-        BLOCK_EXPR@16..18
-          L_CURLY@16..17 "{"
-          R_CURLY@17..18 "}"
-      WHITESPACE@18..19 " "
-      R_CURLY@19..20 "}"
+      STMT_LIST@7..20
+        L_CURLY@7..8 "{"
+        WHITESPACE@8..9 " "
+        FN@9..18
+          FN_KW@9..11 "fn"
+          WHITESPACE@11..12 " "
+          NAME@12..13
+            IDENT@12..13 "b"
+          PARAM_LIST@13..15
+            L_PAREN@13..14 "("
+            R_PAREN@14..15 ")"
+          WHITESPACE@15..16 " "
+          BLOCK_EXPR@16..18
+            STMT_LIST@16..18
+              L_CURLY@16..17 "{"
+              R_CURLY@17..18 "}"
+        WHITESPACE@18..19 " "
+        R_CURLY@19..20 "}"
   WHITESPACE@20..21 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.rast b/crates/syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.rast
index abc258b3364..8f187f2ae64 100644
--- a/crates/syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.rast
@@ -42,6 +42,7 @@ SOURCE_FILE@0..35
       L_PAREN@30..31 "("
       R_PAREN@31..32 ")"
     BLOCK_EXPR@32..34
-      L_CURLY@32..33 "{"
-      R_CURLY@33..34 "}"
+      STMT_LIST@32..34
+        L_CURLY@32..33 "{"
+        R_CURLY@33..34 "}"
   WHITESPACE@34..35 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0048_path_type_with_bounds.rast b/crates/syntax/test_data/parser/inline/ok/0048_path_type_with_bounds.rast
index e1b88c5db5d..c65ad4231e1 100644
--- a/crates/syntax/test_data/parser/inline/ok/0048_path_type_with_bounds.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0048_path_type_with_bounds.rast
@@ -36,8 +36,9 @@ SOURCE_FILE@0..58
               R_ANGLE@22..23 ">"
     WHITESPACE@23..24 " "
     BLOCK_EXPR@24..26
-      L_CURLY@24..25 "{"
-      R_CURLY@25..26 "}"
+      STMT_LIST@24..26
+        L_CURLY@24..25 "{"
+        R_CURLY@25..26 "}"
   WHITESPACE@26..27 "\n"
   FN@27..57
     FN_KW@27..29 "fn"
@@ -78,6 +79,7 @@ SOURCE_FILE@0..58
               R_ANGLE@53..54 ">"
     WHITESPACE@54..55 " "
     BLOCK_EXPR@55..57
-      L_CURLY@55..56 "{"
-      R_CURLY@56..57 "}"
+      STMT_LIST@55..57
+        L_CURLY@55..56 "{"
+        R_CURLY@56..57 "}"
   WHITESPACE@57..58 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0053_path_expr.rast b/crates/syntax/test_data/parser/inline/ok/0053_path_expr.rast
index c34cfeb3155..7894f66d4c4 100644
--- a/crates/syntax/test_data/parser/inline/ok/0053_path_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0053_path_expr.rast
@@ -9,87 +9,88 @@ SOURCE_FILE@0..91
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..90
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      LET_STMT@15..25
-        LET_KW@15..18 "let"
-        WHITESPACE@18..19 " "
-        WILDCARD_PAT@19..20
-          UNDERSCORE@19..20 "_"
-        WHITESPACE@20..21 " "
-        EQ@21..22 "="
-        WHITESPACE@22..23 " "
-        PATH_EXPR@23..24
-          PATH@23..24
-            PATH_SEGMENT@23..24
-              NAME_REF@23..24
-                IDENT@23..24 "a"
-        SEMICOLON@24..25 ";"
-      WHITESPACE@25..30 "\n    "
-      LET_STMT@30..43
-        LET_KW@30..33 "let"
-        WHITESPACE@33..34 " "
-        WILDCARD_PAT@34..35
-          UNDERSCORE@34..35 "_"
-        WHITESPACE@35..36 " "
-        EQ@36..37 "="
-        WHITESPACE@37..38 " "
-        PATH_EXPR@38..42
-          PATH@38..42
-            PATH@38..39
-              PATH_SEGMENT@38..39
-                NAME_REF@38..39
-                  IDENT@38..39 "a"
-            COLON2@39..41 "::"
-            PATH_SEGMENT@41..42
-              NAME_REF@41..42
-                IDENT@41..42 "b"
-        SEMICOLON@42..43 ";"
-      WHITESPACE@43..48 "\n    "
-      LET_STMT@48..65
-        LET_KW@48..51 "let"
-        WHITESPACE@51..52 " "
-        WILDCARD_PAT@52..53
-          UNDERSCORE@52..53 "_"
-        WHITESPACE@53..54 " "
-        EQ@54..55 "="
-        WHITESPACE@55..56 " "
-        PATH_EXPR@56..64
-          PATH@56..64
-            PATH_SEGMENT@56..64
-              COLON2@56..58 "::"
-              NAME_REF@58..59
-                IDENT@58..59 "a"
-              GENERIC_ARG_LIST@59..64
-                COLON2@59..61 "::"
-                L_ANGLE@61..62 "<"
-                TYPE_ARG@62..63
-                  PATH_TYPE@62..63
-                    PATH@62..63
-                      PATH_SEGMENT@62..63
-                        NAME_REF@62..63
-                          IDENT@62..63 "b"
-                R_ANGLE@63..64 ">"
-        SEMICOLON@64..65 ";"
-      WHITESPACE@65..70 "\n    "
-      LET_STMT@70..88
-        LET_KW@70..73 "let"
-        WHITESPACE@73..74 " "
-        WILDCARD_PAT@74..75
-          UNDERSCORE@74..75 "_"
-        WHITESPACE@75..76 " "
-        EQ@76..77 "="
-        WHITESPACE@77..78 " "
-        MACRO_CALL@78..87
-          PATH@78..84
-            PATH_SEGMENT@78..84
-              NAME_REF@78..84
-                IDENT@78..84 "format"
-          BANG@84..85 "!"
-          TOKEN_TREE@85..87
-            L_PAREN@85..86 "("
-            R_PAREN@86..87 ")"
-        SEMICOLON@87..88 ";"
-      WHITESPACE@88..89 "\n"
-      R_CURLY@89..90 "}"
+      STMT_LIST@9..90
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        LET_STMT@15..25
+          LET_KW@15..18 "let"
+          WHITESPACE@18..19 " "
+          WILDCARD_PAT@19..20
+            UNDERSCORE@19..20 "_"
+          WHITESPACE@20..21 " "
+          EQ@21..22 "="
+          WHITESPACE@22..23 " "
+          PATH_EXPR@23..24
+            PATH@23..24
+              PATH_SEGMENT@23..24
+                NAME_REF@23..24
+                  IDENT@23..24 "a"
+          SEMICOLON@24..25 ";"
+        WHITESPACE@25..30 "\n    "
+        LET_STMT@30..43
+          LET_KW@30..33 "let"
+          WHITESPACE@33..34 " "
+          WILDCARD_PAT@34..35
+            UNDERSCORE@34..35 "_"
+          WHITESPACE@35..36 " "
+          EQ@36..37 "="
+          WHITESPACE@37..38 " "
+          PATH_EXPR@38..42
+            PATH@38..42
+              PATH@38..39
+                PATH_SEGMENT@38..39
+                  NAME_REF@38..39
+                    IDENT@38..39 "a"
+              COLON2@39..41 "::"
+              PATH_SEGMENT@41..42
+                NAME_REF@41..42
+                  IDENT@41..42 "b"
+          SEMICOLON@42..43 ";"
+        WHITESPACE@43..48 "\n    "
+        LET_STMT@48..65
+          LET_KW@48..51 "let"
+          WHITESPACE@51..52 " "
+          WILDCARD_PAT@52..53
+            UNDERSCORE@52..53 "_"
+          WHITESPACE@53..54 " "
+          EQ@54..55 "="
+          WHITESPACE@55..56 " "
+          PATH_EXPR@56..64
+            PATH@56..64
+              PATH_SEGMENT@56..64
+                COLON2@56..58 "::"
+                NAME_REF@58..59
+                  IDENT@58..59 "a"
+                GENERIC_ARG_LIST@59..64
+                  COLON2@59..61 "::"
+                  L_ANGLE@61..62 "<"
+                  TYPE_ARG@62..63
+                    PATH_TYPE@62..63
+                      PATH@62..63
+                        PATH_SEGMENT@62..63
+                          NAME_REF@62..63
+                            IDENT@62..63 "b"
+                  R_ANGLE@63..64 ">"
+          SEMICOLON@64..65 ";"
+        WHITESPACE@65..70 "\n    "
+        LET_STMT@70..88
+          LET_KW@70..73 "let"
+          WHITESPACE@73..74 " "
+          WILDCARD_PAT@74..75
+            UNDERSCORE@74..75 "_"
+          WHITESPACE@75..76 " "
+          EQ@76..77 "="
+          WHITESPACE@77..78 " "
+          MACRO_CALL@78..87
+            PATH@78..84
+              PATH_SEGMENT@78..84
+                NAME_REF@78..84
+                  IDENT@78..84 "format"
+            BANG@84..85 "!"
+            TOKEN_TREE@85..87
+              L_PAREN@85..86 "("
+              R_PAREN@86..87 ")"
+          SEMICOLON@87..88 ";"
+        WHITESPACE@88..89 "\n"
+        R_CURLY@89..90 "}"
   WHITESPACE@90..91 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0055_literal_pattern.rast b/crates/syntax/test_data/parser/inline/ok/0055_literal_pattern.rast
index 32187facfd7..97e2d31d1c1 100644
--- a/crates/syntax/test_data/parser/inline/ok/0055_literal_pattern.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0055_literal_pattern.rast
@@ -9,68 +9,69 @@ SOURCE_FILE@0..113
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..112
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      MATCH_EXPR@16..110
-        MATCH_KW@16..21 "match"
-        WHITESPACE@21..22 " "
-        TUPLE_EXPR@22..24
-          L_PAREN@22..23 "("
-          R_PAREN@23..24 ")"
-        WHITESPACE@24..25 " "
-        MATCH_ARM_LIST@25..110
-          L_CURLY@25..26 "{"
-          WHITESPACE@26..35 "\n        "
-          MATCH_ARM@35..44
-            LITERAL_PAT@35..37
-              MINUS@35..36 "-"
-              LITERAL@36..37
-                INT_NUMBER@36..37 "1"
-            WHITESPACE@37..38 " "
-            FAT_ARROW@38..40 "=>"
-            WHITESPACE@40..41 " "
-            TUPLE_EXPR@41..43
-              L_PAREN@41..42 "("
-              R_PAREN@42..43 ")"
-            COMMA@43..44 ","
-          WHITESPACE@44..53 "\n        "
-          MATCH_ARM@53..62
-            LITERAL_PAT@53..55
-              LITERAL@53..55
-                INT_NUMBER@53..55 "92"
-            WHITESPACE@55..56 " "
-            FAT_ARROW@56..58 "=>"
-            WHITESPACE@58..59 " "
-            TUPLE_EXPR@59..61
-              L_PAREN@59..60 "("
-              R_PAREN@60..61 ")"
-            COMMA@61..62 ","
-          WHITESPACE@62..71 "\n        "
-          MATCH_ARM@71..81
-            LITERAL_PAT@71..74
-              LITERAL@71..74
-                CHAR@71..74 "'c'"
-            WHITESPACE@74..75 " "
-            FAT_ARROW@75..77 "=>"
-            WHITESPACE@77..78 " "
-            TUPLE_EXPR@78..80
-              L_PAREN@78..79 "("
-              R_PAREN@79..80 ")"
-            COMMA@80..81 ","
-          WHITESPACE@81..90 "\n        "
-          MATCH_ARM@90..104
-            LITERAL_PAT@90..97
-              LITERAL@90..97
-                STRING@90..97 "\"hello\""
-            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..109 "\n    "
-          R_CURLY@109..110 "}"
-      WHITESPACE@110..111 "\n"
-      R_CURLY@111..112 "}"
+      STMT_LIST@10..112
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        MATCH_EXPR@16..110
+          MATCH_KW@16..21 "match"
+          WHITESPACE@21..22 " "
+          TUPLE_EXPR@22..24
+            L_PAREN@22..23 "("
+            R_PAREN@23..24 ")"
+          WHITESPACE@24..25 " "
+          MATCH_ARM_LIST@25..110
+            L_CURLY@25..26 "{"
+            WHITESPACE@26..35 "\n        "
+            MATCH_ARM@35..44
+              LITERAL_PAT@35..37
+                MINUS@35..36 "-"
+                LITERAL@36..37
+                  INT_NUMBER@36..37 "1"
+              WHITESPACE@37..38 " "
+              FAT_ARROW@38..40 "=>"
+              WHITESPACE@40..41 " "
+              TUPLE_EXPR@41..43
+                L_PAREN@41..42 "("
+                R_PAREN@42..43 ")"
+              COMMA@43..44 ","
+            WHITESPACE@44..53 "\n        "
+            MATCH_ARM@53..62
+              LITERAL_PAT@53..55
+                LITERAL@53..55
+                  INT_NUMBER@53..55 "92"
+              WHITESPACE@55..56 " "
+              FAT_ARROW@56..58 "=>"
+              WHITESPACE@58..59 " "
+              TUPLE_EXPR@59..61
+                L_PAREN@59..60 "("
+                R_PAREN@60..61 ")"
+              COMMA@61..62 ","
+            WHITESPACE@62..71 "\n        "
+            MATCH_ARM@71..81
+              LITERAL_PAT@71..74
+                LITERAL@71..74
+                  CHAR@71..74 "'c'"
+              WHITESPACE@74..75 " "
+              FAT_ARROW@75..77 "=>"
+              WHITESPACE@77..78 " "
+              TUPLE_EXPR@78..80
+                L_PAREN@78..79 "("
+                R_PAREN@79..80 ")"
+              COMMA@80..81 ","
+            WHITESPACE@81..90 "\n        "
+            MATCH_ARM@90..104
+              LITERAL_PAT@90..97
+                LITERAL@90..97
+                  STRING@90..97 "\"hello\""
+              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..109 "\n    "
+            R_CURLY@109..110 "}"
+        WHITESPACE@110..111 "\n"
+        R_CURLY@111..112 "}"
   WHITESPACE@112..113 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0056_where_clause.rast b/crates/syntax/test_data/parser/inline/ok/0056_where_clause.rast
index d42a7e29571..20fd2c3f433 100644
--- a/crates/syntax/test_data/parser/inline/ok/0056_where_clause.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0056_where_clause.rast
@@ -111,6 +111,7 @@ SOURCE_FILE@0..116
               LIFETIME_IDENT@110..112 "'a"
     WHITESPACE@112..113 "\n"
     BLOCK_EXPR@113..115
-      L_CURLY@113..114 "{"
-      R_CURLY@114..115 "}"
+      STMT_LIST@113..115
+        L_CURLY@113..114 "{"
+        R_CURLY@114..115 "}"
   WHITESPACE@115..116 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0058_range_pat.rast b/crates/syntax/test_data/parser/inline/ok/0058_range_pat.rast
index 75982c3dee9..1a8979db89e 100644
--- a/crates/syntax/test_data/parser/inline/ok/0058_range_pat.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0058_range_pat.rast
@@ -9,90 +9,91 @@ SOURCE_FILE@0..135
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..134
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      MATCH_EXPR@16..132
-        MATCH_KW@16..21 "match"
-        WHITESPACE@21..22 " "
-        LITERAL@22..24
-          INT_NUMBER@22..24 "92"
-        WHITESPACE@24..25 " "
-        MATCH_ARM_LIST@25..132
-          L_CURLY@25..26 "{"
-          WHITESPACE@26..35 "\n        "
-          MATCH_ARM@35..51
-            RANGE_PAT@35..44
-              LITERAL_PAT@35..36
-                LITERAL@35..36
-                  INT_NUMBER@35..36 "0"
-              WHITESPACE@36..37 " "
-              DOT3@37..40 "..."
-              WHITESPACE@40..41 " "
-              LITERAL_PAT@41..44
-                LITERAL@41..44
-                  INT_NUMBER@41..44 "100"
-            WHITESPACE@44..45 " "
-            FAT_ARROW@45..47 "=>"
-            WHITESPACE@47..48 " "
-            TUPLE_EXPR@48..50
-              L_PAREN@48..49 "("
-              R_PAREN@49..50 ")"
-            COMMA@50..51 ","
-          WHITESPACE@51..60 "\n        "
-          MATCH_ARM@60..78
-            RANGE_PAT@60..71
-              LITERAL_PAT@60..63
-                LITERAL@60..63
-                  INT_NUMBER@60..63 "101"
-              WHITESPACE@63..64 " "
-              DOT2EQ@64..67 "..="
-              WHITESPACE@67..68 " "
-              LITERAL_PAT@68..71
-                LITERAL@68..71
-                  INT_NUMBER@68..71 "200"
-            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 "\n        "
-          MATCH_ARM@87..104
-            RANGE_PAT@87..97
-              LITERAL_PAT@87..90
-                LITERAL@87..90
-                  INT_NUMBER@87..90 "200"
-              WHITESPACE@90..91 " "
-              DOT2@91..93 ".."
-              WHITESPACE@93..94 " "
-              LITERAL_PAT@94..97
-                LITERAL@94..97
-                  INT_NUMBER@94..97 "301"
-            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 "\n        "
-          MATCH_ARM@113..126
-            RANGE_PAT@113..119
-              LITERAL_PAT@113..116
-                LITERAL@113..116
-                  INT_NUMBER@113..116 "302"
-              WHITESPACE@116..117 " "
-              DOT2@117..119 ".."
-            WHITESPACE@119..120 " "
-            FAT_ARROW@120..122 "=>"
-            WHITESPACE@122..123 " "
-            TUPLE_EXPR@123..125
-              L_PAREN@123..124 "("
-              R_PAREN@124..125 ")"
-            COMMA@125..126 ","
-          WHITESPACE@126..131 "\n    "
-          R_CURLY@131..132 "}"
-      WHITESPACE@132..133 "\n"
-      R_CURLY@133..134 "}"
+      STMT_LIST@10..134
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        MATCH_EXPR@16..132
+          MATCH_KW@16..21 "match"
+          WHITESPACE@21..22 " "
+          LITERAL@22..24
+            INT_NUMBER@22..24 "92"
+          WHITESPACE@24..25 " "
+          MATCH_ARM_LIST@25..132
+            L_CURLY@25..26 "{"
+            WHITESPACE@26..35 "\n        "
+            MATCH_ARM@35..51
+              RANGE_PAT@35..44
+                LITERAL_PAT@35..36
+                  LITERAL@35..36
+                    INT_NUMBER@35..36 "0"
+                WHITESPACE@36..37 " "
+                DOT3@37..40 "..."
+                WHITESPACE@40..41 " "
+                LITERAL_PAT@41..44
+                  LITERAL@41..44
+                    INT_NUMBER@41..44 "100"
+              WHITESPACE@44..45 " "
+              FAT_ARROW@45..47 "=>"
+              WHITESPACE@47..48 " "
+              TUPLE_EXPR@48..50
+                L_PAREN@48..49 "("
+                R_PAREN@49..50 ")"
+              COMMA@50..51 ","
+            WHITESPACE@51..60 "\n        "
+            MATCH_ARM@60..78
+              RANGE_PAT@60..71
+                LITERAL_PAT@60..63
+                  LITERAL@60..63
+                    INT_NUMBER@60..63 "101"
+                WHITESPACE@63..64 " "
+                DOT2EQ@64..67 "..="
+                WHITESPACE@67..68 " "
+                LITERAL_PAT@68..71
+                  LITERAL@68..71
+                    INT_NUMBER@68..71 "200"
+              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 "\n        "
+            MATCH_ARM@87..104
+              RANGE_PAT@87..97
+                LITERAL_PAT@87..90
+                  LITERAL@87..90
+                    INT_NUMBER@87..90 "200"
+                WHITESPACE@90..91 " "
+                DOT2@91..93 ".."
+                WHITESPACE@93..94 " "
+                LITERAL_PAT@94..97
+                  LITERAL@94..97
+                    INT_NUMBER@94..97 "301"
+              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 "\n        "
+            MATCH_ARM@113..126
+              RANGE_PAT@113..119
+                LITERAL_PAT@113..116
+                  LITERAL@113..116
+                    INT_NUMBER@113..116 "302"
+                WHITESPACE@116..117 " "
+                DOT2@117..119 ".."
+              WHITESPACE@119..120 " "
+              FAT_ARROW@120..122 "=>"
+              WHITESPACE@122..123 " "
+              TUPLE_EXPR@123..125
+                L_PAREN@123..124 "("
+                R_PAREN@124..125 ")"
+              COMMA@125..126 ","
+            WHITESPACE@126..131 "\n    "
+            R_CURLY@131..132 "}"
+        WHITESPACE@132..133 "\n"
+        R_CURLY@133..134 "}"
   WHITESPACE@134..135 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0059_match_arms_commas.rast b/crates/syntax/test_data/parser/inline/ok/0059_match_arms_commas.rast
index 6155726e91a..075d49bcc81 100644
--- a/crates/syntax/test_data/parser/inline/ok/0059_match_arms_commas.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0059_match_arms_commas.rast
@@ -9,50 +9,52 @@ SOURCE_FILE@0..83
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..82
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      MATCH_EXPR@15..80
-        MATCH_KW@15..20 "match"
-        WHITESPACE@20..21 " "
-        TUPLE_EXPR@21..23
-          L_PAREN@21..22 "("
-          R_PAREN@22..23 ")"
-        WHITESPACE@23..24 " "
-        MATCH_ARM_LIST@24..80
-          L_CURLY@24..25 "{"
-          WHITESPACE@25..34 "\n        "
-          MATCH_ARM@34..42
-            WILDCARD_PAT@34..35
-              UNDERSCORE@34..35 "_"
-            WHITESPACE@35..36 " "
-            FAT_ARROW@36..38 "=>"
-            WHITESPACE@38..39 " "
-            TUPLE_EXPR@39..41
-              L_PAREN@39..40 "("
-              R_PAREN@40..41 ")"
-            COMMA@41..42 ","
-          WHITESPACE@42..51 "\n        "
-          MATCH_ARM@51..58
-            WILDCARD_PAT@51..52
-              UNDERSCORE@51..52 "_"
-            WHITESPACE@52..53 " "
-            FAT_ARROW@53..55 "=>"
-            WHITESPACE@55..56 " "
-            BLOCK_EXPR@56..58
-              L_CURLY@56..57 "{"
-              R_CURLY@57..58 "}"
-          WHITESPACE@58..67 "\n        "
-          MATCH_ARM@67..74
-            WILDCARD_PAT@67..68
-              UNDERSCORE@67..68 "_"
-            WHITESPACE@68..69 " "
-            FAT_ARROW@69..71 "=>"
-            WHITESPACE@71..72 " "
-            TUPLE_EXPR@72..74
-              L_PAREN@72..73 "("
-              R_PAREN@73..74 ")"
-          WHITESPACE@74..79 "\n    "
-          R_CURLY@79..80 "}"
-      WHITESPACE@80..81 "\n"
-      R_CURLY@81..82 "}"
+      STMT_LIST@9..82
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        MATCH_EXPR@15..80
+          MATCH_KW@15..20 "match"
+          WHITESPACE@20..21 " "
+          TUPLE_EXPR@21..23
+            L_PAREN@21..22 "("
+            R_PAREN@22..23 ")"
+          WHITESPACE@23..24 " "
+          MATCH_ARM_LIST@24..80
+            L_CURLY@24..25 "{"
+            WHITESPACE@25..34 "\n        "
+            MATCH_ARM@34..42
+              WILDCARD_PAT@34..35
+                UNDERSCORE@34..35 "_"
+              WHITESPACE@35..36 " "
+              FAT_ARROW@36..38 "=>"
+              WHITESPACE@38..39 " "
+              TUPLE_EXPR@39..41
+                L_PAREN@39..40 "("
+                R_PAREN@40..41 ")"
+              COMMA@41..42 ","
+            WHITESPACE@42..51 "\n        "
+            MATCH_ARM@51..58
+              WILDCARD_PAT@51..52
+                UNDERSCORE@51..52 "_"
+              WHITESPACE@52..53 " "
+              FAT_ARROW@53..55 "=>"
+              WHITESPACE@55..56 " "
+              BLOCK_EXPR@56..58
+                STMT_LIST@56..58
+                  L_CURLY@56..57 "{"
+                  R_CURLY@57..58 "}"
+            WHITESPACE@58..67 "\n        "
+            MATCH_ARM@67..74
+              WILDCARD_PAT@67..68
+                UNDERSCORE@67..68 "_"
+              WHITESPACE@68..69 " "
+              FAT_ARROW@69..71 "=>"
+              WHITESPACE@71..72 " "
+              TUPLE_EXPR@72..74
+                L_PAREN@72..73 "("
+                R_PAREN@73..74 ")"
+            WHITESPACE@74..79 "\n    "
+            R_CURLY@79..80 "}"
+        WHITESPACE@80..81 "\n"
+        R_CURLY@81..82 "}"
   WHITESPACE@82..83 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0061_record_lit.rast b/crates/syntax/test_data/parser/inline/ok/0061_record_lit.rast
index a9ae1aa5953..baa12c92d51 100644
--- a/crates/syntax/test_data/parser/inline/ok/0061_record_lit.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0061_record_lit.rast
@@ -9,116 +9,117 @@ SOURCE_FILE@0..112
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..111
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..20
-        RECORD_EXPR@15..19
-          PATH@15..16
-            PATH_SEGMENT@15..16
-              NAME_REF@15..16
-                IDENT@15..16 "S"
-          WHITESPACE@16..17 " "
-          RECORD_EXPR_FIELD_LIST@17..19
-            L_CURLY@17..18 "{"
-            R_CURLY@18..19 "}"
-        SEMICOLON@19..20 ";"
-      WHITESPACE@20..25 "\n    "
-      EXPR_STMT@25..41
-        RECORD_EXPR@25..40
-          PATH@25..26
-            PATH_SEGMENT@25..26
-              NAME_REF@25..26
-                IDENT@25..26 "S"
-          WHITESPACE@26..27 " "
-          RECORD_EXPR_FIELD_LIST@27..40
-            L_CURLY@27..28 "{"
-            WHITESPACE@28..29 " "
-            RECORD_EXPR_FIELD@29..30
-              PATH_EXPR@29..30
-                PATH@29..30
-                  PATH_SEGMENT@29..30
-                    NAME_REF@29..30
-                      IDENT@29..30 "x"
-            COMMA@30..31 ","
-            WHITESPACE@31..32 " "
-            RECORD_EXPR_FIELD@32..37
-              NAME_REF@32..33
-                IDENT@32..33 "y"
-              COLON@33..34 ":"
-              WHITESPACE@34..35 " "
-              LITERAL@35..37
-                INT_NUMBER@35..37 "32"
-            COMMA@37..38 ","
-            WHITESPACE@38..39 " "
-            R_CURLY@39..40 "}"
-        SEMICOLON@40..41 ";"
-      WHITESPACE@41..46 "\n    "
-      EXPR_STMT@46..83
-        RECORD_EXPR@46..82
-          PATH@46..47
-            PATH_SEGMENT@46..47
-              NAME_REF@46..47
-                IDENT@46..47 "S"
-          WHITESPACE@47..48 " "
-          RECORD_EXPR_FIELD_LIST@48..82
-            L_CURLY@48..49 "{"
-            WHITESPACE@49..50 " "
-            RECORD_EXPR_FIELD@50..51
-              PATH_EXPR@50..51
-                PATH@50..51
-                  PATH_SEGMENT@50..51
-                    NAME_REF@50..51
-                      IDENT@50..51 "x"
-            COMMA@51..52 ","
-            WHITESPACE@52..53 " "
-            RECORD_EXPR_FIELD@53..58
-              NAME_REF@53..54
-                IDENT@53..54 "y"
-              COLON@54..55 ":"
-              WHITESPACE@55..56 " "
-              LITERAL@56..58
-                INT_NUMBER@56..58 "32"
-            COMMA@58..59 ","
-            WHITESPACE@59..60 " "
-            DOT2@60..62 ".."
-            CALL_EXPR@62..80
-              PATH_EXPR@62..78
-                PATH@62..78
-                  PATH@62..69
-                    PATH_SEGMENT@62..69
-                      NAME_REF@62..69
-                        IDENT@62..69 "Default"
-                  COLON2@69..71 "::"
-                  PATH_SEGMENT@71..78
-                    NAME_REF@71..78
-                      IDENT@71..78 "default"
-              ARG_LIST@78..80
-                L_PAREN@78..79 "("
-                R_PAREN@79..80 ")"
-            WHITESPACE@80..81 " "
-            R_CURLY@81..82 "}"
-        SEMICOLON@82..83 ";"
-      WHITESPACE@83..88 "\n    "
-      EXPR_STMT@88..109
-        RECORD_EXPR@88..108
-          PATH@88..99
-            PATH_SEGMENT@88..99
-              NAME_REF@88..99
-                IDENT@88..99 "TupleStruct"
-          WHITESPACE@99..100 " "
-          RECORD_EXPR_FIELD_LIST@100..108
-            L_CURLY@100..101 "{"
-            WHITESPACE@101..102 " "
-            RECORD_EXPR_FIELD@102..106
-              NAME_REF@102..103
-                INT_NUMBER@102..103 "0"
-              COLON@103..104 ":"
-              WHITESPACE@104..105 " "
-              LITERAL@105..106
-                INT_NUMBER@105..106 "1"
-            WHITESPACE@106..107 " "
-            R_CURLY@107..108 "}"
-        SEMICOLON@108..109 ";"
-      WHITESPACE@109..110 "\n"
-      R_CURLY@110..111 "}"
+      STMT_LIST@9..111
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..20
+          RECORD_EXPR@15..19
+            PATH@15..16
+              PATH_SEGMENT@15..16
+                NAME_REF@15..16
+                  IDENT@15..16 "S"
+            WHITESPACE@16..17 " "
+            RECORD_EXPR_FIELD_LIST@17..19
+              L_CURLY@17..18 "{"
+              R_CURLY@18..19 "}"
+          SEMICOLON@19..20 ";"
+        WHITESPACE@20..25 "\n    "
+        EXPR_STMT@25..41
+          RECORD_EXPR@25..40
+            PATH@25..26
+              PATH_SEGMENT@25..26
+                NAME_REF@25..26
+                  IDENT@25..26 "S"
+            WHITESPACE@26..27 " "
+            RECORD_EXPR_FIELD_LIST@27..40
+              L_CURLY@27..28 "{"
+              WHITESPACE@28..29 " "
+              RECORD_EXPR_FIELD@29..30
+                PATH_EXPR@29..30
+                  PATH@29..30
+                    PATH_SEGMENT@29..30
+                      NAME_REF@29..30
+                        IDENT@29..30 "x"
+              COMMA@30..31 ","
+              WHITESPACE@31..32 " "
+              RECORD_EXPR_FIELD@32..37
+                NAME_REF@32..33
+                  IDENT@32..33 "y"
+                COLON@33..34 ":"
+                WHITESPACE@34..35 " "
+                LITERAL@35..37
+                  INT_NUMBER@35..37 "32"
+              COMMA@37..38 ","
+              WHITESPACE@38..39 " "
+              R_CURLY@39..40 "}"
+          SEMICOLON@40..41 ";"
+        WHITESPACE@41..46 "\n    "
+        EXPR_STMT@46..83
+          RECORD_EXPR@46..82
+            PATH@46..47
+              PATH_SEGMENT@46..47
+                NAME_REF@46..47
+                  IDENT@46..47 "S"
+            WHITESPACE@47..48 " "
+            RECORD_EXPR_FIELD_LIST@48..82
+              L_CURLY@48..49 "{"
+              WHITESPACE@49..50 " "
+              RECORD_EXPR_FIELD@50..51
+                PATH_EXPR@50..51
+                  PATH@50..51
+                    PATH_SEGMENT@50..51
+                      NAME_REF@50..51
+                        IDENT@50..51 "x"
+              COMMA@51..52 ","
+              WHITESPACE@52..53 " "
+              RECORD_EXPR_FIELD@53..58
+                NAME_REF@53..54
+                  IDENT@53..54 "y"
+                COLON@54..55 ":"
+                WHITESPACE@55..56 " "
+                LITERAL@56..58
+                  INT_NUMBER@56..58 "32"
+              COMMA@58..59 ","
+              WHITESPACE@59..60 " "
+              DOT2@60..62 ".."
+              CALL_EXPR@62..80
+                PATH_EXPR@62..78
+                  PATH@62..78
+                    PATH@62..69
+                      PATH_SEGMENT@62..69
+                        NAME_REF@62..69
+                          IDENT@62..69 "Default"
+                    COLON2@69..71 "::"
+                    PATH_SEGMENT@71..78
+                      NAME_REF@71..78
+                        IDENT@71..78 "default"
+                ARG_LIST@78..80
+                  L_PAREN@78..79 "("
+                  R_PAREN@79..80 ")"
+              WHITESPACE@80..81 " "
+              R_CURLY@81..82 "}"
+          SEMICOLON@82..83 ";"
+        WHITESPACE@83..88 "\n    "
+        EXPR_STMT@88..109
+          RECORD_EXPR@88..108
+            PATH@88..99
+              PATH_SEGMENT@88..99
+                NAME_REF@88..99
+                  IDENT@88..99 "TupleStruct"
+            WHITESPACE@99..100 " "
+            RECORD_EXPR_FIELD_LIST@100..108
+              L_CURLY@100..101 "{"
+              WHITESPACE@101..102 " "
+              RECORD_EXPR_FIELD@102..106
+                NAME_REF@102..103
+                  INT_NUMBER@102..103 "0"
+                COLON@103..104 ":"
+                WHITESPACE@104..105 " "
+                LITERAL@105..106
+                  INT_NUMBER@105..106 "1"
+              WHITESPACE@106..107 " "
+              R_CURLY@107..108 "}"
+          SEMICOLON@108..109 ";"
+        WHITESPACE@109..110 "\n"
+        R_CURLY@110..111 "}"
   WHITESPACE@111..112 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0062_mod_contents.rast b/crates/syntax/test_data/parser/inline/ok/0062_mod_contents.rast
index 583dcac7ed3..2deaf07030a 100644
--- a/crates/syntax/test_data/parser/inline/ok/0062_mod_contents.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0062_mod_contents.rast
@@ -9,8 +9,9 @@ SOURCE_FILE@0..70
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..11
-      L_CURLY@9..10 "{"
-      R_CURLY@10..11 "}"
+      STMT_LIST@9..11
+        L_CURLY@9..10 "{"
+        R_CURLY@10..11 "}"
   WHITESPACE@11..12 "\n"
   MACRO_RULES@12..31
     MACRO_RULES_KW@12..23 "macro_rules"
diff --git a/crates/syntax/test_data/parser/inline/ok/0064_if_expr.rast b/crates/syntax/test_data/parser/inline/ok/0064_if_expr.rast
index 58716000344..5d8a8620cfe 100644
--- a/crates/syntax/test_data/parser/inline/ok/0064_if_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0064_if_expr.rast
@@ -9,113 +9,124 @@ SOURCE_FILE@0..137
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..136
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..26
-        IF_EXPR@15..25
-          IF_KW@15..17 "if"
-          WHITESPACE@17..18 " "
-          CONDITION@18..22
-            LITERAL@18..22
-              TRUE_KW@18..22 "true"
-          WHITESPACE@22..23 " "
-          BLOCK_EXPR@23..25
-            L_CURLY@23..24 "{"
-            R_CURLY@24..25 "}"
-        SEMICOLON@25..26 ";"
-      WHITESPACE@26..31 "\n    "
-      EXPR_STMT@31..50
-        IF_EXPR@31..49
-          IF_KW@31..33 "if"
-          WHITESPACE@33..34 " "
-          CONDITION@34..38
-            LITERAL@34..38
-              TRUE_KW@34..38 "true"
-          WHITESPACE@38..39 " "
-          BLOCK_EXPR@39..41
-            L_CURLY@39..40 "{"
-            R_CURLY@40..41 "}"
-          WHITESPACE@41..42 " "
-          ELSE_KW@42..46 "else"
-          WHITESPACE@46..47 " "
-          BLOCK_EXPR@47..49
-            L_CURLY@47..48 "{"
-            R_CURLY@48..49 "}"
-        SEMICOLON@49..50 ";"
-      WHITESPACE@50..55 "\n    "
-      EXPR_STMT@55..91
-        IF_EXPR@55..90
-          IF_KW@55..57 "if"
-          WHITESPACE@57..58 " "
-          CONDITION@58..62
-            LITERAL@58..62
-              TRUE_KW@58..62 "true"
-          WHITESPACE@62..63 " "
-          BLOCK_EXPR@63..65
-            L_CURLY@63..64 "{"
-            R_CURLY@64..65 "}"
-          WHITESPACE@65..66 " "
-          ELSE_KW@66..70 "else"
-          WHITESPACE@70..71 " "
-          IF_EXPR@71..90
-            IF_KW@71..73 "if"
-            WHITESPACE@73..74 " "
-            CONDITION@74..79
-              LITERAL@74..79
-                FALSE_KW@74..79 "false"
-            WHITESPACE@79..80 " "
-            BLOCK_EXPR@80..82
-              L_CURLY@80..81 "{"
-              R_CURLY@81..82 "}"
-            WHITESPACE@82..83 " "
-            ELSE_KW@83..87 "else"
-            WHITESPACE@87..88 " "
-            BLOCK_EXPR@88..90
-              L_CURLY@88..89 "{"
-              R_CURLY@89..90 "}"
-        SEMICOLON@90..91 ";"
-      WHITESPACE@91..96 "\n    "
-      EXPR_STMT@96..104
-        IF_EXPR@96..103
-          IF_KW@96..98 "if"
-          WHITESPACE@98..99 " "
-          CONDITION@99..100
-            PATH_EXPR@99..100
-              PATH@99..100
-                PATH_SEGMENT@99..100
-                  NAME_REF@99..100
-                    IDENT@99..100 "S"
-          WHITESPACE@100..101 " "
-          BLOCK_EXPR@101..103
-            L_CURLY@101..102 "{"
-            R_CURLY@102..103 "}"
-        SEMICOLON@103..104 ";"
-      WHITESPACE@104..109 "\n    "
-      EXPR_STMT@109..134
-        IF_EXPR@109..133
-          IF_KW@109..111 "if"
-          WHITESPACE@111..112 " "
-          CONDITION@112..120
-            BLOCK_EXPR@112..120
-              L_CURLY@112..113 "{"
-              WHITESPACE@113..114 " "
-              LITERAL@114..118
-                TRUE_KW@114..118 "true"
-              WHITESPACE@118..119 " "
-              R_CURLY@119..120 "}"
-          WHITESPACE@120..121 " "
-          BLOCK_EXPR@121..124
-            L_CURLY@121..122 "{"
-            WHITESPACE@122..123 " "
-            R_CURLY@123..124 "}"
-          WHITESPACE@124..125 " "
-          ELSE_KW@125..129 "else"
-          WHITESPACE@129..130 " "
-          BLOCK_EXPR@130..133
-            L_CURLY@130..131 "{"
-            WHITESPACE@131..132 " "
-            R_CURLY@132..133 "}"
-        SEMICOLON@133..134 ";"
-      WHITESPACE@134..135 "\n"
-      R_CURLY@135..136 "}"
+      STMT_LIST@9..136
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..26
+          IF_EXPR@15..25
+            IF_KW@15..17 "if"
+            WHITESPACE@17..18 " "
+            CONDITION@18..22
+              LITERAL@18..22
+                TRUE_KW@18..22 "true"
+            WHITESPACE@22..23 " "
+            BLOCK_EXPR@23..25
+              STMT_LIST@23..25
+                L_CURLY@23..24 "{"
+                R_CURLY@24..25 "}"
+          SEMICOLON@25..26 ";"
+        WHITESPACE@26..31 "\n    "
+        EXPR_STMT@31..50
+          IF_EXPR@31..49
+            IF_KW@31..33 "if"
+            WHITESPACE@33..34 " "
+            CONDITION@34..38
+              LITERAL@34..38
+                TRUE_KW@34..38 "true"
+            WHITESPACE@38..39 " "
+            BLOCK_EXPR@39..41
+              STMT_LIST@39..41
+                L_CURLY@39..40 "{"
+                R_CURLY@40..41 "}"
+            WHITESPACE@41..42 " "
+            ELSE_KW@42..46 "else"
+            WHITESPACE@46..47 " "
+            BLOCK_EXPR@47..49
+              STMT_LIST@47..49
+                L_CURLY@47..48 "{"
+                R_CURLY@48..49 "}"
+          SEMICOLON@49..50 ";"
+        WHITESPACE@50..55 "\n    "
+        EXPR_STMT@55..91
+          IF_EXPR@55..90
+            IF_KW@55..57 "if"
+            WHITESPACE@57..58 " "
+            CONDITION@58..62
+              LITERAL@58..62
+                TRUE_KW@58..62 "true"
+            WHITESPACE@62..63 " "
+            BLOCK_EXPR@63..65
+              STMT_LIST@63..65
+                L_CURLY@63..64 "{"
+                R_CURLY@64..65 "}"
+            WHITESPACE@65..66 " "
+            ELSE_KW@66..70 "else"
+            WHITESPACE@70..71 " "
+            IF_EXPR@71..90
+              IF_KW@71..73 "if"
+              WHITESPACE@73..74 " "
+              CONDITION@74..79
+                LITERAL@74..79
+                  FALSE_KW@74..79 "false"
+              WHITESPACE@79..80 " "
+              BLOCK_EXPR@80..82
+                STMT_LIST@80..82
+                  L_CURLY@80..81 "{"
+                  R_CURLY@81..82 "}"
+              WHITESPACE@82..83 " "
+              ELSE_KW@83..87 "else"
+              WHITESPACE@87..88 " "
+              BLOCK_EXPR@88..90
+                STMT_LIST@88..90
+                  L_CURLY@88..89 "{"
+                  R_CURLY@89..90 "}"
+          SEMICOLON@90..91 ";"
+        WHITESPACE@91..96 "\n    "
+        EXPR_STMT@96..104
+          IF_EXPR@96..103
+            IF_KW@96..98 "if"
+            WHITESPACE@98..99 " "
+            CONDITION@99..100
+              PATH_EXPR@99..100
+                PATH@99..100
+                  PATH_SEGMENT@99..100
+                    NAME_REF@99..100
+                      IDENT@99..100 "S"
+            WHITESPACE@100..101 " "
+            BLOCK_EXPR@101..103
+              STMT_LIST@101..103
+                L_CURLY@101..102 "{"
+                R_CURLY@102..103 "}"
+          SEMICOLON@103..104 ";"
+        WHITESPACE@104..109 "\n    "
+        EXPR_STMT@109..134
+          IF_EXPR@109..133
+            IF_KW@109..111 "if"
+            WHITESPACE@111..112 " "
+            CONDITION@112..120
+              BLOCK_EXPR@112..120
+                STMT_LIST@112..120
+                  L_CURLY@112..113 "{"
+                  WHITESPACE@113..114 " "
+                  LITERAL@114..118
+                    TRUE_KW@114..118 "true"
+                  WHITESPACE@118..119 " "
+                  R_CURLY@119..120 "}"
+            WHITESPACE@120..121 " "
+            BLOCK_EXPR@121..124
+              STMT_LIST@121..124
+                L_CURLY@121..122 "{"
+                WHITESPACE@122..123 " "
+                R_CURLY@123..124 "}"
+            WHITESPACE@124..125 " "
+            ELSE_KW@125..129 "else"
+            WHITESPACE@129..130 " "
+            BLOCK_EXPR@130..133
+              STMT_LIST@130..133
+                L_CURLY@130..131 "{"
+                WHITESPACE@131..132 " "
+                R_CURLY@132..133 "}"
+          SEMICOLON@133..134 ";"
+        WHITESPACE@134..135 "\n"
+        R_CURLY@135..136 "}"
   WHITESPACE@136..137 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0066_match_arm.rast b/crates/syntax/test_data/parser/inline/ok/0066_match_arm.rast
index 566b478ea8f..7d8ce82d97b 100644
--- a/crates/syntax/test_data/parser/inline/ok/0066_match_arm.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0066_match_arm.rast
@@ -9,143 +9,144 @@ SOURCE_FILE@0..167
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..166
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..164
-        MATCH_EXPR@15..163
-          MATCH_KW@15..20 "match"
-          WHITESPACE@20..21 " "
-          TUPLE_EXPR@21..23
-            L_PAREN@21..22 "("
-            R_PAREN@22..23 ")"
-          WHITESPACE@23..24 " "
-          MATCH_ARM_LIST@24..163
-            L_CURLY@24..25 "{"
-            WHITESPACE@25..34 "\n        "
-            MATCH_ARM@34..42
-              WILDCARD_PAT@34..35
-                UNDERSCORE@34..35 "_"
-              WHITESPACE@35..36 " "
-              FAT_ARROW@36..38 "=>"
-              WHITESPACE@38..39 " "
-              TUPLE_EXPR@39..41
-                L_PAREN@39..40 "("
-                R_PAREN@40..41 ")"
-              COMMA@41..42 ","
-            WHITESPACE@42..51 "\n        "
-            MATCH_ARM@51..84
-              WILDCARD_PAT@51..52
-                UNDERSCORE@51..52 "_"
-              WHITESPACE@52..53 " "
-              MATCH_GUARD@53..77
-                IF_KW@53..55 "if"
-                WHITESPACE@55..56 " "
-                BIN_EXPR@56..77
-                  PATH_EXPR@56..60
-                    PATH@56..60
-                      PATH_SEGMENT@56..60
-                        NAME_REF@56..60
-                          IDENT@56..60 "Test"
-                  WHITESPACE@60..61 " "
-                  R_ANGLE@61..62 ">"
-                  WHITESPACE@62..63 " "
-                  RECORD_EXPR@63..77
-                    PATH@63..67
-                      PATH_SEGMENT@63..67
-                        NAME_REF@63..67
-                          IDENT@63..67 "Test"
-                    RECORD_EXPR_FIELD_LIST@67..77
-                      L_CURLY@67..68 "{"
-                      RECORD_EXPR_FIELD@68..76
-                        NAME_REF@68..73
-                          IDENT@68..73 "field"
-                        COLON@73..74 ":"
-                        WHITESPACE@74..75 " "
-                        LITERAL@75..76
-                          INT_NUMBER@75..76 "0"
-                      R_CURLY@76..77 "}"
-              WHITESPACE@77..78 " "
-              FAT_ARROW@78..80 "=>"
-              WHITESPACE@80..81 " "
-              TUPLE_EXPR@81..83
-                L_PAREN@81..82 "("
-                R_PAREN@82..83 ")"
-              COMMA@83..84 ","
-            WHITESPACE@84..93 "\n        "
-            MATCH_ARM@93..110
-              OR_PAT@93..98
-                IDENT_PAT@93..94
-                  NAME@93..94
-                    IDENT@93..94 "X"
-                WHITESPACE@94..95 " "
-                PIPE@95..96 "|"
-                WHITESPACE@96..97 " "
-                IDENT_PAT@97..98
-                  NAME@97..98
-                    IDENT@97..98 "Y"
-              WHITESPACE@98..99 " "
-              MATCH_GUARD@99..103
-                IF_KW@99..101 "if"
-                WHITESPACE@101..102 " "
-                PATH_EXPR@102..103
-                  PATH@102..103
-                    PATH_SEGMENT@102..103
-                      NAME_REF@102..103
-                        IDENT@102..103 "Z"
-              WHITESPACE@103..104 " "
-              FAT_ARROW@104..106 "=>"
-              WHITESPACE@106..107 " "
-              TUPLE_EXPR@107..109
-                L_PAREN@107..108 "("
-                R_PAREN@108..109 ")"
-              COMMA@109..110 ","
-            WHITESPACE@110..119 "\n        "
-            MATCH_ARM@119..138
-              PIPE@119..120 "|"
-              WHITESPACE@120..121 " "
-              OR_PAT@121..126
-                IDENT_PAT@121..122
-                  NAME@121..122
-                    IDENT@121..122 "X"
-                WHITESPACE@122..123 " "
-                PIPE@123..124 "|"
-                WHITESPACE@124..125 " "
-                IDENT_PAT@125..126
-                  NAME@125..126
-                    IDENT@125..126 "Y"
-              WHITESPACE@126..127 " "
-              MATCH_GUARD@127..131
-                IF_KW@127..129 "if"
-                WHITESPACE@129..130 " "
-                PATH_EXPR@130..131
-                  PATH@130..131
-                    PATH_SEGMENT@130..131
-                      NAME_REF@130..131
-                        IDENT@130..131 "Z"
-              WHITESPACE@131..132 " "
-              FAT_ARROW@132..134 "=>"
-              WHITESPACE@134..135 " "
-              TUPLE_EXPR@135..137
-                L_PAREN@135..136 "("
-                R_PAREN@136..137 ")"
-              COMMA@137..138 ","
-            WHITESPACE@138..147 "\n        "
-            MATCH_ARM@147..157
-              PIPE@147..148 "|"
-              WHITESPACE@148..149 " "
-              IDENT_PAT@149..150
-                NAME@149..150
-                  IDENT@149..150 "X"
-              WHITESPACE@150..151 " "
-              FAT_ARROW@151..153 "=>"
-              WHITESPACE@153..154 " "
-              TUPLE_EXPR@154..156
-                L_PAREN@154..155 "("
-                R_PAREN@155..156 ")"
-              COMMA@156..157 ","
-            WHITESPACE@157..162 "\n    "
-            R_CURLY@162..163 "}"
-        SEMICOLON@163..164 ";"
-      WHITESPACE@164..165 "\n"
-      R_CURLY@165..166 "}"
+      STMT_LIST@9..166
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..164
+          MATCH_EXPR@15..163
+            MATCH_KW@15..20 "match"
+            WHITESPACE@20..21 " "
+            TUPLE_EXPR@21..23
+              L_PAREN@21..22 "("
+              R_PAREN@22..23 ")"
+            WHITESPACE@23..24 " "
+            MATCH_ARM_LIST@24..163
+              L_CURLY@24..25 "{"
+              WHITESPACE@25..34 "\n        "
+              MATCH_ARM@34..42
+                WILDCARD_PAT@34..35
+                  UNDERSCORE@34..35 "_"
+                WHITESPACE@35..36 " "
+                FAT_ARROW@36..38 "=>"
+                WHITESPACE@38..39 " "
+                TUPLE_EXPR@39..41
+                  L_PAREN@39..40 "("
+                  R_PAREN@40..41 ")"
+                COMMA@41..42 ","
+              WHITESPACE@42..51 "\n        "
+              MATCH_ARM@51..84
+                WILDCARD_PAT@51..52
+                  UNDERSCORE@51..52 "_"
+                WHITESPACE@52..53 " "
+                MATCH_GUARD@53..77
+                  IF_KW@53..55 "if"
+                  WHITESPACE@55..56 " "
+                  BIN_EXPR@56..77
+                    PATH_EXPR@56..60
+                      PATH@56..60
+                        PATH_SEGMENT@56..60
+                          NAME_REF@56..60
+                            IDENT@56..60 "Test"
+                    WHITESPACE@60..61 " "
+                    R_ANGLE@61..62 ">"
+                    WHITESPACE@62..63 " "
+                    RECORD_EXPR@63..77
+                      PATH@63..67
+                        PATH_SEGMENT@63..67
+                          NAME_REF@63..67
+                            IDENT@63..67 "Test"
+                      RECORD_EXPR_FIELD_LIST@67..77
+                        L_CURLY@67..68 "{"
+                        RECORD_EXPR_FIELD@68..76
+                          NAME_REF@68..73
+                            IDENT@68..73 "field"
+                          COLON@73..74 ":"
+                          WHITESPACE@74..75 " "
+                          LITERAL@75..76
+                            INT_NUMBER@75..76 "0"
+                        R_CURLY@76..77 "}"
+                WHITESPACE@77..78 " "
+                FAT_ARROW@78..80 "=>"
+                WHITESPACE@80..81 " "
+                TUPLE_EXPR@81..83
+                  L_PAREN@81..82 "("
+                  R_PAREN@82..83 ")"
+                COMMA@83..84 ","
+              WHITESPACE@84..93 "\n        "
+              MATCH_ARM@93..110
+                OR_PAT@93..98
+                  IDENT_PAT@93..94
+                    NAME@93..94
+                      IDENT@93..94 "X"
+                  WHITESPACE@94..95 " "
+                  PIPE@95..96 "|"
+                  WHITESPACE@96..97 " "
+                  IDENT_PAT@97..98
+                    NAME@97..98
+                      IDENT@97..98 "Y"
+                WHITESPACE@98..99 " "
+                MATCH_GUARD@99..103
+                  IF_KW@99..101 "if"
+                  WHITESPACE@101..102 " "
+                  PATH_EXPR@102..103
+                    PATH@102..103
+                      PATH_SEGMENT@102..103
+                        NAME_REF@102..103
+                          IDENT@102..103 "Z"
+                WHITESPACE@103..104 " "
+                FAT_ARROW@104..106 "=>"
+                WHITESPACE@106..107 " "
+                TUPLE_EXPR@107..109
+                  L_PAREN@107..108 "("
+                  R_PAREN@108..109 ")"
+                COMMA@109..110 ","
+              WHITESPACE@110..119 "\n        "
+              MATCH_ARM@119..138
+                PIPE@119..120 "|"
+                WHITESPACE@120..121 " "
+                OR_PAT@121..126
+                  IDENT_PAT@121..122
+                    NAME@121..122
+                      IDENT@121..122 "X"
+                  WHITESPACE@122..123 " "
+                  PIPE@123..124 "|"
+                  WHITESPACE@124..125 " "
+                  IDENT_PAT@125..126
+                    NAME@125..126
+                      IDENT@125..126 "Y"
+                WHITESPACE@126..127 " "
+                MATCH_GUARD@127..131
+                  IF_KW@127..129 "if"
+                  WHITESPACE@129..130 " "
+                  PATH_EXPR@130..131
+                    PATH@130..131
+                      PATH_SEGMENT@130..131
+                        NAME_REF@130..131
+                          IDENT@130..131 "Z"
+                WHITESPACE@131..132 " "
+                FAT_ARROW@132..134 "=>"
+                WHITESPACE@134..135 " "
+                TUPLE_EXPR@135..137
+                  L_PAREN@135..136 "("
+                  R_PAREN@136..137 ")"
+                COMMA@137..138 ","
+              WHITESPACE@138..147 "\n        "
+              MATCH_ARM@147..157
+                PIPE@147..148 "|"
+                WHITESPACE@148..149 " "
+                IDENT_PAT@149..150
+                  NAME@149..150
+                    IDENT@149..150 "X"
+                WHITESPACE@150..151 " "
+                FAT_ARROW@151..153 "=>"
+                WHITESPACE@153..154 " "
+                TUPLE_EXPR@154..156
+                  L_PAREN@154..155 "("
+                  R_PAREN@155..156 ")"
+                COMMA@156..157 ","
+              WHITESPACE@157..162 "\n    "
+              R_CURLY@162..163 "}"
+          SEMICOLON@163..164 ";"
+        WHITESPACE@164..165 "\n"
+        R_CURLY@165..166 "}"
   WHITESPACE@166..167 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0070_stmt_bin_expr_ambiguity.rast b/crates/syntax/test_data/parser/inline/ok/0070_stmt_bin_expr_ambiguity.rast
index 509c54c2acf..1a7dcd1bc27 100644
--- a/crates/syntax/test_data/parser/inline/ok/0070_stmt_bin_expr_ambiguity.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0070_stmt_bin_expr_ambiguity.rast
@@ -9,42 +9,45 @@ SOURCE_FILE@0..44
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..43
-      L_CURLY@7..8 "{"
-      WHITESPACE@8..13 "\n    "
-      LET_STMT@13..29
-        LET_KW@13..16 "let"
-        WHITESPACE@16..17 " "
-        WILDCARD_PAT@17..18
-          UNDERSCORE@17..18 "_"
-        WHITESPACE@18..19 " "
-        EQ@19..20 "="
-        WHITESPACE@20..21 " "
-        BIN_EXPR@21..28
-          BLOCK_EXPR@21..24
-            L_CURLY@21..22 "{"
-            LITERAL@22..23
-              INT_NUMBER@22..23 "1"
-            R_CURLY@23..24 "}"
-          WHITESPACE@24..25 " "
-          AMP@25..26 "&"
-          WHITESPACE@26..27 " "
-          LITERAL@27..28
-            INT_NUMBER@27..28 "2"
-        SEMICOLON@28..29 ";"
-      WHITESPACE@29..34 "\n    "
-      EXPR_STMT@34..37
-        BLOCK_EXPR@34..37
-          L_CURLY@34..35 "{"
-          LITERAL@35..36
-            INT_NUMBER@35..36 "1"
-          R_CURLY@36..37 "}"
-      WHITESPACE@37..38 " "
-      EXPR_STMT@38..41
-        REF_EXPR@38..40
-          AMP@38..39 "&"
-          LITERAL@39..40
-            INT_NUMBER@39..40 "2"
-        SEMICOLON@40..41 ";"
-      WHITESPACE@41..42 "\n"
-      R_CURLY@42..43 "}"
+      STMT_LIST@7..43
+        L_CURLY@7..8 "{"
+        WHITESPACE@8..13 "\n    "
+        LET_STMT@13..29
+          LET_KW@13..16 "let"
+          WHITESPACE@16..17 " "
+          WILDCARD_PAT@17..18
+            UNDERSCORE@17..18 "_"
+          WHITESPACE@18..19 " "
+          EQ@19..20 "="
+          WHITESPACE@20..21 " "
+          BIN_EXPR@21..28
+            BLOCK_EXPR@21..24
+              STMT_LIST@21..24
+                L_CURLY@21..22 "{"
+                LITERAL@22..23
+                  INT_NUMBER@22..23 "1"
+                R_CURLY@23..24 "}"
+            WHITESPACE@24..25 " "
+            AMP@25..26 "&"
+            WHITESPACE@26..27 " "
+            LITERAL@27..28
+              INT_NUMBER@27..28 "2"
+          SEMICOLON@28..29 ";"
+        WHITESPACE@29..34 "\n    "
+        EXPR_STMT@34..37
+          BLOCK_EXPR@34..37
+            STMT_LIST@34..37
+              L_CURLY@34..35 "{"
+              LITERAL@35..36
+                INT_NUMBER@35..36 "1"
+              R_CURLY@36..37 "}"
+        WHITESPACE@37..38 " "
+        EXPR_STMT@38..41
+          REF_EXPR@38..40
+            AMP@38..39 "&"
+            LITERAL@39..40
+              INT_NUMBER@39..40 "2"
+          SEMICOLON@40..41 ";"
+        WHITESPACE@41..42 "\n"
+        R_CURLY@42..43 "}"
   WHITESPACE@43..44 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0071_match_expr.rast b/crates/syntax/test_data/parser/inline/ok/0071_match_expr.rast
index d34d98ced0c..2897bedfb75 100644
--- a/crates/syntax/test_data/parser/inline/ok/0071_match_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0071_match_expr.rast
@@ -9,85 +9,88 @@ SOURCE_FILE@0..97
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..96
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..28
-        MATCH_EXPR@15..27
-          MATCH_KW@15..20 "match"
-          WHITESPACE@20..21 " "
-          TUPLE_EXPR@21..23
-            L_PAREN@21..22 "("
-            R_PAREN@22..23 ")"
-          WHITESPACE@23..24 " "
-          MATCH_ARM_LIST@24..27
-            L_CURLY@24..25 "{"
-            WHITESPACE@25..26 " "
-            R_CURLY@26..27 "}"
-        SEMICOLON@27..28 ";"
-      WHITESPACE@28..33 "\n    "
-      EXPR_STMT@33..44
-        MATCH_EXPR@33..43
-          MATCH_KW@33..38 "match"
-          WHITESPACE@38..39 " "
-          PATH_EXPR@39..40
-            PATH@39..40
-              PATH_SEGMENT@39..40
-                NAME_REF@39..40
-                  IDENT@39..40 "S"
-          WHITESPACE@40..41 " "
-          MATCH_ARM_LIST@41..43
-            L_CURLY@41..42 "{"
-            R_CURLY@42..43 "}"
-        SEMICOLON@43..44 ";"
-      WHITESPACE@44..49 "\n    "
-      EXPR_STMT@49..71
-        MATCH_EXPR@49..70
-          MATCH_KW@49..54 "match"
-          WHITESPACE@54..55 " "
-          BLOCK_EXPR@55..58
-            L_CURLY@55..56 "{"
-            WHITESPACE@56..57 " "
-            R_CURLY@57..58 "}"
-          WHITESPACE@58..59 " "
-          MATCH_ARM_LIST@59..70
-            L_CURLY@59..60 "{"
-            WHITESPACE@60..61 " "
-            MATCH_ARM@61..68
-              WILDCARD_PAT@61..62
-                UNDERSCORE@61..62 "_"
-              WHITESPACE@62..63 " "
-              FAT_ARROW@63..65 "=>"
-              WHITESPACE@65..66 " "
-              TUPLE_EXPR@66..68
-                L_PAREN@66..67 "("
-                R_PAREN@67..68 ")"
-            WHITESPACE@68..69 " "
-            R_CURLY@69..70 "}"
-        SEMICOLON@70..71 ";"
-      WHITESPACE@71..76 "\n    "
-      EXPR_STMT@76..94
-        MATCH_EXPR@76..93
-          MATCH_KW@76..81 "match"
-          WHITESPACE@81..82 " "
-          BLOCK_EXPR@82..90
-            L_CURLY@82..83 "{"
-            WHITESPACE@83..84 " "
-            RECORD_EXPR@84..88
-              PATH@84..85
-                PATH_SEGMENT@84..85
-                  NAME_REF@84..85
-                    IDENT@84..85 "S"
-              WHITESPACE@85..86 " "
-              RECORD_EXPR_FIELD_LIST@86..88
-                L_CURLY@86..87 "{"
-                R_CURLY@87..88 "}"
-            WHITESPACE@88..89 " "
-            R_CURLY@89..90 "}"
-          WHITESPACE@90..91 " "
-          MATCH_ARM_LIST@91..93
-            L_CURLY@91..92 "{"
-            R_CURLY@92..93 "}"
-        SEMICOLON@93..94 ";"
-      WHITESPACE@94..95 "\n"
-      R_CURLY@95..96 "}"
+      STMT_LIST@9..96
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..28
+          MATCH_EXPR@15..27
+            MATCH_KW@15..20 "match"
+            WHITESPACE@20..21 " "
+            TUPLE_EXPR@21..23
+              L_PAREN@21..22 "("
+              R_PAREN@22..23 ")"
+            WHITESPACE@23..24 " "
+            MATCH_ARM_LIST@24..27
+              L_CURLY@24..25 "{"
+              WHITESPACE@25..26 " "
+              R_CURLY@26..27 "}"
+          SEMICOLON@27..28 ";"
+        WHITESPACE@28..33 "\n    "
+        EXPR_STMT@33..44
+          MATCH_EXPR@33..43
+            MATCH_KW@33..38 "match"
+            WHITESPACE@38..39 " "
+            PATH_EXPR@39..40
+              PATH@39..40
+                PATH_SEGMENT@39..40
+                  NAME_REF@39..40
+                    IDENT@39..40 "S"
+            WHITESPACE@40..41 " "
+            MATCH_ARM_LIST@41..43
+              L_CURLY@41..42 "{"
+              R_CURLY@42..43 "}"
+          SEMICOLON@43..44 ";"
+        WHITESPACE@44..49 "\n    "
+        EXPR_STMT@49..71
+          MATCH_EXPR@49..70
+            MATCH_KW@49..54 "match"
+            WHITESPACE@54..55 " "
+            BLOCK_EXPR@55..58
+              STMT_LIST@55..58
+                L_CURLY@55..56 "{"
+                WHITESPACE@56..57 " "
+                R_CURLY@57..58 "}"
+            WHITESPACE@58..59 " "
+            MATCH_ARM_LIST@59..70
+              L_CURLY@59..60 "{"
+              WHITESPACE@60..61 " "
+              MATCH_ARM@61..68
+                WILDCARD_PAT@61..62
+                  UNDERSCORE@61..62 "_"
+                WHITESPACE@62..63 " "
+                FAT_ARROW@63..65 "=>"
+                WHITESPACE@65..66 " "
+                TUPLE_EXPR@66..68
+                  L_PAREN@66..67 "("
+                  R_PAREN@67..68 ")"
+              WHITESPACE@68..69 " "
+              R_CURLY@69..70 "}"
+          SEMICOLON@70..71 ";"
+        WHITESPACE@71..76 "\n    "
+        EXPR_STMT@76..94
+          MATCH_EXPR@76..93
+            MATCH_KW@76..81 "match"
+            WHITESPACE@81..82 " "
+            BLOCK_EXPR@82..90
+              STMT_LIST@82..90
+                L_CURLY@82..83 "{"
+                WHITESPACE@83..84 " "
+                RECORD_EXPR@84..88
+                  PATH@84..85
+                    PATH_SEGMENT@84..85
+                      NAME_REF@84..85
+                        IDENT@84..85 "S"
+                  WHITESPACE@85..86 " "
+                  RECORD_EXPR_FIELD_LIST@86..88
+                    L_CURLY@86..87 "{"
+                    R_CURLY@87..88 "}"
+                WHITESPACE@88..89 " "
+                R_CURLY@89..90 "}"
+            WHITESPACE@90..91 " "
+            MATCH_ARM_LIST@91..93
+              L_CURLY@91..92 "{"
+              R_CURLY@92..93 "}"
+          SEMICOLON@93..94 ";"
+        WHITESPACE@94..95 "\n"
+        R_CURLY@95..96 "}"
   WHITESPACE@96..97 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0072_return_expr.rast b/crates/syntax/test_data/parser/inline/ok/0072_return_expr.rast
index 437d7ac0424..be96f8f43fd 100644
--- a/crates/syntax/test_data/parser/inline/ok/0072_return_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0072_return_expr.rast
@@ -9,20 +9,21 @@ SOURCE_FILE@0..40
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..39
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..22
-        RETURN_EXPR@15..21
-          RETURN_KW@15..21 "return"
-        SEMICOLON@21..22 ";"
-      WHITESPACE@22..27 "\n    "
-      EXPR_STMT@27..37
-        RETURN_EXPR@27..36
-          RETURN_KW@27..33 "return"
-          WHITESPACE@33..34 " "
-          LITERAL@34..36
-            INT_NUMBER@34..36 "92"
-        SEMICOLON@36..37 ";"
-      WHITESPACE@37..38 "\n"
-      R_CURLY@38..39 "}"
+      STMT_LIST@9..39
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..22
+          RETURN_EXPR@15..21
+            RETURN_KW@15..21 "return"
+          SEMICOLON@21..22 ";"
+        WHITESPACE@22..27 "\n    "
+        EXPR_STMT@27..37
+          RETURN_EXPR@27..36
+            RETURN_KW@27..33 "return"
+            WHITESPACE@33..34 " "
+            LITERAL@34..36
+              INT_NUMBER@34..36 "92"
+          SEMICOLON@36..37 ";"
+        WHITESPACE@37..38 "\n"
+        R_CURLY@38..39 "}"
   WHITESPACE@39..40 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0074_stmt_postfix_expr_ambiguity.rast b/crates/syntax/test_data/parser/inline/ok/0074_stmt_postfix_expr_ambiguity.rast
index 3a789b9f510..43e85c53a95 100644
--- a/crates/syntax/test_data/parser/inline/ok/0074_stmt_postfix_expr_ambiguity.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0074_stmt_postfix_expr_ambiguity.rast
@@ -9,51 +9,55 @@ SOURCE_FILE@0..84
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..83
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      MATCH_EXPR@15..81
-        MATCH_KW@15..20 "match"
-        WHITESPACE@20..21 " "
-        TUPLE_EXPR@21..23
-          L_PAREN@21..22 "("
-          R_PAREN@22..23 ")"
-        WHITESPACE@23..24 " "
-        MATCH_ARM_LIST@24..81
-          L_CURLY@24..25 "{"
-          WHITESPACE@25..34 "\n        "
-          MATCH_ARM@34..41
-            WILDCARD_PAT@34..35
-              UNDERSCORE@34..35 "_"
-            WHITESPACE@35..36 " "
-            FAT_ARROW@36..38 "=>"
-            WHITESPACE@38..39 " "
-            BLOCK_EXPR@39..41
-              L_CURLY@39..40 "{"
-              R_CURLY@40..41 "}"
-          WHITESPACE@41..50 "\n        "
-          MATCH_ARM@50..58
-            TUPLE_PAT@50..52
-              L_PAREN@50..51 "("
-              R_PAREN@51..52 ")"
-            WHITESPACE@52..53 " "
-            FAT_ARROW@53..55 "=>"
-            WHITESPACE@55..56 " "
-            BLOCK_EXPR@56..58
-              L_CURLY@56..57 "{"
-              R_CURLY@57..58 "}"
-          WHITESPACE@58..67 "\n        "
-          MATCH_ARM@67..75
-            SLICE_PAT@67..69
-              L_BRACK@67..68 "["
-              R_BRACK@68..69 "]"
-            WHITESPACE@69..70 " "
-            FAT_ARROW@70..72 "=>"
-            WHITESPACE@72..73 " "
-            BLOCK_EXPR@73..75
-              L_CURLY@73..74 "{"
-              R_CURLY@74..75 "}"
-          WHITESPACE@75..80 "\n    "
-          R_CURLY@80..81 "}"
-      WHITESPACE@81..82 "\n"
-      R_CURLY@82..83 "}"
+      STMT_LIST@9..83
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        MATCH_EXPR@15..81
+          MATCH_KW@15..20 "match"
+          WHITESPACE@20..21 " "
+          TUPLE_EXPR@21..23
+            L_PAREN@21..22 "("
+            R_PAREN@22..23 ")"
+          WHITESPACE@23..24 " "
+          MATCH_ARM_LIST@24..81
+            L_CURLY@24..25 "{"
+            WHITESPACE@25..34 "\n        "
+            MATCH_ARM@34..41
+              WILDCARD_PAT@34..35
+                UNDERSCORE@34..35 "_"
+              WHITESPACE@35..36 " "
+              FAT_ARROW@36..38 "=>"
+              WHITESPACE@38..39 " "
+              BLOCK_EXPR@39..41
+                STMT_LIST@39..41
+                  L_CURLY@39..40 "{"
+                  R_CURLY@40..41 "}"
+            WHITESPACE@41..50 "\n        "
+            MATCH_ARM@50..58
+              TUPLE_PAT@50..52
+                L_PAREN@50..51 "("
+                R_PAREN@51..52 ")"
+              WHITESPACE@52..53 " "
+              FAT_ARROW@53..55 "=>"
+              WHITESPACE@55..56 " "
+              BLOCK_EXPR@56..58
+                STMT_LIST@56..58
+                  L_CURLY@56..57 "{"
+                  R_CURLY@57..58 "}"
+            WHITESPACE@58..67 "\n        "
+            MATCH_ARM@67..75
+              SLICE_PAT@67..69
+                L_BRACK@67..68 "["
+                R_BRACK@68..69 "]"
+              WHITESPACE@69..70 " "
+              FAT_ARROW@70..72 "=>"
+              WHITESPACE@72..73 " "
+              BLOCK_EXPR@73..75
+                STMT_LIST@73..75
+                  L_CURLY@73..74 "{"
+                  R_CURLY@74..75 "}"
+            WHITESPACE@75..80 "\n    "
+            R_CURLY@80..81 "}"
+        WHITESPACE@81..82 "\n"
+        R_CURLY@82..83 "}"
   WHITESPACE@83..84 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0075_block.rast b/crates/syntax/test_data/parser/inline/ok/0075_block.rast
index e847ce9b268..7a05874313b 100644
--- a/crates/syntax/test_data/parser/inline/ok/0075_block.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0075_block.rast
@@ -9,8 +9,9 @@ SOURCE_FILE@0..65
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..9
-      L_CURLY@7..8 "{"
-      R_CURLY@8..9 "}"
+      STMT_LIST@7..9
+        L_CURLY@7..8 "{"
+        R_CURLY@8..9 "}"
   WHITESPACE@9..10 "\n"
   FN@10..31
     FN_KW@10..12 "fn"
@@ -22,21 +23,22 @@ SOURCE_FILE@0..65
       R_PAREN@15..16 ")"
     WHITESPACE@16..17 " "
     BLOCK_EXPR@17..31
-      L_CURLY@17..18 "{"
-      WHITESPACE@18..19 " "
-      LET_STMT@19..29
-        LET_KW@19..22 "let"
-        WHITESPACE@22..23 " "
-        WILDCARD_PAT@23..24
-          UNDERSCORE@23..24 "_"
-        WHITESPACE@24..25 " "
-        EQ@25..26 "="
-        WHITESPACE@26..27 " "
-        LITERAL@27..28
-          INT_NUMBER@27..28 "1"
-        SEMICOLON@28..29 ";"
-      WHITESPACE@29..30 " "
-      R_CURLY@30..31 "}"
+      STMT_LIST@17..31
+        L_CURLY@17..18 "{"
+        WHITESPACE@18..19 " "
+        LET_STMT@19..29
+          LET_KW@19..22 "let"
+          WHITESPACE@22..23 " "
+          WILDCARD_PAT@23..24
+            UNDERSCORE@23..24 "_"
+          WHITESPACE@24..25 " "
+          EQ@25..26 "="
+          WHITESPACE@26..27 " "
+          LITERAL@27..28
+            INT_NUMBER@27..28 "1"
+          SEMICOLON@28..29 ";"
+        WHITESPACE@29..30 " "
+        R_CURLY@30..31 "}"
   WHITESPACE@31..32 "\n"
   FN@32..48
     FN_KW@32..34 "fn"
@@ -48,19 +50,20 @@ SOURCE_FILE@0..65
       R_PAREN@37..38 ")"
     WHITESPACE@38..39 " "
     BLOCK_EXPR@39..48
-      L_CURLY@39..40 "{"
-      WHITESPACE@40..41 " "
-      EXPR_STMT@41..43
-        LITERAL@41..42
-          INT_NUMBER@41..42 "1"
-        SEMICOLON@42..43 ";"
-      WHITESPACE@43..44 " "
-      EXPR_STMT@44..46
-        LITERAL@44..45
-          INT_NUMBER@44..45 "2"
-        SEMICOLON@45..46 ";"
-      WHITESPACE@46..47 " "
-      R_CURLY@47..48 "}"
+      STMT_LIST@39..48
+        L_CURLY@39..40 "{"
+        WHITESPACE@40..41 " "
+        EXPR_STMT@41..43
+          LITERAL@41..42
+            INT_NUMBER@41..42 "1"
+          SEMICOLON@42..43 ";"
+        WHITESPACE@43..44 " "
+        EXPR_STMT@44..46
+          LITERAL@44..45
+            INT_NUMBER@44..45 "2"
+          SEMICOLON@45..46 ";"
+        WHITESPACE@46..47 " "
+        R_CURLY@47..48 "}"
   WHITESPACE@48..49 "\n"
   FN@49..64
     FN_KW@49..51 "fn"
@@ -72,15 +75,16 @@ SOURCE_FILE@0..65
       R_PAREN@54..55 ")"
     WHITESPACE@55..56 " "
     BLOCK_EXPR@56..64
-      L_CURLY@56..57 "{"
-      WHITESPACE@57..58 " "
-      EXPR_STMT@58..60
-        LITERAL@58..59
-          INT_NUMBER@58..59 "1"
-        SEMICOLON@59..60 ";"
-      WHITESPACE@60..61 " "
-      LITERAL@61..62
-        INT_NUMBER@61..62 "2"
-      WHITESPACE@62..63 " "
-      R_CURLY@63..64 "}"
+      STMT_LIST@56..64
+        L_CURLY@56..57 "{"
+        WHITESPACE@57..58 " "
+        EXPR_STMT@58..60
+          LITERAL@58..59
+            INT_NUMBER@58..59 "1"
+          SEMICOLON@59..60 ";"
+        WHITESPACE@60..61 " "
+        LITERAL@61..62
+          INT_NUMBER@61..62 "2"
+        WHITESPACE@62..63 " "
+        R_CURLY@63..64 "}"
   WHITESPACE@64..65 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0076_function_where_clause.rast b/crates/syntax/test_data/parser/inline/ok/0076_function_where_clause.rast
index 96217a7fdb4..24e41f79286 100644
--- a/crates/syntax/test_data/parser/inline/ok/0076_function_where_clause.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0076_function_where_clause.rast
@@ -34,6 +34,7 @@ SOURCE_FILE@0..29
                     IDENT@21..25 "Copy"
     WHITESPACE@25..26 " "
     BLOCK_EXPR@26..28
-      L_CURLY@26..27 "{"
-      R_CURLY@27..28 "}"
+      STMT_LIST@26..28
+        L_CURLY@26..27 "{"
+        R_CURLY@27..28 "}"
   WHITESPACE@28..29 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0077_try_expr.rast b/crates/syntax/test_data/parser/inline/ok/0077_try_expr.rast
index 33e6fb93f7a..89fcbadbe53 100644
--- a/crates/syntax/test_data/parser/inline/ok/0077_try_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0077_try_expr.rast
@@ -9,17 +9,18 @@ SOURCE_FILE@0..21
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..20
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..18
-        TRY_EXPR@15..17
-          PATH_EXPR@15..16
-            PATH@15..16
-              PATH_SEGMENT@15..16
-                NAME_REF@15..16
-                  IDENT@15..16 "x"
-          QUESTION@16..17 "?"
-        SEMICOLON@17..18 ";"
-      WHITESPACE@18..19 "\n"
-      R_CURLY@19..20 "}"
+      STMT_LIST@9..20
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..18
+          TRY_EXPR@15..17
+            PATH_EXPR@15..16
+              PATH@15..16
+                PATH_SEGMENT@15..16
+                  NAME_REF@15..16
+                    IDENT@15..16 "x"
+            QUESTION@16..17 "?"
+          SEMICOLON@17..18 ";"
+        WHITESPACE@18..19 "\n"
+        R_CURLY@19..20 "}"
   WHITESPACE@20..21 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0080_postfix_range.rast b/crates/syntax/test_data/parser/inline/ok/0080_postfix_range.rast
index b3003577cc0..b431028a451 100644
--- a/crates/syntax/test_data/parser/inline/ok/0080_postfix_range.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0080_postfix_range.rast
@@ -9,87 +9,88 @@ SOURCE_FILE@0..89
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..88
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      LET_STMT@15..27
-        LET_KW@15..18 "let"
-        WHITESPACE@18..19 " "
-        IDENT_PAT@19..20
-          NAME@19..20
-            IDENT@19..20 "x"
-        WHITESPACE@20..21 " "
-        EQ@21..22 "="
-        WHITESPACE@22..23 " "
-        RANGE_EXPR@23..26
-          LITERAL@23..24
-            INT_NUMBER@23..24 "1"
-          DOT2@24..26 ".."
-        SEMICOLON@26..27 ";"
-      WHITESPACE@27..32 "\n    "
-      EXPR_STMT@32..54
-        MATCH_EXPR@32..53
-          MATCH_KW@32..37 "match"
-          WHITESPACE@37..38 " "
-          RANGE_EXPR@38..41
-            LITERAL@38..39
-              INT_NUMBER@38..39 "1"
-            DOT2@39..41 ".."
-          WHITESPACE@41..42 " "
-          MATCH_ARM_LIST@42..53
-            L_CURLY@42..43 "{"
-            WHITESPACE@43..44 " "
-            MATCH_ARM@44..51
-              WILDCARD_PAT@44..45
-                UNDERSCORE@44..45 "_"
-              WHITESPACE@45..46 " "
-              FAT_ARROW@46..48 "=>"
-              WHITESPACE@48..49 " "
-              TUPLE_EXPR@49..51
-                L_PAREN@49..50 "("
-                R_PAREN@50..51 ")"
-            WHITESPACE@51..52 " "
-            R_CURLY@52..53 "}"
-        SEMICOLON@53..54 ";"
-      WHITESPACE@54..59 "\n    "
-      EXPR_STMT@59..86
-        MATCH_EXPR@59..85
-          MATCH_KW@59..64 "match"
-          WHITESPACE@64..65 " "
-          RANGE_EXPR@65..73
-            METHOD_CALL_EXPR@65..70
-              PATH_EXPR@65..66
-                PATH@65..66
-                  PATH_SEGMENT@65..66
-                    NAME_REF@65..66
-                      IDENT@65..66 "a"
-              DOT@66..67 "."
-              NAME_REF@67..68
-                IDENT@67..68 "b"
-              ARG_LIST@68..70
-                L_PAREN@68..69 "("
-                R_PAREN@69..70 ")"
-            DOT2@70..72 ".."
-            PATH_EXPR@72..73
-              PATH@72..73
-                PATH_SEGMENT@72..73
-                  NAME_REF@72..73
-                    IDENT@72..73 "S"
-          WHITESPACE@73..74 " "
-          MATCH_ARM_LIST@74..85
-            L_CURLY@74..75 "{"
-            WHITESPACE@75..76 " "
-            MATCH_ARM@76..83
-              WILDCARD_PAT@76..77
-                UNDERSCORE@76..77 "_"
-              WHITESPACE@77..78 " "
-              FAT_ARROW@78..80 "=>"
-              WHITESPACE@80..81 " "
-              TUPLE_EXPR@81..83
-                L_PAREN@81..82 "("
-                R_PAREN@82..83 ")"
-            WHITESPACE@83..84 " "
-            R_CURLY@84..85 "}"
-        SEMICOLON@85..86 ";"
-      WHITESPACE@86..87 "\n"
-      R_CURLY@87..88 "}"
+      STMT_LIST@9..88
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        LET_STMT@15..27
+          LET_KW@15..18 "let"
+          WHITESPACE@18..19 " "
+          IDENT_PAT@19..20
+            NAME@19..20
+              IDENT@19..20 "x"
+          WHITESPACE@20..21 " "
+          EQ@21..22 "="
+          WHITESPACE@22..23 " "
+          RANGE_EXPR@23..26
+            LITERAL@23..24
+              INT_NUMBER@23..24 "1"
+            DOT2@24..26 ".."
+          SEMICOLON@26..27 ";"
+        WHITESPACE@27..32 "\n    "
+        EXPR_STMT@32..54
+          MATCH_EXPR@32..53
+            MATCH_KW@32..37 "match"
+            WHITESPACE@37..38 " "
+            RANGE_EXPR@38..41
+              LITERAL@38..39
+                INT_NUMBER@38..39 "1"
+              DOT2@39..41 ".."
+            WHITESPACE@41..42 " "
+            MATCH_ARM_LIST@42..53
+              L_CURLY@42..43 "{"
+              WHITESPACE@43..44 " "
+              MATCH_ARM@44..51
+                WILDCARD_PAT@44..45
+                  UNDERSCORE@44..45 "_"
+                WHITESPACE@45..46 " "
+                FAT_ARROW@46..48 "=>"
+                WHITESPACE@48..49 " "
+                TUPLE_EXPR@49..51
+                  L_PAREN@49..50 "("
+                  R_PAREN@50..51 ")"
+              WHITESPACE@51..52 " "
+              R_CURLY@52..53 "}"
+          SEMICOLON@53..54 ";"
+        WHITESPACE@54..59 "\n    "
+        EXPR_STMT@59..86
+          MATCH_EXPR@59..85
+            MATCH_KW@59..64 "match"
+            WHITESPACE@64..65 " "
+            RANGE_EXPR@65..73
+              METHOD_CALL_EXPR@65..70
+                PATH_EXPR@65..66
+                  PATH@65..66
+                    PATH_SEGMENT@65..66
+                      NAME_REF@65..66
+                        IDENT@65..66 "a"
+                DOT@66..67 "."
+                NAME_REF@67..68
+                  IDENT@67..68 "b"
+                ARG_LIST@68..70
+                  L_PAREN@68..69 "("
+                  R_PAREN@69..70 ")"
+              DOT2@70..72 ".."
+              PATH_EXPR@72..73
+                PATH@72..73
+                  PATH_SEGMENT@72..73
+                    NAME_REF@72..73
+                      IDENT@72..73 "S"
+            WHITESPACE@73..74 " "
+            MATCH_ARM_LIST@74..85
+              L_CURLY@74..75 "{"
+              WHITESPACE@75..76 " "
+              MATCH_ARM@76..83
+                WILDCARD_PAT@76..77
+                  UNDERSCORE@76..77 "_"
+                WHITESPACE@77..78 " "
+                FAT_ARROW@78..80 "=>"
+                WHITESPACE@80..81 " "
+                TUPLE_EXPR@81..83
+                  L_PAREN@81..82 "("
+                  R_PAREN@82..83 ")"
+              WHITESPACE@83..84 " "
+              R_CURLY@84..85 "}"
+          SEMICOLON@85..86 ";"
+        WHITESPACE@86..87 "\n"
+        R_CURLY@87..88 "}"
   WHITESPACE@88..89 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0082_ref_expr.rast b/crates/syntax/test_data/parser/inline/ok/0082_ref_expr.rast
index 70b975c0b14..9fda28a2718 100644
--- a/crates/syntax/test_data/parser/inline/ok/0082_ref_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0082_ref_expr.rast
@@ -9,130 +9,131 @@ SOURCE_FILE@0..200
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..199
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      COMMENT@15..36 "// reference operator"
-      WHITESPACE@36..41 "\n    "
-      LET_STMT@41..52
-        LET_KW@41..44 "let"
-        WHITESPACE@44..45 " "
-        WILDCARD_PAT@45..46
-          UNDERSCORE@45..46 "_"
-        WHITESPACE@46..47 " "
-        EQ@47..48 "="
-        WHITESPACE@48..49 " "
-        REF_EXPR@49..51
-          AMP@49..50 "&"
-          LITERAL@50..51
-            INT_NUMBER@50..51 "1"
-        SEMICOLON@51..52 ";"
-      WHITESPACE@52..57 "\n    "
-      LET_STMT@57..75
-        LET_KW@57..60 "let"
-        WHITESPACE@60..61 " "
-        WILDCARD_PAT@61..62
-          UNDERSCORE@61..62 "_"
-        WHITESPACE@62..63 " "
-        EQ@63..64 "="
-        WHITESPACE@64..65 " "
-        REF_EXPR@65..74
-          AMP@65..66 "&"
-          MUT_KW@66..69 "mut"
-          WHITESPACE@69..70 " "
-          REF_EXPR@70..74
-            AMP@70..71 "&"
-            CALL_EXPR@71..74
-              PATH_EXPR@71..72
-                PATH@71..72
-                  PATH_SEGMENT@71..72
-                    NAME_REF@71..72
-                      IDENT@71..72 "f"
-              ARG_LIST@72..74
-                L_PAREN@72..73 "("
-                R_PAREN@73..74 ")"
-        SEMICOLON@74..75 ";"
-      WHITESPACE@75..80 "\n    "
-      LET_STMT@80..93
-        LET_KW@80..83 "let"
-        WHITESPACE@83..84 " "
-        WILDCARD_PAT@84..85
-          UNDERSCORE@84..85 "_"
-        WHITESPACE@85..86 " "
-        EQ@86..87 "="
-        WHITESPACE@87..88 " "
-        REF_EXPR@88..92
-          AMP@88..89 "&"
-          PATH_EXPR@89..92
-            PATH@89..92
-              PATH_SEGMENT@89..92
-                NAME_REF@89..92
-                  IDENT@89..92 "raw"
-        SEMICOLON@92..93 ";"
-      WHITESPACE@93..98 "\n    "
-      LET_STMT@98..113
-        LET_KW@98..101 "let"
-        WHITESPACE@101..102 " "
-        WILDCARD_PAT@102..103
-          UNDERSCORE@102..103 "_"
-        WHITESPACE@103..104 " "
-        EQ@104..105 "="
-        WHITESPACE@105..106 " "
-        REF_EXPR@106..112
-          AMP@106..107 "&"
-          FIELD_EXPR@107..112
-            PATH_EXPR@107..110
-              PATH@107..110
-                PATH_SEGMENT@107..110
-                  NAME_REF@107..110
-                    IDENT@107..110 "raw"
-            DOT@110..111 "."
-            NAME_REF@111..112
-              INT_NUMBER@111..112 "0"
-        SEMICOLON@112..113 ";"
-      WHITESPACE@113..118 "\n    "
-      COMMENT@118..143 "// raw reference oper ..."
-      WHITESPACE@143..148 "\n    "
-      LET_STMT@148..169
-        LET_KW@148..151 "let"
-        WHITESPACE@151..152 " "
-        WILDCARD_PAT@152..153
-          UNDERSCORE@152..153 "_"
-        WHITESPACE@153..154 " "
-        EQ@154..155 "="
-        WHITESPACE@155..156 " "
-        REF_EXPR@156..168
-          AMP@156..157 "&"
-          RAW_KW@157..160 "raw"
-          WHITESPACE@160..161 " "
-          MUT_KW@161..164 "mut"
-          WHITESPACE@164..165 " "
-          PATH_EXPR@165..168
-            PATH@165..168
-              PATH_SEGMENT@165..168
-                NAME_REF@165..168
-                  IDENT@165..168 "foo"
-        SEMICOLON@168..169 ";"
-      WHITESPACE@169..174 "\n    "
-      LET_STMT@174..197
-        LET_KW@174..177 "let"
-        WHITESPACE@177..178 " "
-        WILDCARD_PAT@178..179
-          UNDERSCORE@178..179 "_"
-        WHITESPACE@179..180 " "
-        EQ@180..181 "="
-        WHITESPACE@181..182 " "
-        REF_EXPR@182..196
-          AMP@182..183 "&"
-          RAW_KW@183..186 "raw"
-          WHITESPACE@186..187 " "
-          CONST_KW@187..192 "const"
-          WHITESPACE@192..193 " "
-          PATH_EXPR@193..196
-            PATH@193..196
-              PATH_SEGMENT@193..196
-                NAME_REF@193..196
-                  IDENT@193..196 "foo"
-        SEMICOLON@196..197 ";"
-      WHITESPACE@197..198 "\n"
-      R_CURLY@198..199 "}"
+      STMT_LIST@9..199
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        COMMENT@15..36 "// reference operator"
+        WHITESPACE@36..41 "\n    "
+        LET_STMT@41..52
+          LET_KW@41..44 "let"
+          WHITESPACE@44..45 " "
+          WILDCARD_PAT@45..46
+            UNDERSCORE@45..46 "_"
+          WHITESPACE@46..47 " "
+          EQ@47..48 "="
+          WHITESPACE@48..49 " "
+          REF_EXPR@49..51
+            AMP@49..50 "&"
+            LITERAL@50..51
+              INT_NUMBER@50..51 "1"
+          SEMICOLON@51..52 ";"
+        WHITESPACE@52..57 "\n    "
+        LET_STMT@57..75
+          LET_KW@57..60 "let"
+          WHITESPACE@60..61 " "
+          WILDCARD_PAT@61..62
+            UNDERSCORE@61..62 "_"
+          WHITESPACE@62..63 " "
+          EQ@63..64 "="
+          WHITESPACE@64..65 " "
+          REF_EXPR@65..74
+            AMP@65..66 "&"
+            MUT_KW@66..69 "mut"
+            WHITESPACE@69..70 " "
+            REF_EXPR@70..74
+              AMP@70..71 "&"
+              CALL_EXPR@71..74
+                PATH_EXPR@71..72
+                  PATH@71..72
+                    PATH_SEGMENT@71..72
+                      NAME_REF@71..72
+                        IDENT@71..72 "f"
+                ARG_LIST@72..74
+                  L_PAREN@72..73 "("
+                  R_PAREN@73..74 ")"
+          SEMICOLON@74..75 ";"
+        WHITESPACE@75..80 "\n    "
+        LET_STMT@80..93
+          LET_KW@80..83 "let"
+          WHITESPACE@83..84 " "
+          WILDCARD_PAT@84..85
+            UNDERSCORE@84..85 "_"
+          WHITESPACE@85..86 " "
+          EQ@86..87 "="
+          WHITESPACE@87..88 " "
+          REF_EXPR@88..92
+            AMP@88..89 "&"
+            PATH_EXPR@89..92
+              PATH@89..92
+                PATH_SEGMENT@89..92
+                  NAME_REF@89..92
+                    IDENT@89..92 "raw"
+          SEMICOLON@92..93 ";"
+        WHITESPACE@93..98 "\n    "
+        LET_STMT@98..113
+          LET_KW@98..101 "let"
+          WHITESPACE@101..102 " "
+          WILDCARD_PAT@102..103
+            UNDERSCORE@102..103 "_"
+          WHITESPACE@103..104 " "
+          EQ@104..105 "="
+          WHITESPACE@105..106 " "
+          REF_EXPR@106..112
+            AMP@106..107 "&"
+            FIELD_EXPR@107..112
+              PATH_EXPR@107..110
+                PATH@107..110
+                  PATH_SEGMENT@107..110
+                    NAME_REF@107..110
+                      IDENT@107..110 "raw"
+              DOT@110..111 "."
+              NAME_REF@111..112
+                INT_NUMBER@111..112 "0"
+          SEMICOLON@112..113 ";"
+        WHITESPACE@113..118 "\n    "
+        COMMENT@118..143 "// raw reference oper ..."
+        WHITESPACE@143..148 "\n    "
+        LET_STMT@148..169
+          LET_KW@148..151 "let"
+          WHITESPACE@151..152 " "
+          WILDCARD_PAT@152..153
+            UNDERSCORE@152..153 "_"
+          WHITESPACE@153..154 " "
+          EQ@154..155 "="
+          WHITESPACE@155..156 " "
+          REF_EXPR@156..168
+            AMP@156..157 "&"
+            RAW_KW@157..160 "raw"
+            WHITESPACE@160..161 " "
+            MUT_KW@161..164 "mut"
+            WHITESPACE@164..165 " "
+            PATH_EXPR@165..168
+              PATH@165..168
+                PATH_SEGMENT@165..168
+                  NAME_REF@165..168
+                    IDENT@165..168 "foo"
+          SEMICOLON@168..169 ";"
+        WHITESPACE@169..174 "\n    "
+        LET_STMT@174..197
+          LET_KW@174..177 "let"
+          WHITESPACE@177..178 " "
+          WILDCARD_PAT@178..179
+            UNDERSCORE@178..179 "_"
+          WHITESPACE@179..180 " "
+          EQ@180..181 "="
+          WHITESPACE@181..182 " "
+          REF_EXPR@182..196
+            AMP@182..183 "&"
+            RAW_KW@183..186 "raw"
+            WHITESPACE@186..187 " "
+            CONST_KW@187..192 "const"
+            WHITESPACE@192..193 " "
+            PATH_EXPR@193..196
+              PATH@193..196
+                PATH_SEGMENT@193..196
+                  NAME_REF@193..196
+                    IDENT@193..196 "foo"
+          SEMICOLON@196..197 ";"
+        WHITESPACE@197..198 "\n"
+        R_CURLY@198..199 "}"
   WHITESPACE@199..200 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0085_expr_literals.rast b/crates/syntax/test_data/parser/inline/ok/0085_expr_literals.rast
index f784e96e003..ca68b4b1091 100644
--- a/crates/syntax/test_data/parser/inline/ok/0085_expr_literals.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0085_expr_literals.rast
@@ -9,127 +9,128 @@ SOURCE_FILE@0..189
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..188
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      LET_STMT@15..28
-        LET_KW@15..18 "let"
-        WHITESPACE@18..19 " "
-        WILDCARD_PAT@19..20
-          UNDERSCORE@19..20 "_"
-        WHITESPACE@20..21 " "
-        EQ@21..22 "="
-        WHITESPACE@22..23 " "
-        LITERAL@23..27
-          TRUE_KW@23..27 "true"
-        SEMICOLON@27..28 ";"
-      WHITESPACE@28..33 "\n    "
-      LET_STMT@33..47
-        LET_KW@33..36 "let"
-        WHITESPACE@36..37 " "
-        WILDCARD_PAT@37..38
-          UNDERSCORE@37..38 "_"
-        WHITESPACE@38..39 " "
-        EQ@39..40 "="
-        WHITESPACE@40..41 " "
-        LITERAL@41..46
-          FALSE_KW@41..46 "false"
-        SEMICOLON@46..47 ";"
-      WHITESPACE@47..52 "\n    "
-      LET_STMT@52..62
-        LET_KW@52..55 "let"
-        WHITESPACE@55..56 " "
-        WILDCARD_PAT@56..57
-          UNDERSCORE@56..57 "_"
-        WHITESPACE@57..58 " "
-        EQ@58..59 "="
-        WHITESPACE@59..60 " "
-        LITERAL@60..61
-          INT_NUMBER@60..61 "1"
-        SEMICOLON@61..62 ";"
-      WHITESPACE@62..67 "\n    "
-      LET_STMT@67..79
-        LET_KW@67..70 "let"
-        WHITESPACE@70..71 " "
-        WILDCARD_PAT@71..72
-          UNDERSCORE@71..72 "_"
-        WHITESPACE@72..73 " "
-        EQ@73..74 "="
-        WHITESPACE@74..75 " "
-        LITERAL@75..78
-          FLOAT_NUMBER@75..78 "2.0"
-        SEMICOLON@78..79 ";"
-      WHITESPACE@79..84 "\n    "
-      LET_STMT@84..97
-        LET_KW@84..87 "let"
-        WHITESPACE@87..88 " "
-        WILDCARD_PAT@88..89
-          UNDERSCORE@88..89 "_"
-        WHITESPACE@89..90 " "
-        EQ@90..91 "="
-        WHITESPACE@91..92 " "
-        LITERAL@92..96
-          BYTE@92..96 "b'a'"
-        SEMICOLON@96..97 ";"
-      WHITESPACE@97..102 "\n    "
-      LET_STMT@102..114
-        LET_KW@102..105 "let"
-        WHITESPACE@105..106 " "
-        WILDCARD_PAT@106..107
-          UNDERSCORE@106..107 "_"
-        WHITESPACE@107..108 " "
-        EQ@108..109 "="
-        WHITESPACE@109..110 " "
-        LITERAL@110..113
-          CHAR@110..113 "'b'"
-        SEMICOLON@113..114 ";"
-      WHITESPACE@114..119 "\n    "
-      LET_STMT@119..131
-        LET_KW@119..122 "let"
-        WHITESPACE@122..123 " "
-        WILDCARD_PAT@123..124
-          UNDERSCORE@123..124 "_"
-        WHITESPACE@124..125 " "
-        EQ@125..126 "="
-        WHITESPACE@126..127 " "
-        LITERAL@127..130
-          STRING@127..130 "\"c\""
-        SEMICOLON@130..131 ";"
-      WHITESPACE@131..136 "\n    "
-      LET_STMT@136..149
-        LET_KW@136..139 "let"
-        WHITESPACE@139..140 " "
-        WILDCARD_PAT@140..141
-          UNDERSCORE@140..141 "_"
-        WHITESPACE@141..142 " "
-        EQ@142..143 "="
-        WHITESPACE@143..144 " "
-        LITERAL@144..148
-          STRING@144..148 "r\"d\""
-        SEMICOLON@148..149 ";"
-      WHITESPACE@149..154 "\n    "
-      LET_STMT@154..167
-        LET_KW@154..157 "let"
-        WHITESPACE@157..158 " "
-        WILDCARD_PAT@158..159
-          UNDERSCORE@158..159 "_"
-        WHITESPACE@159..160 " "
-        EQ@160..161 "="
-        WHITESPACE@161..162 " "
-        LITERAL@162..166
-          BYTE_STRING@162..166 "b\"e\""
-        SEMICOLON@166..167 ";"
-      WHITESPACE@167..172 "\n    "
-      LET_STMT@172..186
-        LET_KW@172..175 "let"
-        WHITESPACE@175..176 " "
-        WILDCARD_PAT@176..177
-          UNDERSCORE@176..177 "_"
-        WHITESPACE@177..178 " "
-        EQ@178..179 "="
-        WHITESPACE@179..180 " "
-        LITERAL@180..185
-          BYTE_STRING@180..185 "br\"f\""
-        SEMICOLON@185..186 ";"
-      WHITESPACE@186..187 "\n"
-      R_CURLY@187..188 "}"
+      STMT_LIST@9..188
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        LET_STMT@15..28
+          LET_KW@15..18 "let"
+          WHITESPACE@18..19 " "
+          WILDCARD_PAT@19..20
+            UNDERSCORE@19..20 "_"
+          WHITESPACE@20..21 " "
+          EQ@21..22 "="
+          WHITESPACE@22..23 " "
+          LITERAL@23..27
+            TRUE_KW@23..27 "true"
+          SEMICOLON@27..28 ";"
+        WHITESPACE@28..33 "\n    "
+        LET_STMT@33..47
+          LET_KW@33..36 "let"
+          WHITESPACE@36..37 " "
+          WILDCARD_PAT@37..38
+            UNDERSCORE@37..38 "_"
+          WHITESPACE@38..39 " "
+          EQ@39..40 "="
+          WHITESPACE@40..41 " "
+          LITERAL@41..46
+            FALSE_KW@41..46 "false"
+          SEMICOLON@46..47 ";"
+        WHITESPACE@47..52 "\n    "
+        LET_STMT@52..62
+          LET_KW@52..55 "let"
+          WHITESPACE@55..56 " "
+          WILDCARD_PAT@56..57
+            UNDERSCORE@56..57 "_"
+          WHITESPACE@57..58 " "
+          EQ@58..59 "="
+          WHITESPACE@59..60 " "
+          LITERAL@60..61
+            INT_NUMBER@60..61 "1"
+          SEMICOLON@61..62 ";"
+        WHITESPACE@62..67 "\n    "
+        LET_STMT@67..79
+          LET_KW@67..70 "let"
+          WHITESPACE@70..71 " "
+          WILDCARD_PAT@71..72
+            UNDERSCORE@71..72 "_"
+          WHITESPACE@72..73 " "
+          EQ@73..74 "="
+          WHITESPACE@74..75 " "
+          LITERAL@75..78
+            FLOAT_NUMBER@75..78 "2.0"
+          SEMICOLON@78..79 ";"
+        WHITESPACE@79..84 "\n    "
+        LET_STMT@84..97
+          LET_KW@84..87 "let"
+          WHITESPACE@87..88 " "
+          WILDCARD_PAT@88..89
+            UNDERSCORE@88..89 "_"
+          WHITESPACE@89..90 " "
+          EQ@90..91 "="
+          WHITESPACE@91..92 " "
+          LITERAL@92..96
+            BYTE@92..96 "b'a'"
+          SEMICOLON@96..97 ";"
+        WHITESPACE@97..102 "\n    "
+        LET_STMT@102..114
+          LET_KW@102..105 "let"
+          WHITESPACE@105..106 " "
+          WILDCARD_PAT@106..107
+            UNDERSCORE@106..107 "_"
+          WHITESPACE@107..108 " "
+          EQ@108..109 "="
+          WHITESPACE@109..110 " "
+          LITERAL@110..113
+            CHAR@110..113 "'b'"
+          SEMICOLON@113..114 ";"
+        WHITESPACE@114..119 "\n    "
+        LET_STMT@119..131
+          LET_KW@119..122 "let"
+          WHITESPACE@122..123 " "
+          WILDCARD_PAT@123..124
+            UNDERSCORE@123..124 "_"
+          WHITESPACE@124..125 " "
+          EQ@125..126 "="
+          WHITESPACE@126..127 " "
+          LITERAL@127..130
+            STRING@127..130 "\"c\""
+          SEMICOLON@130..131 ";"
+        WHITESPACE@131..136 "\n    "
+        LET_STMT@136..149
+          LET_KW@136..139 "let"
+          WHITESPACE@139..140 " "
+          WILDCARD_PAT@140..141
+            UNDERSCORE@140..141 "_"
+          WHITESPACE@141..142 " "
+          EQ@142..143 "="
+          WHITESPACE@143..144 " "
+          LITERAL@144..148
+            STRING@144..148 "r\"d\""
+          SEMICOLON@148..149 ";"
+        WHITESPACE@149..154 "\n    "
+        LET_STMT@154..167
+          LET_KW@154..157 "let"
+          WHITESPACE@157..158 " "
+          WILDCARD_PAT@158..159
+            UNDERSCORE@158..159 "_"
+          WHITESPACE@159..160 " "
+          EQ@160..161 "="
+          WHITESPACE@161..162 " "
+          LITERAL@162..166
+            BYTE_STRING@162..166 "b\"e\""
+          SEMICOLON@166..167 ";"
+        WHITESPACE@167..172 "\n    "
+        LET_STMT@172..186
+          LET_KW@172..175 "let"
+          WHITESPACE@175..176 " "
+          WILDCARD_PAT@176..177
+            UNDERSCORE@176..177 "_"
+          WHITESPACE@177..178 " "
+          EQ@178..179 "="
+          WHITESPACE@179..180 " "
+          LITERAL@180..185
+            BYTE_STRING@180..185 "br\"f\""
+          SEMICOLON@185..186 ";"
+        WHITESPACE@186..187 "\n"
+        R_CURLY@187..188 "}"
   WHITESPACE@188..189 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0086_function_ret_type.rast b/crates/syntax/test_data/parser/inline/ok/0086_function_ret_type.rast
index 70e05a859b1..71d5d127ca8 100644
--- a/crates/syntax/test_data/parser/inline/ok/0086_function_ret_type.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0086_function_ret_type.rast
@@ -9,8 +9,9 @@ SOURCE_FILE@0..30
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..11
-      L_CURLY@9..10 "{"
-      R_CURLY@10..11 "}"
+      STMT_LIST@9..11
+        L_CURLY@9..10 "{"
+        R_CURLY@10..11 "}"
   WHITESPACE@11..12 "\n"
   FN@12..29
     FN_KW@12..14 "fn"
@@ -29,6 +30,7 @@ SOURCE_FILE@0..30
         R_PAREN@25..26 ")"
     WHITESPACE@26..27 " "
     BLOCK_EXPR@27..29
-      L_CURLY@27..28 "{"
-      R_CURLY@28..29 "}"
+      STMT_LIST@27..29
+        L_CURLY@27..28 "{"
+        R_CURLY@28..29 "}"
   WHITESPACE@29..30 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0088_break_ambiguity.rast b/crates/syntax/test_data/parser/inline/ok/0088_break_ambiguity.rast
index f7b839303c3..698b4c40ffd 100644
--- a/crates/syntax/test_data/parser/inline/ok/0088_break_ambiguity.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0088_break_ambiguity.rast
@@ -8,58 +8,62 @@ SOURCE_FILE@0..88
       L_PAREN@6..7 "("
       R_PAREN@7..8 ")"
     BLOCK_EXPR@8..87
-      L_CURLY@8..9 "{"
-      WHITESPACE@9..14 "\n    "
-      EXPR_STMT@14..25
-        IF_EXPR@14..25
-          IF_KW@14..16 "if"
-          WHITESPACE@16..17 " "
-          CONDITION@17..22
-            BREAK_EXPR@17..22
-              BREAK_KW@17..22 "break"
-          WHITESPACE@22..23 " "
-          BLOCK_EXPR@23..25
-            L_CURLY@23..24 "{"
-            R_CURLY@24..25 "}"
-      WHITESPACE@25..30 "\n    "
-      EXPR_STMT@30..44
-        WHILE_EXPR@30..44
-          WHILE_KW@30..35 "while"
-          WHITESPACE@35..36 " "
-          CONDITION@36..41
-            BREAK_EXPR@36..41
-              BREAK_KW@36..41 "break"
-          WHITESPACE@41..42 " "
-          BLOCK_EXPR@42..44
-            L_CURLY@42..43 "{"
-            R_CURLY@43..44 "}"
-      WHITESPACE@44..49 "\n    "
-      EXPR_STMT@49..66
-        FOR_EXPR@49..66
-          FOR_KW@49..52 "for"
-          WHITESPACE@52..53 " "
-          IDENT_PAT@53..54
-            NAME@53..54
-              IDENT@53..54 "i"
-          WHITESPACE@54..55 " "
-          IN_KW@55..57 "in"
-          WHITESPACE@57..58 " "
-          BREAK_EXPR@58..63
-            BREAK_KW@58..63 "break"
-          WHITESPACE@63..64 " "
-          BLOCK_EXPR@64..66
-            L_CURLY@64..65 "{"
-            R_CURLY@65..66 "}"
-      WHITESPACE@66..71 "\n    "
-      MATCH_EXPR@71..85
-        MATCH_KW@71..76 "match"
-        WHITESPACE@76..77 " "
-        BREAK_EXPR@77..82
-          BREAK_KW@77..82 "break"
-        WHITESPACE@82..83 " "
-        MATCH_ARM_LIST@83..85
-          L_CURLY@83..84 "{"
-          R_CURLY@84..85 "}"
-      WHITESPACE@85..86 "\n"
-      R_CURLY@86..87 "}"
+      STMT_LIST@8..87
+        L_CURLY@8..9 "{"
+        WHITESPACE@9..14 "\n    "
+        EXPR_STMT@14..25
+          IF_EXPR@14..25
+            IF_KW@14..16 "if"
+            WHITESPACE@16..17 " "
+            CONDITION@17..22
+              BREAK_EXPR@17..22
+                BREAK_KW@17..22 "break"
+            WHITESPACE@22..23 " "
+            BLOCK_EXPR@23..25
+              STMT_LIST@23..25
+                L_CURLY@23..24 "{"
+                R_CURLY@24..25 "}"
+        WHITESPACE@25..30 "\n    "
+        EXPR_STMT@30..44
+          WHILE_EXPR@30..44
+            WHILE_KW@30..35 "while"
+            WHITESPACE@35..36 " "
+            CONDITION@36..41
+              BREAK_EXPR@36..41
+                BREAK_KW@36..41 "break"
+            WHITESPACE@41..42 " "
+            BLOCK_EXPR@42..44
+              STMT_LIST@42..44
+                L_CURLY@42..43 "{"
+                R_CURLY@43..44 "}"
+        WHITESPACE@44..49 "\n    "
+        EXPR_STMT@49..66
+          FOR_EXPR@49..66
+            FOR_KW@49..52 "for"
+            WHITESPACE@52..53 " "
+            IDENT_PAT@53..54
+              NAME@53..54
+                IDENT@53..54 "i"
+            WHITESPACE@54..55 " "
+            IN_KW@55..57 "in"
+            WHITESPACE@57..58 " "
+            BREAK_EXPR@58..63
+              BREAK_KW@58..63 "break"
+            WHITESPACE@63..64 " "
+            BLOCK_EXPR@64..66
+              STMT_LIST@64..66
+                L_CURLY@64..65 "{"
+                R_CURLY@65..66 "}"
+        WHITESPACE@66..71 "\n    "
+        MATCH_EXPR@71..85
+          MATCH_KW@71..76 "match"
+          WHITESPACE@76..77 " "
+          BREAK_EXPR@77..82
+            BREAK_KW@77..82 "break"
+          WHITESPACE@82..83 " "
+          MATCH_ARM_LIST@83..85
+            L_CURLY@83..84 "{"
+            R_CURLY@84..85 "}"
+        WHITESPACE@85..86 "\n"
+        R_CURLY@86..87 "}"
   WHITESPACE@87..88 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0093_index_expr.rast b/crates/syntax/test_data/parser/inline/ok/0093_index_expr.rast
index 82f03f9c18b..ef3ef692a07 100644
--- a/crates/syntax/test_data/parser/inline/ok/0093_index_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0093_index_expr.rast
@@ -9,25 +9,26 @@ SOURCE_FILE@0..26
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..25
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..23
-        INDEX_EXPR@15..22
-          INDEX_EXPR@15..19
-            PATH_EXPR@15..16
-              PATH@15..16
-                PATH_SEGMENT@15..16
-                  NAME_REF@15..16
-                    IDENT@15..16 "x"
-            L_BRACK@16..17 "["
-            LITERAL@17..18
-              INT_NUMBER@17..18 "1"
-            R_BRACK@18..19 "]"
-          L_BRACK@19..20 "["
-          LITERAL@20..21
-            INT_NUMBER@20..21 "2"
-          R_BRACK@21..22 "]"
-        SEMICOLON@22..23 ";"
-      WHITESPACE@23..24 "\n"
-      R_CURLY@24..25 "}"
+      STMT_LIST@9..25
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..23
+          INDEX_EXPR@15..22
+            INDEX_EXPR@15..19
+              PATH_EXPR@15..16
+                PATH@15..16
+                  PATH_SEGMENT@15..16
+                    NAME_REF@15..16
+                      IDENT@15..16 "x"
+              L_BRACK@16..17 "["
+              LITERAL@17..18
+                INT_NUMBER@17..18 "1"
+              R_BRACK@18..19 "]"
+            L_BRACK@19..20 "["
+            LITERAL@20..21
+              INT_NUMBER@20..21 "2"
+            R_BRACK@21..22 "]"
+          SEMICOLON@22..23 ";"
+        WHITESPACE@23..24 "\n"
+        R_CURLY@24..25 "}"
   WHITESPACE@25..26 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0095_placeholder_pat.rast b/crates/syntax/test_data/parser/inline/ok/0095_placeholder_pat.rast
index c1fdc6e259c..2450b66d79b 100644
--- a/crates/syntax/test_data/parser/inline/ok/0095_placeholder_pat.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0095_placeholder_pat.rast
@@ -9,20 +9,21 @@ SOURCE_FILE@0..26
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..25
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..12 " "
-      LET_STMT@12..23
-        LET_KW@12..15 "let"
-        WHITESPACE@15..16 " "
-        WILDCARD_PAT@16..17
-          UNDERSCORE@16..17 "_"
-        WHITESPACE@17..18 " "
-        EQ@18..19 "="
-        WHITESPACE@19..20 " "
-        TUPLE_EXPR@20..22
-          L_PAREN@20..21 "("
-          R_PAREN@21..22 ")"
-        SEMICOLON@22..23 ";"
-      WHITESPACE@23..24 " "
-      R_CURLY@24..25 "}"
+      STMT_LIST@10..25
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..12 " "
+        LET_STMT@12..23
+          LET_KW@12..15 "let"
+          WHITESPACE@15..16 " "
+          WILDCARD_PAT@16..17
+            UNDERSCORE@16..17 "_"
+          WHITESPACE@17..18 " "
+          EQ@18..19 "="
+          WHITESPACE@19..20 " "
+          TUPLE_EXPR@20..22
+            L_PAREN@20..21 "("
+            R_PAREN@21..22 ")"
+          SEMICOLON@22..23 ";"
+        WHITESPACE@23..24 " "
+        R_CURLY@24..25 "}"
   WHITESPACE@25..26 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0096_no_semi_after_block.rast b/crates/syntax/test_data/parser/inline/ok/0096_no_semi_after_block.rast
index e84b9164ff1..0a6ea549c41 100644
--- a/crates/syntax/test_data/parser/inline/ok/0096_no_semi_after_block.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0096_no_semi_after_block.rast
@@ -9,111 +9,118 @@ SOURCE_FILE@0..167
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..166
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..25
-        IF_EXPR@15..25
-          IF_KW@15..17 "if"
-          WHITESPACE@17..18 " "
-          CONDITION@18..22
-            LITERAL@18..22
-              TRUE_KW@18..22 "true"
-          WHITESPACE@22..23 " "
-          BLOCK_EXPR@23..25
-            L_CURLY@23..24 "{"
-            R_CURLY@24..25 "}"
-      WHITESPACE@25..30 "\n    "
-      EXPR_STMT@30..37
-        LOOP_EXPR@30..37
-          LOOP_KW@30..34 "loop"
-          WHITESPACE@34..35 " "
-          BLOCK_EXPR@35..37
-            L_CURLY@35..36 "{"
-            R_CURLY@36..37 "}"
-      WHITESPACE@37..42 "\n    "
-      EXPR_STMT@42..53
-        MATCH_EXPR@42..53
-          MATCH_KW@42..47 "match"
-          WHITESPACE@47..48 " "
-          TUPLE_EXPR@48..50
-            L_PAREN@48..49 "("
-            R_PAREN@49..50 ")"
-          WHITESPACE@50..51 " "
-          MATCH_ARM_LIST@51..53
-            L_CURLY@51..52 "{"
-            R_CURLY@52..53 "}"
-      WHITESPACE@53..58 "\n    "
-      EXPR_STMT@58..71
-        WHILE_EXPR@58..71
-          WHILE_KW@58..63 "while"
-          WHITESPACE@63..64 " "
-          CONDITION@64..68
-            LITERAL@64..68
-              TRUE_KW@64..68 "true"
-          WHITESPACE@68..69 " "
-          BLOCK_EXPR@69..71
-            L_CURLY@69..70 "{"
-            R_CURLY@70..71 "}"
-      WHITESPACE@71..76 "\n    "
-      EXPR_STMT@76..90
-        FOR_EXPR@76..90
-          FOR_KW@76..79 "for"
-          WHITESPACE@79..80 " "
-          WILDCARD_PAT@80..81
-            UNDERSCORE@80..81 "_"
-          WHITESPACE@81..82 " "
-          IN_KW@82..84 "in"
-          WHITESPACE@84..85 " "
-          TUPLE_EXPR@85..87
-            L_PAREN@85..86 "("
-            R_PAREN@86..87 ")"
-          WHITESPACE@87..88 " "
-          BLOCK_EXPR@88..90
-            L_CURLY@88..89 "{"
-            R_CURLY@89..90 "}"
-      WHITESPACE@90..95 "\n    "
-      EXPR_STMT@95..97
-        BLOCK_EXPR@95..97
-          L_CURLY@95..96 "{"
-          R_CURLY@96..97 "}"
-      WHITESPACE@97..102 "\n    "
-      EXPR_STMT@102..104
-        BLOCK_EXPR@102..104
-          L_CURLY@102..103 "{"
-          R_CURLY@103..104 "}"
-      WHITESPACE@104..109 "\n    "
-      MACRO_RULES@109..152
-        MACRO_RULES_KW@109..120 "macro_rules"
-        BANG@120..121 "!"
-        WHITESPACE@121..122 " "
-        NAME@122..126
-          IDENT@122..126 "test"
-        WHITESPACE@126..127 " "
-        TOKEN_TREE@127..152
-          L_CURLY@127..128 "{"
-          WHITESPACE@128..138 "\n         "
-          TOKEN_TREE@138..140
-            L_PAREN@138..139 "("
-            R_PAREN@139..140 ")"
-          WHITESPACE@140..141 " "
-          EQ@141..142 "="
-          R_ANGLE@142..143 ">"
-          WHITESPACE@143..144 " "
-          TOKEN_TREE@144..146
-            L_CURLY@144..145 "{"
-            R_CURLY@145..146 "}"
-          WHITESPACE@146..151 "\n    "
-          R_CURLY@151..152 "}"
-      WHITESPACE@152..157 "\n    "
-      MACRO_CALL@157..164
-        PATH@157..161
-          PATH_SEGMENT@157..161
-            NAME_REF@157..161
-              IDENT@157..161 "test"
-        BANG@161..162 "!"
-        TOKEN_TREE@162..164
-          L_CURLY@162..163 "{"
-          R_CURLY@163..164 "}"
-      WHITESPACE@164..165 "\n"
-      R_CURLY@165..166 "}"
+      STMT_LIST@9..166
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..25
+          IF_EXPR@15..25
+            IF_KW@15..17 "if"
+            WHITESPACE@17..18 " "
+            CONDITION@18..22
+              LITERAL@18..22
+                TRUE_KW@18..22 "true"
+            WHITESPACE@22..23 " "
+            BLOCK_EXPR@23..25
+              STMT_LIST@23..25
+                L_CURLY@23..24 "{"
+                R_CURLY@24..25 "}"
+        WHITESPACE@25..30 "\n    "
+        EXPR_STMT@30..37
+          LOOP_EXPR@30..37
+            LOOP_KW@30..34 "loop"
+            WHITESPACE@34..35 " "
+            BLOCK_EXPR@35..37
+              STMT_LIST@35..37
+                L_CURLY@35..36 "{"
+                R_CURLY@36..37 "}"
+        WHITESPACE@37..42 "\n    "
+        EXPR_STMT@42..53
+          MATCH_EXPR@42..53
+            MATCH_KW@42..47 "match"
+            WHITESPACE@47..48 " "
+            TUPLE_EXPR@48..50
+              L_PAREN@48..49 "("
+              R_PAREN@49..50 ")"
+            WHITESPACE@50..51 " "
+            MATCH_ARM_LIST@51..53
+              L_CURLY@51..52 "{"
+              R_CURLY@52..53 "}"
+        WHITESPACE@53..58 "\n    "
+        EXPR_STMT@58..71
+          WHILE_EXPR@58..71
+            WHILE_KW@58..63 "while"
+            WHITESPACE@63..64 " "
+            CONDITION@64..68
+              LITERAL@64..68
+                TRUE_KW@64..68 "true"
+            WHITESPACE@68..69 " "
+            BLOCK_EXPR@69..71
+              STMT_LIST@69..71
+                L_CURLY@69..70 "{"
+                R_CURLY@70..71 "}"
+        WHITESPACE@71..76 "\n    "
+        EXPR_STMT@76..90
+          FOR_EXPR@76..90
+            FOR_KW@76..79 "for"
+            WHITESPACE@79..80 " "
+            WILDCARD_PAT@80..81
+              UNDERSCORE@80..81 "_"
+            WHITESPACE@81..82 " "
+            IN_KW@82..84 "in"
+            WHITESPACE@84..85 " "
+            TUPLE_EXPR@85..87
+              L_PAREN@85..86 "("
+              R_PAREN@86..87 ")"
+            WHITESPACE@87..88 " "
+            BLOCK_EXPR@88..90
+              STMT_LIST@88..90
+                L_CURLY@88..89 "{"
+                R_CURLY@89..90 "}"
+        WHITESPACE@90..95 "\n    "
+        EXPR_STMT@95..97
+          BLOCK_EXPR@95..97
+            STMT_LIST@95..97
+              L_CURLY@95..96 "{"
+              R_CURLY@96..97 "}"
+        WHITESPACE@97..102 "\n    "
+        EXPR_STMT@102..104
+          BLOCK_EXPR@102..104
+            STMT_LIST@102..104
+              L_CURLY@102..103 "{"
+              R_CURLY@103..104 "}"
+        WHITESPACE@104..109 "\n    "
+        MACRO_RULES@109..152
+          MACRO_RULES_KW@109..120 "macro_rules"
+          BANG@120..121 "!"
+          WHITESPACE@121..122 " "
+          NAME@122..126
+            IDENT@122..126 "test"
+          WHITESPACE@126..127 " "
+          TOKEN_TREE@127..152
+            L_CURLY@127..128 "{"
+            WHITESPACE@128..138 "\n         "
+            TOKEN_TREE@138..140
+              L_PAREN@138..139 "("
+              R_PAREN@139..140 ")"
+            WHITESPACE@140..141 " "
+            EQ@141..142 "="
+            R_ANGLE@142..143 ">"
+            WHITESPACE@143..144 " "
+            TOKEN_TREE@144..146
+              L_CURLY@144..145 "{"
+              R_CURLY@145..146 "}"
+            WHITESPACE@146..151 "\n    "
+            R_CURLY@151..152 "}"
+        WHITESPACE@152..157 "\n    "
+        MACRO_CALL@157..164
+          PATH@157..161
+            PATH_SEGMENT@157..161
+              NAME_REF@157..161
+                IDENT@157..161 "test"
+          BANG@161..162 "!"
+          TOKEN_TREE@162..164
+            L_CURLY@162..163 "{"
+            R_CURLY@163..164 "}"
+        WHITESPACE@164..165 "\n"
+        R_CURLY@165..166 "}"
   WHITESPACE@166..167 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0099_param_list.rast b/crates/syntax/test_data/parser/inline/ok/0099_param_list.rast
index f19e9fd5229..2f2f2b6889b 100644
--- a/crates/syntax/test_data/parser/inline/ok/0099_param_list.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0099_param_list.rast
@@ -9,8 +9,9 @@ SOURCE_FILE@0..67
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..9
-      L_CURLY@7..8 "{"
-      R_CURLY@8..9 "}"
+      STMT_LIST@7..9
+        L_CURLY@7..8 "{"
+        R_CURLY@8..9 "}"
   WHITESPACE@9..10 "\n"
   FN@10..25
     FN_KW@10..12 "fn"
@@ -33,8 +34,9 @@ SOURCE_FILE@0..67
       R_PAREN@21..22 ")"
     WHITESPACE@22..23 " "
     BLOCK_EXPR@23..25
-      L_CURLY@23..24 "{"
-      R_CURLY@24..25 "}"
+      STMT_LIST@23..25
+        L_CURLY@23..24 "{"
+        R_CURLY@24..25 "}"
   WHITESPACE@25..26 "\n"
   FN@26..43
     FN_KW@26..28 "fn"
@@ -59,8 +61,9 @@ SOURCE_FILE@0..67
       R_PAREN@39..40 ")"
     WHITESPACE@40..41 " "
     BLOCK_EXPR@41..43
-      L_CURLY@41..42 "{"
-      R_CURLY@42..43 "}"
+      STMT_LIST@41..43
+        L_CURLY@41..42 "{"
+        R_CURLY@42..43 "}"
   WHITESPACE@43..44 "\n"
   FN@44..66
     FN_KW@44..46 "fn"
@@ -94,6 +97,7 @@ SOURCE_FILE@0..67
       R_PAREN@62..63 ")"
     WHITESPACE@63..64 " "
     BLOCK_EXPR@64..66
-      L_CURLY@64..65 "{"
-      R_CURLY@65..66 "}"
+      STMT_LIST@64..66
+        L_CURLY@64..65 "{"
+        R_CURLY@65..66 "}"
   WHITESPACE@66..67 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0100_for_expr.rast b/crates/syntax/test_data/parser/inline/ok/0100_for_expr.rast
index 5c4055e44b0..f195f2369c4 100644
--- a/crates/syntax/test_data/parser/inline/ok/0100_for_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0100_for_expr.rast
@@ -9,26 +9,28 @@ SOURCE_FILE@0..33
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..32
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..30
-        FOR_EXPR@15..29
-          FOR_KW@15..18 "for"
-          WHITESPACE@18..19 " "
-          IDENT_PAT@19..20
-            NAME@19..20
-              IDENT@19..20 "x"
-          WHITESPACE@20..21 " "
-          IN_KW@21..23 "in"
-          WHITESPACE@23..24 " "
-          ARRAY_EXPR@24..26
-            L_BRACK@24..25 "["
-            R_BRACK@25..26 "]"
-          WHITESPACE@26..27 " "
-          BLOCK_EXPR@27..29
-            L_CURLY@27..28 "{"
-            R_CURLY@28..29 "}"
-        SEMICOLON@29..30 ";"
-      WHITESPACE@30..31 "\n"
-      R_CURLY@31..32 "}"
+      STMT_LIST@9..32
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..30
+          FOR_EXPR@15..29
+            FOR_KW@15..18 "for"
+            WHITESPACE@18..19 " "
+            IDENT_PAT@19..20
+              NAME@19..20
+                IDENT@19..20 "x"
+            WHITESPACE@20..21 " "
+            IN_KW@21..23 "in"
+            WHITESPACE@23..24 " "
+            ARRAY_EXPR@24..26
+              L_BRACK@24..25 "["
+              R_BRACK@25..26 "]"
+            WHITESPACE@26..27 " "
+            BLOCK_EXPR@27..29
+              STMT_LIST@27..29
+                L_CURLY@27..28 "{"
+                R_CURLY@28..29 "}"
+          SEMICOLON@29..30 ";"
+        WHITESPACE@30..31 "\n"
+        R_CURLY@31..32 "}"
   WHITESPACE@32..33 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0102_record_pat_field_list.rast b/crates/syntax/test_data/parser/inline/ok/0102_record_pat_field_list.rast
index 866e60ed8a1..4c44da9d555 100644
--- a/crates/syntax/test_data/parser/inline/ok/0102_record_pat_field_list.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0102_record_pat_field_list.rast
@@ -9,124 +9,125 @@ SOURCE_FILE@0..119
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..118
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      LET_STMT@15..29
-        LET_KW@15..18 "let"
-        WHITESPACE@18..19 " "
-        RECORD_PAT@19..23
-          PATH@19..20
-            PATH_SEGMENT@19..20
-              NAME_REF@19..20
-                IDENT@19..20 "S"
-          WHITESPACE@20..21 " "
-          RECORD_PAT_FIELD_LIST@21..23
-            L_CURLY@21..22 "{"
-            R_CURLY@22..23 "}"
-        WHITESPACE@23..24 " "
-        EQ@24..25 "="
-        WHITESPACE@25..26 " "
-        TUPLE_EXPR@26..28
-          L_PAREN@26..27 "("
-          R_PAREN@27..28 ")"
-        SEMICOLON@28..29 ";"
-      WHITESPACE@29..34 "\n    "
-      LET_STMT@34..62
-        LET_KW@34..37 "let"
-        WHITESPACE@37..38 " "
-        RECORD_PAT@38..56
-          PATH@38..39
-            PATH_SEGMENT@38..39
-              NAME_REF@38..39
-                IDENT@38..39 "S"
-          WHITESPACE@39..40 " "
-          RECORD_PAT_FIELD_LIST@40..56
-            L_CURLY@40..41 "{"
-            WHITESPACE@41..42 " "
-            RECORD_PAT_FIELD@42..43
-              IDENT_PAT@42..43
-                NAME@42..43
-                  IDENT@42..43 "f"
-            COMMA@43..44 ","
-            WHITESPACE@44..45 " "
-            RECORD_PAT_FIELD@45..54
-              IDENT_PAT@45..54
-                REF_KW@45..48 "ref"
-                WHITESPACE@48..49 " "
-                MUT_KW@49..52 "mut"
-                WHITESPACE@52..53 " "
-                NAME@53..54
-                  IDENT@53..54 "g"
-            WHITESPACE@54..55 " "
-            R_CURLY@55..56 "}"
-        WHITESPACE@56..57 " "
-        EQ@57..58 "="
-        WHITESPACE@58..59 " "
-        TUPLE_EXPR@59..61
-          L_PAREN@59..60 "("
-          R_PAREN@60..61 ")"
-        SEMICOLON@61..62 ";"
-      WHITESPACE@62..67 "\n    "
-      LET_STMT@67..90
-        LET_KW@67..70 "let"
-        WHITESPACE@70..71 " "
-        RECORD_PAT@71..84
-          PATH@71..72
-            PATH_SEGMENT@71..72
-              NAME_REF@71..72
-                IDENT@71..72 "S"
-          WHITESPACE@72..73 " "
-          RECORD_PAT_FIELD_LIST@73..84
-            L_CURLY@73..74 "{"
-            WHITESPACE@74..75 " "
-            RECORD_PAT_FIELD@75..79
-              NAME_REF@75..76
-                IDENT@75..76 "h"
-              COLON@76..77 ":"
-              WHITESPACE@77..78 " "
-              WILDCARD_PAT@78..79
-                UNDERSCORE@78..79 "_"
-            COMMA@79..80 ","
-            WHITESPACE@80..81 " "
-            DOT2@81..83 ".."
-            R_CURLY@83..84 "}"
-        WHITESPACE@84..85 " "
-        EQ@85..86 "="
-        WHITESPACE@86..87 " "
-        TUPLE_EXPR@87..89
-          L_PAREN@87..88 "("
-          R_PAREN@88..89 ")"
-        SEMICOLON@89..90 ";"
-      WHITESPACE@90..95 "\n    "
-      LET_STMT@95..116
-        LET_KW@95..98 "let"
-        WHITESPACE@98..99 " "
-        RECORD_PAT@99..110
-          PATH@99..100
-            PATH_SEGMENT@99..100
-              NAME_REF@99..100
-                IDENT@99..100 "S"
-          WHITESPACE@100..101 " "
-          RECORD_PAT_FIELD_LIST@101..110
-            L_CURLY@101..102 "{"
-            WHITESPACE@102..103 " "
-            RECORD_PAT_FIELD@103..107
-              NAME_REF@103..104
-                IDENT@103..104 "h"
-              COLON@104..105 ":"
-              WHITESPACE@105..106 " "
-              WILDCARD_PAT@106..107
-                UNDERSCORE@106..107 "_"
-            COMMA@107..108 ","
-            WHITESPACE@108..109 " "
-            R_CURLY@109..110 "}"
-        WHITESPACE@110..111 " "
-        EQ@111..112 "="
-        WHITESPACE@112..113 " "
-        TUPLE_EXPR@113..115
-          L_PAREN@113..114 "("
-          R_PAREN@114..115 ")"
-        SEMICOLON@115..116 ";"
-      WHITESPACE@116..117 "\n"
-      R_CURLY@117..118 "}"
+      STMT_LIST@9..118
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        LET_STMT@15..29
+          LET_KW@15..18 "let"
+          WHITESPACE@18..19 " "
+          RECORD_PAT@19..23
+            PATH@19..20
+              PATH_SEGMENT@19..20
+                NAME_REF@19..20
+                  IDENT@19..20 "S"
+            WHITESPACE@20..21 " "
+            RECORD_PAT_FIELD_LIST@21..23
+              L_CURLY@21..22 "{"
+              R_CURLY@22..23 "}"
+          WHITESPACE@23..24 " "
+          EQ@24..25 "="
+          WHITESPACE@25..26 " "
+          TUPLE_EXPR@26..28
+            L_PAREN@26..27 "("
+            R_PAREN@27..28 ")"
+          SEMICOLON@28..29 ";"
+        WHITESPACE@29..34 "\n    "
+        LET_STMT@34..62
+          LET_KW@34..37 "let"
+          WHITESPACE@37..38 " "
+          RECORD_PAT@38..56
+            PATH@38..39
+              PATH_SEGMENT@38..39
+                NAME_REF@38..39
+                  IDENT@38..39 "S"
+            WHITESPACE@39..40 " "
+            RECORD_PAT_FIELD_LIST@40..56
+              L_CURLY@40..41 "{"
+              WHITESPACE@41..42 " "
+              RECORD_PAT_FIELD@42..43
+                IDENT_PAT@42..43
+                  NAME@42..43
+                    IDENT@42..43 "f"
+              COMMA@43..44 ","
+              WHITESPACE@44..45 " "
+              RECORD_PAT_FIELD@45..54
+                IDENT_PAT@45..54
+                  REF_KW@45..48 "ref"
+                  WHITESPACE@48..49 " "
+                  MUT_KW@49..52 "mut"
+                  WHITESPACE@52..53 " "
+                  NAME@53..54
+                    IDENT@53..54 "g"
+              WHITESPACE@54..55 " "
+              R_CURLY@55..56 "}"
+          WHITESPACE@56..57 " "
+          EQ@57..58 "="
+          WHITESPACE@58..59 " "
+          TUPLE_EXPR@59..61
+            L_PAREN@59..60 "("
+            R_PAREN@60..61 ")"
+          SEMICOLON@61..62 ";"
+        WHITESPACE@62..67 "\n    "
+        LET_STMT@67..90
+          LET_KW@67..70 "let"
+          WHITESPACE@70..71 " "
+          RECORD_PAT@71..84
+            PATH@71..72
+              PATH_SEGMENT@71..72
+                NAME_REF@71..72
+                  IDENT@71..72 "S"
+            WHITESPACE@72..73 " "
+            RECORD_PAT_FIELD_LIST@73..84
+              L_CURLY@73..74 "{"
+              WHITESPACE@74..75 " "
+              RECORD_PAT_FIELD@75..79
+                NAME_REF@75..76
+                  IDENT@75..76 "h"
+                COLON@76..77 ":"
+                WHITESPACE@77..78 " "
+                WILDCARD_PAT@78..79
+                  UNDERSCORE@78..79 "_"
+              COMMA@79..80 ","
+              WHITESPACE@80..81 " "
+              DOT2@81..83 ".."
+              R_CURLY@83..84 "}"
+          WHITESPACE@84..85 " "
+          EQ@85..86 "="
+          WHITESPACE@86..87 " "
+          TUPLE_EXPR@87..89
+            L_PAREN@87..88 "("
+            R_PAREN@88..89 ")"
+          SEMICOLON@89..90 ";"
+        WHITESPACE@90..95 "\n    "
+        LET_STMT@95..116
+          LET_KW@95..98 "let"
+          WHITESPACE@98..99 " "
+          RECORD_PAT@99..110
+            PATH@99..100
+              PATH_SEGMENT@99..100
+                NAME_REF@99..100
+                  IDENT@99..100 "S"
+            WHITESPACE@100..101 " "
+            RECORD_PAT_FIELD_LIST@101..110
+              L_CURLY@101..102 "{"
+              WHITESPACE@102..103 " "
+              RECORD_PAT_FIELD@103..107
+                NAME_REF@103..104
+                  IDENT@103..104 "h"
+                COLON@104..105 ":"
+                WHITESPACE@105..106 " "
+                WILDCARD_PAT@106..107
+                  UNDERSCORE@106..107 "_"
+              COMMA@107..108 ","
+              WHITESPACE@108..109 " "
+              R_CURLY@109..110 "}"
+          WHITESPACE@110..111 " "
+          EQ@111..112 "="
+          WHITESPACE@112..113 " "
+          TUPLE_EXPR@113..115
+            L_PAREN@113..114 "("
+            R_PAREN@114..115 ")"
+          SEMICOLON@115..116 ";"
+        WHITESPACE@116..117 "\n"
+        R_CURLY@117..118 "}"
   WHITESPACE@118..119 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0103_array_expr.rast b/crates/syntax/test_data/parser/inline/ok/0103_array_expr.rast
index c4c0a0568a4..1e0d2fa07a7 100644
--- a/crates/syntax/test_data/parser/inline/ok/0103_array_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0103_array_expr.rast
@@ -9,46 +9,47 @@ SOURCE_FILE@0..55
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..54
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..18
-        ARRAY_EXPR@15..17
-          L_BRACK@15..16 "["
-          R_BRACK@16..17 "]"
-        SEMICOLON@17..18 ";"
-      WHITESPACE@18..23 "\n    "
-      EXPR_STMT@23..27
-        ARRAY_EXPR@23..26
-          L_BRACK@23..24 "["
-          LITERAL@24..25
-            INT_NUMBER@24..25 "1"
-          R_BRACK@25..26 "]"
-        SEMICOLON@26..27 ";"
-      WHITESPACE@27..32 "\n    "
-      EXPR_STMT@32..40
-        ARRAY_EXPR@32..39
-          L_BRACK@32..33 "["
-          LITERAL@33..34
-            INT_NUMBER@33..34 "1"
-          COMMA@34..35 ","
-          WHITESPACE@35..36 " "
-          LITERAL@36..37
-            INT_NUMBER@36..37 "2"
-          COMMA@37..38 ","
-          R_BRACK@38..39 "]"
-        SEMICOLON@39..40 ";"
-      WHITESPACE@40..45 "\n    "
-      EXPR_STMT@45..52
-        ARRAY_EXPR@45..51
-          L_BRACK@45..46 "["
-          LITERAL@46..47
-            INT_NUMBER@46..47 "1"
-          SEMICOLON@47..48 ";"
-          WHITESPACE@48..49 " "
-          LITERAL@49..50
-            INT_NUMBER@49..50 "2"
-          R_BRACK@50..51 "]"
-        SEMICOLON@51..52 ";"
-      WHITESPACE@52..53 "\n"
-      R_CURLY@53..54 "}"
+      STMT_LIST@9..54
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..18
+          ARRAY_EXPR@15..17
+            L_BRACK@15..16 "["
+            R_BRACK@16..17 "]"
+          SEMICOLON@17..18 ";"
+        WHITESPACE@18..23 "\n    "
+        EXPR_STMT@23..27
+          ARRAY_EXPR@23..26
+            L_BRACK@23..24 "["
+            LITERAL@24..25
+              INT_NUMBER@24..25 "1"
+            R_BRACK@25..26 "]"
+          SEMICOLON@26..27 ";"
+        WHITESPACE@27..32 "\n    "
+        EXPR_STMT@32..40
+          ARRAY_EXPR@32..39
+            L_BRACK@32..33 "["
+            LITERAL@33..34
+              INT_NUMBER@33..34 "1"
+            COMMA@34..35 ","
+            WHITESPACE@35..36 " "
+            LITERAL@36..37
+              INT_NUMBER@36..37 "2"
+            COMMA@37..38 ","
+            R_BRACK@38..39 "]"
+          SEMICOLON@39..40 ";"
+        WHITESPACE@40..45 "\n    "
+        EXPR_STMT@45..52
+          ARRAY_EXPR@45..51
+            L_BRACK@45..46 "["
+            LITERAL@46..47
+              INT_NUMBER@46..47 "1"
+            SEMICOLON@47..48 ";"
+            WHITESPACE@48..49 " "
+            LITERAL@49..50
+              INT_NUMBER@49..50 "2"
+            R_BRACK@50..51 "]"
+          SEMICOLON@51..52 ";"
+        WHITESPACE@52..53 "\n"
+        R_CURLY@53..54 "}"
   WHITESPACE@54..55 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0106_lambda_expr.rast b/crates/syntax/test_data/parser/inline/ok/0106_lambda_expr.rast
index 9b8381619a2..3497de01c50 100644
--- a/crates/syntax/test_data/parser/inline/ok/0106_lambda_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0106_lambda_expr.rast
@@ -9,127 +9,132 @@ SOURCE_FILE@0..134
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..133
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..21
-        CLOSURE_EXPR@15..20
-          PARAM_LIST@15..17
-            PIPE@15..16 "|"
-            PIPE@16..17 "|"
-          WHITESPACE@17..18 " "
-          TUPLE_EXPR@18..20
-            L_PAREN@18..19 "("
-            R_PAREN@19..20 ")"
-        SEMICOLON@20..21 ";"
-      WHITESPACE@21..26 "\n    "
-      EXPR_STMT@26..43
-        CLOSURE_EXPR@26..42
-          PARAM_LIST@26..28
-            PIPE@26..27 "|"
-            PIPE@27..28 "|"
-          WHITESPACE@28..29 " "
-          RET_TYPE@29..35
-            THIN_ARROW@29..31 "->"
-            WHITESPACE@31..32 " "
-            PATH_TYPE@32..35
-              PATH@32..35
-                PATH_SEGMENT@32..35
-                  NAME_REF@32..35
-                    IDENT@32..35 "i32"
-          WHITESPACE@35..36 " "
-          BLOCK_EXPR@36..42
-            L_CURLY@36..37 "{"
-            WHITESPACE@37..38 " "
-            LITERAL@38..40
-              INT_NUMBER@38..40 "92"
-            WHITESPACE@40..41 " "
-            R_CURLY@41..42 "}"
-        SEMICOLON@42..43 ";"
-      WHITESPACE@43..48 "\n    "
-      EXPR_STMT@48..54
-        CLOSURE_EXPR@48..53
-          PARAM_LIST@48..51
-            PIPE@48..49 "|"
-            PARAM@49..50
-              IDENT_PAT@49..50
-                NAME@49..50
-                  IDENT@49..50 "x"
-            PIPE@50..51 "|"
-          WHITESPACE@51..52 " "
-          PATH_EXPR@52..53
-            PATH@52..53
-              PATH_SEGMENT@52..53
-                NAME_REF@52..53
-                  IDENT@52..53 "x"
-        SEMICOLON@53..54 ";"
-      WHITESPACE@54..59 "\n    "
-      EXPR_STMT@59..76
-        CLOSURE_EXPR@59..75
-          MOVE_KW@59..63 "move"
-          WHITESPACE@63..64 " "
-          PARAM_LIST@64..73
-            PIPE@64..65 "|"
-            PARAM@65..71
-              IDENT_PAT@65..66
-                NAME@65..66
-                  IDENT@65..66 "x"
-              COLON@66..67 ":"
-              WHITESPACE@67..68 " "
-              PATH_TYPE@68..71
-                PATH@68..71
-                  PATH_SEGMENT@68..71
-                    NAME_REF@68..71
-                      IDENT@68..71 "i32"
-            COMMA@71..72 ","
-            PIPE@72..73 "|"
-          WHITESPACE@73..74 " "
-          PATH_EXPR@74..75
-            PATH@74..75
-              PATH_SEGMENT@74..75
-                NAME_REF@74..75
-                  IDENT@74..75 "x"
-        SEMICOLON@75..76 ";"
-      WHITESPACE@76..81 "\n    "
-      EXPR_STMT@81..93
-        CLOSURE_EXPR@81..92
-          ASYNC_KW@81..86 "async"
-          WHITESPACE@86..87 " "
-          PARAM_LIST@87..89
-            PIPE@87..88 "|"
-            PIPE@88..89 "|"
-          WHITESPACE@89..90 " "
-          BLOCK_EXPR@90..92
-            L_CURLY@90..91 "{"
-            R_CURLY@91..92 "}"
-        SEMICOLON@92..93 ";"
-      WHITESPACE@93..98 "\n    "
-      EXPR_STMT@98..109
-        CLOSURE_EXPR@98..108
-          MOVE_KW@98..102 "move"
-          WHITESPACE@102..103 " "
-          PARAM_LIST@103..105
-            PIPE@103..104 "|"
-            PIPE@104..105 "|"
-          WHITESPACE@105..106 " "
-          BLOCK_EXPR@106..108
-            L_CURLY@106..107 "{"
-            R_CURLY@107..108 "}"
-        SEMICOLON@108..109 ";"
-      WHITESPACE@109..114 "\n    "
-      EXPR_STMT@114..131
-        CLOSURE_EXPR@114..130
-          ASYNC_KW@114..119 "async"
-          WHITESPACE@119..120 " "
-          MOVE_KW@120..124 "move"
-          WHITESPACE@124..125 " "
-          PARAM_LIST@125..127
-            PIPE@125..126 "|"
-            PIPE@126..127 "|"
-          WHITESPACE@127..128 " "
-          BLOCK_EXPR@128..130
-            L_CURLY@128..129 "{"
-            R_CURLY@129..130 "}"
-        SEMICOLON@130..131 ";"
-      WHITESPACE@131..132 "\n"
-      R_CURLY@132..133 "}"
+      STMT_LIST@9..133
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..21
+          CLOSURE_EXPR@15..20
+            PARAM_LIST@15..17
+              PIPE@15..16 "|"
+              PIPE@16..17 "|"
+            WHITESPACE@17..18 " "
+            TUPLE_EXPR@18..20
+              L_PAREN@18..19 "("
+              R_PAREN@19..20 ")"
+          SEMICOLON@20..21 ";"
+        WHITESPACE@21..26 "\n    "
+        EXPR_STMT@26..43
+          CLOSURE_EXPR@26..42
+            PARAM_LIST@26..28
+              PIPE@26..27 "|"
+              PIPE@27..28 "|"
+            WHITESPACE@28..29 " "
+            RET_TYPE@29..35
+              THIN_ARROW@29..31 "->"
+              WHITESPACE@31..32 " "
+              PATH_TYPE@32..35
+                PATH@32..35
+                  PATH_SEGMENT@32..35
+                    NAME_REF@32..35
+                      IDENT@32..35 "i32"
+            WHITESPACE@35..36 " "
+            BLOCK_EXPR@36..42
+              STMT_LIST@36..42
+                L_CURLY@36..37 "{"
+                WHITESPACE@37..38 " "
+                LITERAL@38..40
+                  INT_NUMBER@38..40 "92"
+                WHITESPACE@40..41 " "
+                R_CURLY@41..42 "}"
+          SEMICOLON@42..43 ";"
+        WHITESPACE@43..48 "\n    "
+        EXPR_STMT@48..54
+          CLOSURE_EXPR@48..53
+            PARAM_LIST@48..51
+              PIPE@48..49 "|"
+              PARAM@49..50
+                IDENT_PAT@49..50
+                  NAME@49..50
+                    IDENT@49..50 "x"
+              PIPE@50..51 "|"
+            WHITESPACE@51..52 " "
+            PATH_EXPR@52..53
+              PATH@52..53
+                PATH_SEGMENT@52..53
+                  NAME_REF@52..53
+                    IDENT@52..53 "x"
+          SEMICOLON@53..54 ";"
+        WHITESPACE@54..59 "\n    "
+        EXPR_STMT@59..76
+          CLOSURE_EXPR@59..75
+            MOVE_KW@59..63 "move"
+            WHITESPACE@63..64 " "
+            PARAM_LIST@64..73
+              PIPE@64..65 "|"
+              PARAM@65..71
+                IDENT_PAT@65..66
+                  NAME@65..66
+                    IDENT@65..66 "x"
+                COLON@66..67 ":"
+                WHITESPACE@67..68 " "
+                PATH_TYPE@68..71
+                  PATH@68..71
+                    PATH_SEGMENT@68..71
+                      NAME_REF@68..71
+                        IDENT@68..71 "i32"
+              COMMA@71..72 ","
+              PIPE@72..73 "|"
+            WHITESPACE@73..74 " "
+            PATH_EXPR@74..75
+              PATH@74..75
+                PATH_SEGMENT@74..75
+                  NAME_REF@74..75
+                    IDENT@74..75 "x"
+          SEMICOLON@75..76 ";"
+        WHITESPACE@76..81 "\n    "
+        EXPR_STMT@81..93
+          CLOSURE_EXPR@81..92
+            ASYNC_KW@81..86 "async"
+            WHITESPACE@86..87 " "
+            PARAM_LIST@87..89
+              PIPE@87..88 "|"
+              PIPE@88..89 "|"
+            WHITESPACE@89..90 " "
+            BLOCK_EXPR@90..92
+              STMT_LIST@90..92
+                L_CURLY@90..91 "{"
+                R_CURLY@91..92 "}"
+          SEMICOLON@92..93 ";"
+        WHITESPACE@93..98 "\n    "
+        EXPR_STMT@98..109
+          CLOSURE_EXPR@98..108
+            MOVE_KW@98..102 "move"
+            WHITESPACE@102..103 " "
+            PARAM_LIST@103..105
+              PIPE@103..104 "|"
+              PIPE@104..105 "|"
+            WHITESPACE@105..106 " "
+            BLOCK_EXPR@106..108
+              STMT_LIST@106..108
+                L_CURLY@106..107 "{"
+                R_CURLY@107..108 "}"
+          SEMICOLON@108..109 ";"
+        WHITESPACE@109..114 "\n    "
+        EXPR_STMT@114..131
+          CLOSURE_EXPR@114..130
+            ASYNC_KW@114..119 "async"
+            WHITESPACE@119..120 " "
+            MOVE_KW@120..124 "move"
+            WHITESPACE@124..125 " "
+            PARAM_LIST@125..127
+              PIPE@125..126 "|"
+              PIPE@126..127 "|"
+            WHITESPACE@127..128 " "
+            BLOCK_EXPR@128..130
+              STMT_LIST@128..130
+                L_CURLY@128..129 "{"
+                R_CURLY@129..130 "}"
+          SEMICOLON@130..131 ";"
+        WHITESPACE@131..132 "\n"
+        R_CURLY@132..133 "}"
   WHITESPACE@133..134 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0107_method_call_expr.rast b/crates/syntax/test_data/parser/inline/ok/0107_method_call_expr.rast
index be8365e0571..9cddb373ff6 100644
--- a/crates/syntax/test_data/parser/inline/ok/0107_method_call_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0107_method_call_expr.rast
@@ -9,54 +9,55 @@ SOURCE_FILE@0..49
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..48
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..23
-        METHOD_CALL_EXPR@15..22
-          PATH_EXPR@15..16
-            PATH@15..16
-              PATH_SEGMENT@15..16
-                NAME_REF@15..16
-                  IDENT@15..16 "x"
-          DOT@16..17 "."
-          NAME_REF@17..20
-            IDENT@17..20 "foo"
-          ARG_LIST@20..22
-            L_PAREN@20..21 "("
-            R_PAREN@21..22 ")"
-        SEMICOLON@22..23 ";"
-      WHITESPACE@23..28 "\n    "
-      EXPR_STMT@28..46
-        METHOD_CALL_EXPR@28..45
-          PATH_EXPR@28..29
-            PATH@28..29
-              PATH_SEGMENT@28..29
-                NAME_REF@28..29
-                  IDENT@28..29 "y"
-          DOT@29..30 "."
-          NAME_REF@30..33
-            IDENT@30..33 "bar"
-          GENERIC_ARG_LIST@33..38
-            COLON2@33..35 "::"
-            L_ANGLE@35..36 "<"
-            TYPE_ARG@36..37
-              PATH_TYPE@36..37
-                PATH@36..37
-                  PATH_SEGMENT@36..37
-                    NAME_REF@36..37
-                      IDENT@36..37 "T"
-            R_ANGLE@37..38 ">"
-          ARG_LIST@38..45
-            L_PAREN@38..39 "("
-            LITERAL@39..40
-              INT_NUMBER@39..40 "1"
-            COMMA@40..41 ","
-            WHITESPACE@41..42 " "
-            LITERAL@42..43
-              INT_NUMBER@42..43 "2"
-            COMMA@43..44 ","
-            R_PAREN@44..45 ")"
-        SEMICOLON@45..46 ";"
-      WHITESPACE@46..47 "\n"
-      R_CURLY@47..48 "}"
+      STMT_LIST@9..48
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..23
+          METHOD_CALL_EXPR@15..22
+            PATH_EXPR@15..16
+              PATH@15..16
+                PATH_SEGMENT@15..16
+                  NAME_REF@15..16
+                    IDENT@15..16 "x"
+            DOT@16..17 "."
+            NAME_REF@17..20
+              IDENT@17..20 "foo"
+            ARG_LIST@20..22
+              L_PAREN@20..21 "("
+              R_PAREN@21..22 ")"
+          SEMICOLON@22..23 ";"
+        WHITESPACE@23..28 "\n    "
+        EXPR_STMT@28..46
+          METHOD_CALL_EXPR@28..45
+            PATH_EXPR@28..29
+              PATH@28..29
+                PATH_SEGMENT@28..29
+                  NAME_REF@28..29
+                    IDENT@28..29 "y"
+            DOT@29..30 "."
+            NAME_REF@30..33
+              IDENT@30..33 "bar"
+            GENERIC_ARG_LIST@33..38
+              COLON2@33..35 "::"
+              L_ANGLE@35..36 "<"
+              TYPE_ARG@36..37
+                PATH_TYPE@36..37
+                  PATH@36..37
+                    PATH_SEGMENT@36..37
+                      NAME_REF@36..37
+                        IDENT@36..37 "T"
+              R_ANGLE@37..38 ">"
+            ARG_LIST@38..45
+              L_PAREN@38..39 "("
+              LITERAL@39..40
+                INT_NUMBER@39..40 "1"
+              COMMA@40..41 ","
+              WHITESPACE@41..42 " "
+              LITERAL@42..43
+                INT_NUMBER@42..43 "2"
+              COMMA@43..44 ","
+              R_PAREN@44..45 ")"
+          SEMICOLON@45..46 ";"
+        WHITESPACE@46..47 "\n"
+        R_CURLY@47..48 "}"
   WHITESPACE@48..49 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0108_tuple_expr.rast b/crates/syntax/test_data/parser/inline/ok/0108_tuple_expr.rast
index ca7e4a5c361..a6b247c0acc 100644
--- a/crates/syntax/test_data/parser/inline/ok/0108_tuple_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0108_tuple_expr.rast
@@ -9,30 +9,31 @@ SOURCE_FILE@0..40
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..39
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..18
-        TUPLE_EXPR@15..17
-          L_PAREN@15..16 "("
-          R_PAREN@16..17 ")"
-        SEMICOLON@17..18 ";"
-      WHITESPACE@18..23 "\n    "
-      EXPR_STMT@23..27
-        PAREN_EXPR@23..26
-          L_PAREN@23..24 "("
-          LITERAL@24..25
-            INT_NUMBER@24..25 "1"
-          R_PAREN@25..26 ")"
-        SEMICOLON@26..27 ";"
-      WHITESPACE@27..32 "\n    "
-      EXPR_STMT@32..37
-        TUPLE_EXPR@32..36
-          L_PAREN@32..33 "("
-          LITERAL@33..34
-            INT_NUMBER@33..34 "1"
-          COMMA@34..35 ","
-          R_PAREN@35..36 ")"
-        SEMICOLON@36..37 ";"
-      WHITESPACE@37..38 "\n"
-      R_CURLY@38..39 "}"
+      STMT_LIST@9..39
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..18
+          TUPLE_EXPR@15..17
+            L_PAREN@15..16 "("
+            R_PAREN@16..17 ")"
+          SEMICOLON@17..18 ";"
+        WHITESPACE@18..23 "\n    "
+        EXPR_STMT@23..27
+          PAREN_EXPR@23..26
+            L_PAREN@23..24 "("
+            LITERAL@24..25
+              INT_NUMBER@24..25 "1"
+            R_PAREN@25..26 ")"
+          SEMICOLON@26..27 ";"
+        WHITESPACE@27..32 "\n    "
+        EXPR_STMT@32..37
+          TUPLE_EXPR@32..36
+            L_PAREN@32..33 "("
+            LITERAL@33..34
+              INT_NUMBER@33..34 "1"
+            COMMA@34..35 ","
+            R_PAREN@35..36 ")"
+          SEMICOLON@36..37 ";"
+        WHITESPACE@37..38 "\n"
+        R_CURLY@38..39 "}"
   WHITESPACE@39..40 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0109_label.rast b/crates/syntax/test_data/parser/inline/ok/0109_label.rast
index 8540b852002..688e9dca4fb 100644
--- a/crates/syntax/test_data/parser/inline/ok/0109_label.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0109_label.rast
@@ -9,59 +9,63 @@ SOURCE_FILE@0..74
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..73
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..26
-        LOOP_EXPR@15..26
-          LABEL@15..18
-            LIFETIME@15..17
-              LIFETIME_IDENT@15..17 "'a"
-            COLON@17..18 ":"
-          WHITESPACE@18..19 " "
-          LOOP_KW@19..23 "loop"
-          WHITESPACE@23..24 " "
-          BLOCK_EXPR@24..26
-            L_CURLY@24..25 "{"
-            R_CURLY@25..26 "}"
-      WHITESPACE@26..31 "\n    "
-      EXPR_STMT@31..48
-        WHILE_EXPR@31..48
-          LABEL@31..34
-            LIFETIME@31..33
-              LIFETIME_IDENT@31..33 "'b"
-            COLON@33..34 ":"
-          WHITESPACE@34..35 " "
-          WHILE_KW@35..40 "while"
-          WHITESPACE@40..41 " "
-          CONDITION@41..45
-            LITERAL@41..45
-              TRUE_KW@41..45 "true"
-          WHITESPACE@45..46 " "
-          BLOCK_EXPR@46..48
-            L_CURLY@46..47 "{"
-            R_CURLY@47..48 "}"
-      WHITESPACE@48..53 "\n    "
-      FOR_EXPR@53..71
-        LABEL@53..56
-          LIFETIME@53..55
-            LIFETIME_IDENT@53..55 "'c"
-          COLON@55..56 ":"
-        WHITESPACE@56..57 " "
-        FOR_KW@57..60 "for"
-        WHITESPACE@60..61 " "
-        IDENT_PAT@61..62
-          NAME@61..62
-            IDENT@61..62 "x"
-        WHITESPACE@62..63 " "
-        IN_KW@63..65 "in"
-        WHITESPACE@65..66 " "
-        TUPLE_EXPR@66..68
-          L_PAREN@66..67 "("
-          R_PAREN@67..68 ")"
-        WHITESPACE@68..69 " "
-        BLOCK_EXPR@69..71
-          L_CURLY@69..70 "{"
-          R_CURLY@70..71 "}"
-      WHITESPACE@71..72 "\n"
-      R_CURLY@72..73 "}"
+      STMT_LIST@9..73
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..26
+          LOOP_EXPR@15..26
+            LABEL@15..18
+              LIFETIME@15..17
+                LIFETIME_IDENT@15..17 "'a"
+              COLON@17..18 ":"
+            WHITESPACE@18..19 " "
+            LOOP_KW@19..23 "loop"
+            WHITESPACE@23..24 " "
+            BLOCK_EXPR@24..26
+              STMT_LIST@24..26
+                L_CURLY@24..25 "{"
+                R_CURLY@25..26 "}"
+        WHITESPACE@26..31 "\n    "
+        EXPR_STMT@31..48
+          WHILE_EXPR@31..48
+            LABEL@31..34
+              LIFETIME@31..33
+                LIFETIME_IDENT@31..33 "'b"
+              COLON@33..34 ":"
+            WHITESPACE@34..35 " "
+            WHILE_KW@35..40 "while"
+            WHITESPACE@40..41 " "
+            CONDITION@41..45
+              LITERAL@41..45
+                TRUE_KW@41..45 "true"
+            WHITESPACE@45..46 " "
+            BLOCK_EXPR@46..48
+              STMT_LIST@46..48
+                L_CURLY@46..47 "{"
+                R_CURLY@47..48 "}"
+        WHITESPACE@48..53 "\n    "
+        FOR_EXPR@53..71
+          LABEL@53..56
+            LIFETIME@53..55
+              LIFETIME_IDENT@53..55 "'c"
+            COLON@55..56 ":"
+          WHITESPACE@56..57 " "
+          FOR_KW@57..60 "for"
+          WHITESPACE@60..61 " "
+          IDENT_PAT@61..62
+            NAME@61..62
+              IDENT@61..62 "x"
+          WHITESPACE@62..63 " "
+          IN_KW@63..65 "in"
+          WHITESPACE@65..66 " "
+          TUPLE_EXPR@66..68
+            L_PAREN@66..67 "("
+            R_PAREN@67..68 ")"
+          WHITESPACE@68..69 " "
+          BLOCK_EXPR@69..71
+            STMT_LIST@69..71
+              L_CURLY@69..70 "{"
+              R_CURLY@70..71 "}"
+        WHITESPACE@71..72 "\n"
+        R_CURLY@72..73 "}"
   WHITESPACE@73..74 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0111_tuple_pat.rast b/crates/syntax/test_data/parser/inline/ok/0111_tuple_pat.rast
index b82ed0230b1..994c345c9db 100644
--- a/crates/syntax/test_data/parser/inline/ok/0111_tuple_pat.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0111_tuple_pat.rast
@@ -9,81 +9,82 @@ SOURCE_FILE@0..94
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..93
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      LET_STMT@16..36
-        LET_KW@16..19 "let"
-        WHITESPACE@19..20 " "
-        TUPLE_PAT@20..30
-          L_PAREN@20..21 "("
-          IDENT_PAT@21..22
-            NAME@21..22
-              IDENT@21..22 "a"
-          COMMA@22..23 ","
-          WHITESPACE@23..24 " "
-          IDENT_PAT@24..25
-            NAME@24..25
-              IDENT@24..25 "b"
-          COMMA@25..26 ","
-          WHITESPACE@26..27 " "
-          REST_PAT@27..29
-            DOT2@27..29 ".."
-          R_PAREN@29..30 ")"
-        WHITESPACE@30..31 " "
-        EQ@31..32 "="
-        WHITESPACE@32..33 " "
-        TUPLE_EXPR@33..35
-          L_PAREN@33..34 "("
-          R_PAREN@34..35 ")"
-        SEMICOLON@35..36 ";"
-      WHITESPACE@36..41 "\n    "
-      LET_STMT@41..55
-        LET_KW@41..44 "let"
-        WHITESPACE@44..45 " "
-        TUPLE_PAT@45..49
-          L_PAREN@45..46 "("
-          IDENT_PAT@46..47
-            NAME@46..47
-              IDENT@46..47 "a"
-          COMMA@47..48 ","
-          R_PAREN@48..49 ")"
-        WHITESPACE@49..50 " "
-        EQ@50..51 "="
-        WHITESPACE@51..52 " "
-        TUPLE_EXPR@52..54
-          L_PAREN@52..53 "("
-          R_PAREN@53..54 ")"
-        SEMICOLON@54..55 ";"
-      WHITESPACE@55..60 "\n    "
-      LET_STMT@60..74
-        LET_KW@60..63 "let"
-        WHITESPACE@63..64 " "
-        TUPLE_PAT@64..68
-          L_PAREN@64..65 "("
-          REST_PAT@65..67
-            DOT2@65..67 ".."
-          R_PAREN@67..68 ")"
-        WHITESPACE@68..69 " "
-        EQ@69..70 "="
-        WHITESPACE@70..71 " "
-        TUPLE_EXPR@71..73
-          L_PAREN@71..72 "("
-          R_PAREN@72..73 ")"
-        SEMICOLON@73..74 ";"
-      WHITESPACE@74..79 "\n    "
-      LET_STMT@79..91
-        LET_KW@79..82 "let"
-        WHITESPACE@82..83 " "
-        TUPLE_PAT@83..85
-          L_PAREN@83..84 "("
-          R_PAREN@84..85 ")"
-        WHITESPACE@85..86 " "
-        EQ@86..87 "="
-        WHITESPACE@87..88 " "
-        TUPLE_EXPR@88..90
-          L_PAREN@88..89 "("
-          R_PAREN@89..90 ")"
-        SEMICOLON@90..91 ";"
-      WHITESPACE@91..92 "\n"
-      R_CURLY@92..93 "}"
+      STMT_LIST@10..93
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        LET_STMT@16..36
+          LET_KW@16..19 "let"
+          WHITESPACE@19..20 " "
+          TUPLE_PAT@20..30
+            L_PAREN@20..21 "("
+            IDENT_PAT@21..22
+              NAME@21..22
+                IDENT@21..22 "a"
+            COMMA@22..23 ","
+            WHITESPACE@23..24 " "
+            IDENT_PAT@24..25
+              NAME@24..25
+                IDENT@24..25 "b"
+            COMMA@25..26 ","
+            WHITESPACE@26..27 " "
+            REST_PAT@27..29
+              DOT2@27..29 ".."
+            R_PAREN@29..30 ")"
+          WHITESPACE@30..31 " "
+          EQ@31..32 "="
+          WHITESPACE@32..33 " "
+          TUPLE_EXPR@33..35
+            L_PAREN@33..34 "("
+            R_PAREN@34..35 ")"
+          SEMICOLON@35..36 ";"
+        WHITESPACE@36..41 "\n    "
+        LET_STMT@41..55
+          LET_KW@41..44 "let"
+          WHITESPACE@44..45 " "
+          TUPLE_PAT@45..49
+            L_PAREN@45..46 "("
+            IDENT_PAT@46..47
+              NAME@46..47
+                IDENT@46..47 "a"
+            COMMA@47..48 ","
+            R_PAREN@48..49 ")"
+          WHITESPACE@49..50 " "
+          EQ@50..51 "="
+          WHITESPACE@51..52 " "
+          TUPLE_EXPR@52..54
+            L_PAREN@52..53 "("
+            R_PAREN@53..54 ")"
+          SEMICOLON@54..55 ";"
+        WHITESPACE@55..60 "\n    "
+        LET_STMT@60..74
+          LET_KW@60..63 "let"
+          WHITESPACE@63..64 " "
+          TUPLE_PAT@64..68
+            L_PAREN@64..65 "("
+            REST_PAT@65..67
+              DOT2@65..67 ".."
+            R_PAREN@67..68 ")"
+          WHITESPACE@68..69 " "
+          EQ@69..70 "="
+          WHITESPACE@70..71 " "
+          TUPLE_EXPR@71..73
+            L_PAREN@71..72 "("
+            R_PAREN@72..73 ")"
+          SEMICOLON@73..74 ";"
+        WHITESPACE@74..79 "\n    "
+        LET_STMT@79..91
+          LET_KW@79..82 "let"
+          WHITESPACE@82..83 " "
+          TUPLE_PAT@83..85
+            L_PAREN@83..84 "("
+            R_PAREN@84..85 ")"
+          WHITESPACE@85..86 " "
+          EQ@86..87 "="
+          WHITESPACE@87..88 " "
+          TUPLE_EXPR@88..90
+            L_PAREN@88..89 "("
+            R_PAREN@89..90 ")"
+          SEMICOLON@90..91 ";"
+        WHITESPACE@91..92 "\n"
+        R_CURLY@92..93 "}"
   WHITESPACE@93..94 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0112_bind_pat.rast b/crates/syntax/test_data/parser/inline/ok/0112_bind_pat.rast
index 7b9a498c8ee..70f764944e3 100644
--- a/crates/syntax/test_data/parser/inline/ok/0112_bind_pat.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0112_bind_pat.rast
@@ -9,119 +9,120 @@ SOURCE_FILE@0..146
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..145
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      LET_STMT@16..27
-        LET_KW@16..19 "let"
-        WHITESPACE@19..20 " "
-        IDENT_PAT@20..21
-          NAME@20..21
-            IDENT@20..21 "a"
-        WHITESPACE@21..22 " "
-        EQ@22..23 "="
-        WHITESPACE@23..24 " "
-        TUPLE_EXPR@24..26
-          L_PAREN@24..25 "("
-          R_PAREN@25..26 ")"
-        SEMICOLON@26..27 ";"
-      WHITESPACE@27..32 "\n    "
-      LET_STMT@32..47
-        LET_KW@32..35 "let"
-        WHITESPACE@35..36 " "
-        IDENT_PAT@36..41
-          MUT_KW@36..39 "mut"
-          WHITESPACE@39..40 " "
-          NAME@40..41
-            IDENT@40..41 "b"
-        WHITESPACE@41..42 " "
-        EQ@42..43 "="
-        WHITESPACE@43..44 " "
-        TUPLE_EXPR@44..46
-          L_PAREN@44..45 "("
-          R_PAREN@45..46 ")"
-        SEMICOLON@46..47 ";"
-      WHITESPACE@47..52 "\n    "
-      LET_STMT@52..67
-        LET_KW@52..55 "let"
-        WHITESPACE@55..56 " "
-        IDENT_PAT@56..61
-          REF_KW@56..59 "ref"
-          WHITESPACE@59..60 " "
-          NAME@60..61
-            IDENT@60..61 "c"
-        WHITESPACE@61..62 " "
-        EQ@62..63 "="
-        WHITESPACE@63..64 " "
-        TUPLE_EXPR@64..66
-          L_PAREN@64..65 "("
-          R_PAREN@65..66 ")"
-        SEMICOLON@66..67 ";"
-      WHITESPACE@67..72 "\n    "
-      LET_STMT@72..91
-        LET_KW@72..75 "let"
-        WHITESPACE@75..76 " "
-        IDENT_PAT@76..85
-          REF_KW@76..79 "ref"
-          WHITESPACE@79..80 " "
-          MUT_KW@80..83 "mut"
-          WHITESPACE@83..84 " "
-          NAME@84..85
-            IDENT@84..85 "d"
-        WHITESPACE@85..86 " "
-        EQ@86..87 "="
-        WHITESPACE@87..88 " "
-        TUPLE_EXPR@88..90
-          L_PAREN@88..89 "("
-          R_PAREN@89..90 ")"
-        SEMICOLON@90..91 ";"
-      WHITESPACE@91..96 "\n    "
-      LET_STMT@96..111
-        LET_KW@96..99 "let"
-        WHITESPACE@99..100 " "
-        IDENT_PAT@100..105
-          NAME@100..101
-            IDENT@100..101 "e"
-          WHITESPACE@101..102 " "
-          AT@102..103 "@"
-          WHITESPACE@103..104 " "
-          WILDCARD_PAT@104..105
-            UNDERSCORE@104..105 "_"
-        WHITESPACE@105..106 " "
-        EQ@106..107 "="
-        WHITESPACE@107..108 " "
-        TUPLE_EXPR@108..110
-          L_PAREN@108..109 "("
-          R_PAREN@109..110 ")"
-        SEMICOLON@110..111 ";"
-      WHITESPACE@111..116 "\n    "
-      LET_STMT@116..143
-        LET_KW@116..119 "let"
-        WHITESPACE@119..120 " "
-        IDENT_PAT@120..137
-          REF_KW@120..123 "ref"
-          WHITESPACE@123..124 " "
-          MUT_KW@124..127 "mut"
-          WHITESPACE@127..128 " "
-          NAME@128..129
-            IDENT@128..129 "f"
-          WHITESPACE@129..130 " "
-          AT@130..131 "@"
-          WHITESPACE@131..132 " "
-          IDENT_PAT@132..137
-            NAME@132..133
-              IDENT@132..133 "g"
-            WHITESPACE@133..134 " "
-            AT@134..135 "@"
-            WHITESPACE@135..136 " "
-            WILDCARD_PAT@136..137
-              UNDERSCORE@136..137 "_"
-        WHITESPACE@137..138 " "
-        EQ@138..139 "="
-        WHITESPACE@139..140 " "
-        TUPLE_EXPR@140..142
-          L_PAREN@140..141 "("
-          R_PAREN@141..142 ")"
-        SEMICOLON@142..143 ";"
-      WHITESPACE@143..144 "\n"
-      R_CURLY@144..145 "}"
+      STMT_LIST@10..145
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        LET_STMT@16..27
+          LET_KW@16..19 "let"
+          WHITESPACE@19..20 " "
+          IDENT_PAT@20..21
+            NAME@20..21
+              IDENT@20..21 "a"
+          WHITESPACE@21..22 " "
+          EQ@22..23 "="
+          WHITESPACE@23..24 " "
+          TUPLE_EXPR@24..26
+            L_PAREN@24..25 "("
+            R_PAREN@25..26 ")"
+          SEMICOLON@26..27 ";"
+        WHITESPACE@27..32 "\n    "
+        LET_STMT@32..47
+          LET_KW@32..35 "let"
+          WHITESPACE@35..36 " "
+          IDENT_PAT@36..41
+            MUT_KW@36..39 "mut"
+            WHITESPACE@39..40 " "
+            NAME@40..41
+              IDENT@40..41 "b"
+          WHITESPACE@41..42 " "
+          EQ@42..43 "="
+          WHITESPACE@43..44 " "
+          TUPLE_EXPR@44..46
+            L_PAREN@44..45 "("
+            R_PAREN@45..46 ")"
+          SEMICOLON@46..47 ";"
+        WHITESPACE@47..52 "\n    "
+        LET_STMT@52..67
+          LET_KW@52..55 "let"
+          WHITESPACE@55..56 " "
+          IDENT_PAT@56..61
+            REF_KW@56..59 "ref"
+            WHITESPACE@59..60 " "
+            NAME@60..61
+              IDENT@60..61 "c"
+          WHITESPACE@61..62 " "
+          EQ@62..63 "="
+          WHITESPACE@63..64 " "
+          TUPLE_EXPR@64..66
+            L_PAREN@64..65 "("
+            R_PAREN@65..66 ")"
+          SEMICOLON@66..67 ";"
+        WHITESPACE@67..72 "\n    "
+        LET_STMT@72..91
+          LET_KW@72..75 "let"
+          WHITESPACE@75..76 " "
+          IDENT_PAT@76..85
+            REF_KW@76..79 "ref"
+            WHITESPACE@79..80 " "
+            MUT_KW@80..83 "mut"
+            WHITESPACE@83..84 " "
+            NAME@84..85
+              IDENT@84..85 "d"
+          WHITESPACE@85..86 " "
+          EQ@86..87 "="
+          WHITESPACE@87..88 " "
+          TUPLE_EXPR@88..90
+            L_PAREN@88..89 "("
+            R_PAREN@89..90 ")"
+          SEMICOLON@90..91 ";"
+        WHITESPACE@91..96 "\n    "
+        LET_STMT@96..111
+          LET_KW@96..99 "let"
+          WHITESPACE@99..100 " "
+          IDENT_PAT@100..105
+            NAME@100..101
+              IDENT@100..101 "e"
+            WHITESPACE@101..102 " "
+            AT@102..103 "@"
+            WHITESPACE@103..104 " "
+            WILDCARD_PAT@104..105
+              UNDERSCORE@104..105 "_"
+          WHITESPACE@105..106 " "
+          EQ@106..107 "="
+          WHITESPACE@107..108 " "
+          TUPLE_EXPR@108..110
+            L_PAREN@108..109 "("
+            R_PAREN@109..110 ")"
+          SEMICOLON@110..111 ";"
+        WHITESPACE@111..116 "\n    "
+        LET_STMT@116..143
+          LET_KW@116..119 "let"
+          WHITESPACE@119..120 " "
+          IDENT_PAT@120..137
+            REF_KW@120..123 "ref"
+            WHITESPACE@123..124 " "
+            MUT_KW@124..127 "mut"
+            WHITESPACE@127..128 " "
+            NAME@128..129
+              IDENT@128..129 "f"
+            WHITESPACE@129..130 " "
+            AT@130..131 "@"
+            WHITESPACE@131..132 " "
+            IDENT_PAT@132..137
+              NAME@132..133
+                IDENT@132..133 "g"
+              WHITESPACE@133..134 " "
+              AT@134..135 "@"
+              WHITESPACE@135..136 " "
+              WILDCARD_PAT@136..137
+                UNDERSCORE@136..137 "_"
+          WHITESPACE@137..138 " "
+          EQ@138..139 "="
+          WHITESPACE@139..140 " "
+          TUPLE_EXPR@140..142
+            L_PAREN@140..141 "("
+            R_PAREN@141..142 ")"
+          SEMICOLON@142..143 ";"
+        WHITESPACE@143..144 "\n"
+        R_CURLY@144..145 "}"
   WHITESPACE@145..146 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0113_nocontentexpr.rast b/crates/syntax/test_data/parser/inline/ok/0113_nocontentexpr.rast
index d761c1c68e1..538b3577acd 100644
--- a/crates/syntax/test_data/parser/inline/ok/0113_nocontentexpr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0113_nocontentexpr.rast
@@ -8,48 +8,50 @@ SOURCE_FILE@0..50
       L_PAREN@6..7 "("
       R_PAREN@7..8 ")"
     BLOCK_EXPR@8..49
-      L_CURLY@8..9 "{"
-      WHITESPACE@9..14 "\n    "
-      SEMICOLON@14..15 ";"
-      SEMICOLON@15..16 ";"
-      SEMICOLON@16..17 ";"
-      EXPR_STMT@17..29
-        CALL_EXPR@17..28
-          PATH_EXPR@17..26
-            PATH@17..26
-              PATH_SEGMENT@17..26
-                NAME_REF@17..26
-                  IDENT@17..26 "some_expr"
-          ARG_LIST@26..28
-            L_PAREN@26..27 "("
-            R_PAREN@27..28 ")"
-        SEMICOLON@28..29 ";"
-      SEMICOLON@29..30 ";"
-      SEMICOLON@30..31 ";"
-      SEMICOLON@31..32 ";"
-      EXPR_STMT@32..38
-        BLOCK_EXPR@32..37
-          L_CURLY@32..33 "{"
-          SEMICOLON@33..34 ";"
-          SEMICOLON@34..35 ";"
-          SEMICOLON@35..36 ";"
-          R_CURLY@36..37 "}"
-        SEMICOLON@37..38 ";"
-      SEMICOLON@38..39 ";"
-      SEMICOLON@39..40 ";"
-      SEMICOLON@40..41 ";"
-      CALL_EXPR@41..47
-        PATH_EXPR@41..43
-          PATH@41..43
-            PATH_SEGMENT@41..43
-              NAME_REF@41..43
-                IDENT@41..43 "Ok"
-        ARG_LIST@43..47
-          L_PAREN@43..44 "("
-          TUPLE_EXPR@44..46
-            L_PAREN@44..45 "("
-            R_PAREN@45..46 ")"
-          R_PAREN@46..47 ")"
-      WHITESPACE@47..48 "\n"
-      R_CURLY@48..49 "}"
+      STMT_LIST@8..49
+        L_CURLY@8..9 "{"
+        WHITESPACE@9..14 "\n    "
+        SEMICOLON@14..15 ";"
+        SEMICOLON@15..16 ";"
+        SEMICOLON@16..17 ";"
+        EXPR_STMT@17..29
+          CALL_EXPR@17..28
+            PATH_EXPR@17..26
+              PATH@17..26
+                PATH_SEGMENT@17..26
+                  NAME_REF@17..26
+                    IDENT@17..26 "some_expr"
+            ARG_LIST@26..28
+              L_PAREN@26..27 "("
+              R_PAREN@27..28 ")"
+          SEMICOLON@28..29 ";"
+        SEMICOLON@29..30 ";"
+        SEMICOLON@30..31 ";"
+        SEMICOLON@31..32 ";"
+        EXPR_STMT@32..38
+          BLOCK_EXPR@32..37
+            STMT_LIST@32..37
+              L_CURLY@32..33 "{"
+              SEMICOLON@33..34 ";"
+              SEMICOLON@34..35 ";"
+              SEMICOLON@35..36 ";"
+              R_CURLY@36..37 "}"
+          SEMICOLON@37..38 ";"
+        SEMICOLON@38..39 ";"
+        SEMICOLON@39..40 ";"
+        SEMICOLON@40..41 ";"
+        CALL_EXPR@41..47
+          PATH_EXPR@41..43
+            PATH@41..43
+              PATH_SEGMENT@41..43
+                NAME_REF@41..43
+                  IDENT@41..43 "Ok"
+          ARG_LIST@43..47
+            L_PAREN@43..44 "("
+            TUPLE_EXPR@44..46
+              L_PAREN@44..45 "("
+              R_PAREN@45..46 ")"
+            R_PAREN@46..47 ")"
+        WHITESPACE@47..48 "\n"
+        R_CURLY@48..49 "}"
   WHITESPACE@49..50 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0118_match_guard.rast b/crates/syntax/test_data/parser/inline/ok/0118_match_guard.rast
index 646e2d1fd99..8d5fe502feb 100644
--- a/crates/syntax/test_data/parser/inline/ok/0118_match_guard.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0118_match_guard.rast
@@ -9,67 +9,68 @@ SOURCE_FILE@0..92
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..91
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      MATCH_EXPR@15..89
-        MATCH_KW@15..20 "match"
-        WHITESPACE@20..21 " "
-        TUPLE_EXPR@21..23
-          L_PAREN@21..22 "("
-          R_PAREN@22..23 ")"
-        WHITESPACE@23..24 " "
-        MATCH_ARM_LIST@24..89
-          L_CURLY@24..25 "{"
-          WHITESPACE@25..34 "\n        "
-          MATCH_ARM@34..49
-            WILDCARD_PAT@34..35
-              UNDERSCORE@34..35 "_"
-            WHITESPACE@35..36 " "
-            MATCH_GUARD@36..42
-              IF_KW@36..38 "if"
-              WHITESPACE@38..39 " "
-              PATH_EXPR@39..42
-                PATH@39..42
-                  PATH_SEGMENT@39..42
-                    NAME_REF@39..42
-                      IDENT@39..42 "foo"
-            WHITESPACE@42..43 " "
-            FAT_ARROW@43..45 "=>"
-            WHITESPACE@45..46 " "
-            TUPLE_EXPR@46..48
-              L_PAREN@46..47 "("
-              R_PAREN@47..48 ")"
-            COMMA@48..49 ","
-          WHITESPACE@49..58 "\n        "
-          MATCH_ARM@58..83
-            WILDCARD_PAT@58..59
-              UNDERSCORE@58..59 "_"
-            WHITESPACE@59..60 " "
-            MATCH_GUARD@60..76
-              IF_KW@60..62 "if"
-              WHITESPACE@62..63 " "
-              LET_KW@63..66 "let"
-              WHITESPACE@66..67 " "
-              IDENT_PAT@67..70
-                NAME@67..70
-                  IDENT@67..70 "foo"
-              WHITESPACE@70..71 " "
-              EQ@71..72 "="
-              WHITESPACE@72..73 " "
-              PATH_EXPR@73..76
-                PATH@73..76
-                  PATH_SEGMENT@73..76
-                    NAME_REF@73..76
-                      IDENT@73..76 "bar"
-            WHITESPACE@76..77 " "
-            FAT_ARROW@77..79 "=>"
-            WHITESPACE@79..80 " "
-            TUPLE_EXPR@80..82
-              L_PAREN@80..81 "("
-              R_PAREN@81..82 ")"
-            COMMA@82..83 ","
-          WHITESPACE@83..88 "\n    "
-          R_CURLY@88..89 "}"
-      WHITESPACE@89..90 "\n"
-      R_CURLY@90..91 "}"
+      STMT_LIST@9..91
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        MATCH_EXPR@15..89
+          MATCH_KW@15..20 "match"
+          WHITESPACE@20..21 " "
+          TUPLE_EXPR@21..23
+            L_PAREN@21..22 "("
+            R_PAREN@22..23 ")"
+          WHITESPACE@23..24 " "
+          MATCH_ARM_LIST@24..89
+            L_CURLY@24..25 "{"
+            WHITESPACE@25..34 "\n        "
+            MATCH_ARM@34..49
+              WILDCARD_PAT@34..35
+                UNDERSCORE@34..35 "_"
+              WHITESPACE@35..36 " "
+              MATCH_GUARD@36..42
+                IF_KW@36..38 "if"
+                WHITESPACE@38..39 " "
+                PATH_EXPR@39..42
+                  PATH@39..42
+                    PATH_SEGMENT@39..42
+                      NAME_REF@39..42
+                        IDENT@39..42 "foo"
+              WHITESPACE@42..43 " "
+              FAT_ARROW@43..45 "=>"
+              WHITESPACE@45..46 " "
+              TUPLE_EXPR@46..48
+                L_PAREN@46..47 "("
+                R_PAREN@47..48 ")"
+              COMMA@48..49 ","
+            WHITESPACE@49..58 "\n        "
+            MATCH_ARM@58..83
+              WILDCARD_PAT@58..59
+                UNDERSCORE@58..59 "_"
+              WHITESPACE@59..60 " "
+              MATCH_GUARD@60..76
+                IF_KW@60..62 "if"
+                WHITESPACE@62..63 " "
+                LET_KW@63..66 "let"
+                WHITESPACE@66..67 " "
+                IDENT_PAT@67..70
+                  NAME@67..70
+                    IDENT@67..70 "foo"
+                WHITESPACE@70..71 " "
+                EQ@71..72 "="
+                WHITESPACE@72..73 " "
+                PATH_EXPR@73..76
+                  PATH@73..76
+                    PATH_SEGMENT@73..76
+                      NAME_REF@73..76
+                        IDENT@73..76 "bar"
+              WHITESPACE@76..77 " "
+              FAT_ARROW@77..79 "=>"
+              WHITESPACE@79..80 " "
+              TUPLE_EXPR@80..82
+                L_PAREN@80..81 "("
+                R_PAREN@81..82 ")"
+              COMMA@82..83 ","
+            WHITESPACE@83..88 "\n    "
+            R_CURLY@88..89 "}"
+        WHITESPACE@89..90 "\n"
+        R_CURLY@90..91 "}"
   WHITESPACE@91..92 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0120_match_arms_inner_attribute.rast b/crates/syntax/test_data/parser/inline/ok/0120_match_arms_inner_attribute.rast
index 443f3685326..517b221d4eb 100644
--- a/crates/syntax/test_data/parser/inline/ok/0120_match_arms_inner_attribute.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0120_match_arms_inner_attribute.rast
@@ -9,75 +9,76 @@ SOURCE_FILE@0..139
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..138
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      MATCH_EXPR@15..136
-        MATCH_KW@15..20 "match"
-        WHITESPACE@20..21 " "
-        TUPLE_EXPR@21..23
-          L_PAREN@21..22 "("
-          R_PAREN@22..23 ")"
-        WHITESPACE@23..24 " "
-        MATCH_ARM_LIST@24..136
-          L_CURLY@24..25 "{"
-          WHITESPACE@25..34 "\n        "
-          ATTR@34..60
-            POUND@34..35 "#"
-            BANG@35..36 "!"
-            L_BRACK@36..37 "["
-            META@37..59
-              PATH@37..40
-                PATH_SEGMENT@37..40
-                  NAME_REF@37..40
-                    IDENT@37..40 "doc"
-              TOKEN_TREE@40..59
-                L_PAREN@40..41 "("
-                STRING@41..58 "\"Inner attribute\""
-                R_PAREN@58..59 ")"
-            R_BRACK@59..60 "]"
-          WHITESPACE@60..69 "\n        "
-          ATTR@69..86
-            POUND@69..70 "#"
-            BANG@70..71 "!"
-            L_BRACK@71..72 "["
-            META@72..85
-              PATH@72..75
-                PATH_SEGMENT@72..75
-                  NAME_REF@72..75
-                    IDENT@72..75 "doc"
-              TOKEN_TREE@75..85
-                L_PAREN@75..76 "("
-                STRING@76..84 "\"Can be\""
-                R_PAREN@84..85 ")"
-            R_BRACK@85..86 "]"
-          WHITESPACE@86..95 "\n        "
-          ATTR@95..113
-            POUND@95..96 "#"
-            BANG@96..97 "!"
-            L_BRACK@97..98 "["
-            META@98..112
-              PATH@98..101
-                PATH_SEGMENT@98..101
-                  NAME_REF@98..101
-                    IDENT@98..101 "doc"
-              TOKEN_TREE@101..112
-                L_PAREN@101..102 "("
-                STRING@102..111 "\"Stacked\""
-                R_PAREN@111..112 ")"
-            R_BRACK@112..113 "]"
-          WHITESPACE@113..122 "\n        "
-          MATCH_ARM@122..130
-            WILDCARD_PAT@122..123
-              UNDERSCORE@122..123 "_"
-            WHITESPACE@123..124 " "
-            FAT_ARROW@124..126 "=>"
-            WHITESPACE@126..127 " "
-            TUPLE_EXPR@127..129
-              L_PAREN@127..128 "("
-              R_PAREN@128..129 ")"
-            COMMA@129..130 ","
-          WHITESPACE@130..135 "\n    "
-          R_CURLY@135..136 "}"
-      WHITESPACE@136..137 "\n"
-      R_CURLY@137..138 "}"
+      STMT_LIST@9..138
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        MATCH_EXPR@15..136
+          MATCH_KW@15..20 "match"
+          WHITESPACE@20..21 " "
+          TUPLE_EXPR@21..23
+            L_PAREN@21..22 "("
+            R_PAREN@22..23 ")"
+          WHITESPACE@23..24 " "
+          MATCH_ARM_LIST@24..136
+            L_CURLY@24..25 "{"
+            WHITESPACE@25..34 "\n        "
+            ATTR@34..60
+              POUND@34..35 "#"
+              BANG@35..36 "!"
+              L_BRACK@36..37 "["
+              META@37..59
+                PATH@37..40
+                  PATH_SEGMENT@37..40
+                    NAME_REF@37..40
+                      IDENT@37..40 "doc"
+                TOKEN_TREE@40..59
+                  L_PAREN@40..41 "("
+                  STRING@41..58 "\"Inner attribute\""
+                  R_PAREN@58..59 ")"
+              R_BRACK@59..60 "]"
+            WHITESPACE@60..69 "\n        "
+            ATTR@69..86
+              POUND@69..70 "#"
+              BANG@70..71 "!"
+              L_BRACK@71..72 "["
+              META@72..85
+                PATH@72..75
+                  PATH_SEGMENT@72..75
+                    NAME_REF@72..75
+                      IDENT@72..75 "doc"
+                TOKEN_TREE@75..85
+                  L_PAREN@75..76 "("
+                  STRING@76..84 "\"Can be\""
+                  R_PAREN@84..85 ")"
+              R_BRACK@85..86 "]"
+            WHITESPACE@86..95 "\n        "
+            ATTR@95..113
+              POUND@95..96 "#"
+              BANG@96..97 "!"
+              L_BRACK@97..98 "["
+              META@98..112
+                PATH@98..101
+                  PATH_SEGMENT@98..101
+                    NAME_REF@98..101
+                      IDENT@98..101 "doc"
+                TOKEN_TREE@101..112
+                  L_PAREN@101..102 "("
+                  STRING@102..111 "\"Stacked\""
+                  R_PAREN@111..112 ")"
+              R_BRACK@112..113 "]"
+            WHITESPACE@113..122 "\n        "
+            MATCH_ARM@122..130
+              WILDCARD_PAT@122..123
+                UNDERSCORE@122..123 "_"
+              WHITESPACE@123..124 " "
+              FAT_ARROW@124..126 "=>"
+              WHITESPACE@126..127 " "
+              TUPLE_EXPR@127..129
+                L_PAREN@127..128 "("
+                R_PAREN@128..129 ")"
+              COMMA@129..130 ","
+            WHITESPACE@130..135 "\n    "
+            R_CURLY@135..136 "}"
+        WHITESPACE@136..137 "\n"
+        R_CURLY@137..138 "}"
   WHITESPACE@138..139 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0121_match_arms_outer_attributes.rast b/crates/syntax/test_data/parser/inline/ok/0121_match_arms_outer_attributes.rast
index 1b2db27e4f7..54cf1d08926 100644
--- a/crates/syntax/test_data/parser/inline/ok/0121_match_arms_outer_attributes.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0121_match_arms_outer_attributes.rast
@@ -9,142 +9,143 @@ SOURCE_FILE@0..259
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..258
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      MATCH_EXPR@15..256
-        MATCH_KW@15..20 "match"
-        WHITESPACE@20..21 " "
-        TUPLE_EXPR@21..23
-          L_PAREN@21..22 "("
-          R_PAREN@22..23 ")"
-        WHITESPACE@23..24 " "
-        MATCH_ARM_LIST@24..256
-          L_CURLY@24..25 "{"
-          WHITESPACE@25..34 "\n        "
-          MATCH_ARM@34..75
-            ATTR@34..58
-              POUND@34..35 "#"
-              L_BRACK@35..36 "["
-              META@36..57
-                PATH@36..39
-                  PATH_SEGMENT@36..39
-                    NAME_REF@36..39
-                      IDENT@36..39 "cfg"
-                TOKEN_TREE@39..57
-                  L_PAREN@39..40 "("
-                  IDENT@40..47 "feature"
-                  WHITESPACE@47..48 " "
-                  EQ@48..49 "="
-                  WHITESPACE@49..50 " "
-                  STRING@50..56 "\"some\""
-                  R_PAREN@56..57 ")"
-              R_BRACK@57..58 "]"
-            WHITESPACE@58..67 "\n        "
-            WILDCARD_PAT@67..68
-              UNDERSCORE@67..68 "_"
-            WHITESPACE@68..69 " "
-            FAT_ARROW@69..71 "=>"
-            WHITESPACE@71..72 " "
-            TUPLE_EXPR@72..74
-              L_PAREN@72..73 "("
-              R_PAREN@73..74 ")"
-            COMMA@74..75 ","
-          WHITESPACE@75..84 "\n        "
-          MATCH_ARM@84..126
-            ATTR@84..109
-              POUND@84..85 "#"
-              L_BRACK@85..86 "["
-              META@86..108
-                PATH@86..89
-                  PATH_SEGMENT@86..89
-                    NAME_REF@86..89
-                      IDENT@86..89 "cfg"
-                TOKEN_TREE@89..108
-                  L_PAREN@89..90 "("
-                  IDENT@90..97 "feature"
-                  WHITESPACE@97..98 " "
-                  EQ@98..99 "="
-                  WHITESPACE@99..100 " "
-                  STRING@100..107 "\"other\""
-                  R_PAREN@107..108 ")"
-              R_BRACK@108..109 "]"
-            WHITESPACE@109..118 "\n        "
-            WILDCARD_PAT@118..119
-              UNDERSCORE@118..119 "_"
-            WHITESPACE@119..120 " "
-            FAT_ARROW@120..122 "=>"
-            WHITESPACE@122..123 " "
-            TUPLE_EXPR@123..125
-              L_PAREN@123..124 "("
-              R_PAREN@124..125 ")"
-            COMMA@125..126 ","
-          WHITESPACE@126..135 "\n        "
-          MATCH_ARM@135..250
-            ATTR@135..159
-              POUND@135..136 "#"
-              L_BRACK@136..137 "["
-              META@137..158
-                PATH@137..140
-                  PATH_SEGMENT@137..140
-                    NAME_REF@137..140
-                      IDENT@137..140 "cfg"
-                TOKEN_TREE@140..158
-                  L_PAREN@140..141 "("
-                  IDENT@141..148 "feature"
-                  WHITESPACE@148..149 " "
-                  EQ@149..150 "="
-                  WHITESPACE@150..151 " "
-                  STRING@151..157 "\"many\""
-                  R_PAREN@157..158 ")"
-              R_BRACK@158..159 "]"
-            WHITESPACE@159..168 "\n        "
-            ATTR@168..198
-              POUND@168..169 "#"
-              L_BRACK@169..170 "["
-              META@170..197
-                PATH@170..173
-                  PATH_SEGMENT@170..173
-                    NAME_REF@170..173
-                      IDENT@170..173 "cfg"
-                TOKEN_TREE@173..197
-                  L_PAREN@173..174 "("
-                  IDENT@174..181 "feature"
-                  WHITESPACE@181..182 " "
-                  EQ@182..183 "="
-                  WHITESPACE@183..184 " "
-                  STRING@184..196 "\"attributes\""
-                  R_PAREN@196..197 ")"
-              R_BRACK@197..198 "]"
-            WHITESPACE@198..207 "\n        "
-            ATTR@207..233
-              POUND@207..208 "#"
-              L_BRACK@208..209 "["
-              META@209..232
-                PATH@209..212
-                  PATH_SEGMENT@209..212
-                    NAME_REF@209..212
-                      IDENT@209..212 "cfg"
-                TOKEN_TREE@212..232
-                  L_PAREN@212..213 "("
-                  IDENT@213..220 "feature"
-                  WHITESPACE@220..221 " "
-                  EQ@221..222 "="
-                  WHITESPACE@222..223 " "
-                  STRING@223..231 "\"before\""
-                  R_PAREN@231..232 ")"
-              R_BRACK@232..233 "]"
-            WHITESPACE@233..242 "\n        "
-            WILDCARD_PAT@242..243
-              UNDERSCORE@242..243 "_"
-            WHITESPACE@243..244 " "
-            FAT_ARROW@244..246 "=>"
-            WHITESPACE@246..247 " "
-            TUPLE_EXPR@247..249
-              L_PAREN@247..248 "("
-              R_PAREN@248..249 ")"
-            COMMA@249..250 ","
-          WHITESPACE@250..255 "\n    "
-          R_CURLY@255..256 "}"
-      WHITESPACE@256..257 "\n"
-      R_CURLY@257..258 "}"
+      STMT_LIST@9..258
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        MATCH_EXPR@15..256
+          MATCH_KW@15..20 "match"
+          WHITESPACE@20..21 " "
+          TUPLE_EXPR@21..23
+            L_PAREN@21..22 "("
+            R_PAREN@22..23 ")"
+          WHITESPACE@23..24 " "
+          MATCH_ARM_LIST@24..256
+            L_CURLY@24..25 "{"
+            WHITESPACE@25..34 "\n        "
+            MATCH_ARM@34..75
+              ATTR@34..58
+                POUND@34..35 "#"
+                L_BRACK@35..36 "["
+                META@36..57
+                  PATH@36..39
+                    PATH_SEGMENT@36..39
+                      NAME_REF@36..39
+                        IDENT@36..39 "cfg"
+                  TOKEN_TREE@39..57
+                    L_PAREN@39..40 "("
+                    IDENT@40..47 "feature"
+                    WHITESPACE@47..48 " "
+                    EQ@48..49 "="
+                    WHITESPACE@49..50 " "
+                    STRING@50..56 "\"some\""
+                    R_PAREN@56..57 ")"
+                R_BRACK@57..58 "]"
+              WHITESPACE@58..67 "\n        "
+              WILDCARD_PAT@67..68
+                UNDERSCORE@67..68 "_"
+              WHITESPACE@68..69 " "
+              FAT_ARROW@69..71 "=>"
+              WHITESPACE@71..72 " "
+              TUPLE_EXPR@72..74
+                L_PAREN@72..73 "("
+                R_PAREN@73..74 ")"
+              COMMA@74..75 ","
+            WHITESPACE@75..84 "\n        "
+            MATCH_ARM@84..126
+              ATTR@84..109
+                POUND@84..85 "#"
+                L_BRACK@85..86 "["
+                META@86..108
+                  PATH@86..89
+                    PATH_SEGMENT@86..89
+                      NAME_REF@86..89
+                        IDENT@86..89 "cfg"
+                  TOKEN_TREE@89..108
+                    L_PAREN@89..90 "("
+                    IDENT@90..97 "feature"
+                    WHITESPACE@97..98 " "
+                    EQ@98..99 "="
+                    WHITESPACE@99..100 " "
+                    STRING@100..107 "\"other\""
+                    R_PAREN@107..108 ")"
+                R_BRACK@108..109 "]"
+              WHITESPACE@109..118 "\n        "
+              WILDCARD_PAT@118..119
+                UNDERSCORE@118..119 "_"
+              WHITESPACE@119..120 " "
+              FAT_ARROW@120..122 "=>"
+              WHITESPACE@122..123 " "
+              TUPLE_EXPR@123..125
+                L_PAREN@123..124 "("
+                R_PAREN@124..125 ")"
+              COMMA@125..126 ","
+            WHITESPACE@126..135 "\n        "
+            MATCH_ARM@135..250
+              ATTR@135..159
+                POUND@135..136 "#"
+                L_BRACK@136..137 "["
+                META@137..158
+                  PATH@137..140
+                    PATH_SEGMENT@137..140
+                      NAME_REF@137..140
+                        IDENT@137..140 "cfg"
+                  TOKEN_TREE@140..158
+                    L_PAREN@140..141 "("
+                    IDENT@141..148 "feature"
+                    WHITESPACE@148..149 " "
+                    EQ@149..150 "="
+                    WHITESPACE@150..151 " "
+                    STRING@151..157 "\"many\""
+                    R_PAREN@157..158 ")"
+                R_BRACK@158..159 "]"
+              WHITESPACE@159..168 "\n        "
+              ATTR@168..198
+                POUND@168..169 "#"
+                L_BRACK@169..170 "["
+                META@170..197
+                  PATH@170..173
+                    PATH_SEGMENT@170..173
+                      NAME_REF@170..173
+                        IDENT@170..173 "cfg"
+                  TOKEN_TREE@173..197
+                    L_PAREN@173..174 "("
+                    IDENT@174..181 "feature"
+                    WHITESPACE@181..182 " "
+                    EQ@182..183 "="
+                    WHITESPACE@183..184 " "
+                    STRING@184..196 "\"attributes\""
+                    R_PAREN@196..197 ")"
+                R_BRACK@197..198 "]"
+              WHITESPACE@198..207 "\n        "
+              ATTR@207..233
+                POUND@207..208 "#"
+                L_BRACK@208..209 "["
+                META@209..232
+                  PATH@209..212
+                    PATH_SEGMENT@209..212
+                      NAME_REF@209..212
+                        IDENT@209..212 "cfg"
+                  TOKEN_TREE@212..232
+                    L_PAREN@212..213 "("
+                    IDENT@213..220 "feature"
+                    WHITESPACE@220..221 " "
+                    EQ@221..222 "="
+                    WHITESPACE@222..223 " "
+                    STRING@223..231 "\"before\""
+                    R_PAREN@231..232 ")"
+                R_BRACK@232..233 "]"
+              WHITESPACE@233..242 "\n        "
+              WILDCARD_PAT@242..243
+                UNDERSCORE@242..243 "_"
+              WHITESPACE@243..244 " "
+              FAT_ARROW@244..246 "=>"
+              WHITESPACE@246..247 " "
+              TUPLE_EXPR@247..249
+                L_PAREN@247..248 "("
+                R_PAREN@248..249 ")"
+              COMMA@249..250 ","
+            WHITESPACE@250..255 "\n    "
+            R_CURLY@255..256 "}"
+        WHITESPACE@256..257 "\n"
+        R_CURLY@257..258 "}"
   WHITESPACE@258..259 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0125_crate_keyword_path.rast b/crates/syntax/test_data/parser/inline/ok/0125_crate_keyword_path.rast
index 0fed2d3111f..69633b8e50a 100644
--- a/crates/syntax/test_data/parser/inline/ok/0125_crate_keyword_path.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0125_crate_keyword_path.rast
@@ -9,24 +9,25 @@ SOURCE_FILE@0..27
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..26
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..11 " "
-      EXPR_STMT@11..24
-        CALL_EXPR@11..23
-          PATH_EXPR@11..21
-            PATH@11..21
-              PATH@11..16
-                PATH_SEGMENT@11..16
-                  NAME_REF@11..16
-                    CRATE_KW@11..16 "crate"
-              COLON2@16..18 "::"
-              PATH_SEGMENT@18..21
-                NAME_REF@18..21
-                  IDENT@18..21 "foo"
-          ARG_LIST@21..23
-            L_PAREN@21..22 "("
-            R_PAREN@22..23 ")"
-        SEMICOLON@23..24 ";"
-      WHITESPACE@24..25 " "
-      R_CURLY@25..26 "}"
+      STMT_LIST@9..26
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..11 " "
+        EXPR_STMT@11..24
+          CALL_EXPR@11..23
+            PATH_EXPR@11..21
+              PATH@11..21
+                PATH@11..16
+                  PATH_SEGMENT@11..16
+                    NAME_REF@11..16
+                      CRATE_KW@11..16 "crate"
+                COLON2@16..18 "::"
+                PATH_SEGMENT@18..21
+                  NAME_REF@18..21
+                    IDENT@18..21 "foo"
+            ARG_LIST@21..23
+              L_PAREN@21..22 "("
+              R_PAREN@22..23 ")"
+          SEMICOLON@23..24 ";"
+        WHITESPACE@24..25 " "
+        R_CURLY@25..26 "}"
   WHITESPACE@26..27 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0125_record_literal_field_with_attr.rast b/crates/syntax/test_data/parser/inline/ok/0125_record_literal_field_with_attr.rast
index 5e82214c0e0..1755a53b517 100644
--- a/crates/syntax/test_data/parser/inline/ok/0125_record_literal_field_with_attr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0125_record_literal_field_with_attr.rast
@@ -9,40 +9,41 @@ SOURCE_FILE@0..46
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..45
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      RECORD_EXPR@16..43
-        PATH@16..17
-          PATH_SEGMENT@16..17
-            NAME_REF@16..17
-              IDENT@16..17 "S"
-        WHITESPACE@17..18 " "
-        RECORD_EXPR_FIELD_LIST@18..43
-          L_CURLY@18..19 "{"
-          WHITESPACE@19..20 " "
-          RECORD_EXPR_FIELD@20..41
-            ATTR@20..32
-              POUND@20..21 "#"
-              L_BRACK@21..22 "["
-              META@22..31
-                PATH@22..25
-                  PATH_SEGMENT@22..25
-                    NAME_REF@22..25
-                      IDENT@22..25 "cfg"
-                TOKEN_TREE@25..31
-                  L_PAREN@25..26 "("
-                  IDENT@26..30 "test"
-                  R_PAREN@30..31 ")"
-              R_BRACK@31..32 "]"
-            WHITESPACE@32..33 " "
-            NAME_REF@33..38
-              IDENT@33..38 "field"
-            COLON@38..39 ":"
-            WHITESPACE@39..40 " "
-            LITERAL@40..41
-              INT_NUMBER@40..41 "1"
-          WHITESPACE@41..42 " "
-          R_CURLY@42..43 "}"
-      WHITESPACE@43..44 "\n"
-      R_CURLY@44..45 "}"
+      STMT_LIST@10..45
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        RECORD_EXPR@16..43
+          PATH@16..17
+            PATH_SEGMENT@16..17
+              NAME_REF@16..17
+                IDENT@16..17 "S"
+          WHITESPACE@17..18 " "
+          RECORD_EXPR_FIELD_LIST@18..43
+            L_CURLY@18..19 "{"
+            WHITESPACE@19..20 " "
+            RECORD_EXPR_FIELD@20..41
+              ATTR@20..32
+                POUND@20..21 "#"
+                L_BRACK@21..22 "["
+                META@22..31
+                  PATH@22..25
+                    PATH_SEGMENT@22..25
+                      NAME_REF@22..25
+                        IDENT@22..25 "cfg"
+                  TOKEN_TREE@25..31
+                    L_PAREN@25..26 "("
+                    IDENT@26..30 "test"
+                    R_PAREN@30..31 ")"
+                R_BRACK@31..32 "]"
+              WHITESPACE@32..33 " "
+              NAME_REF@33..38
+                IDENT@33..38 "field"
+              COLON@38..39 ":"
+              WHITESPACE@39..40 " "
+              LITERAL@40..41
+                INT_NUMBER@40..41 "1"
+            WHITESPACE@41..42 " "
+            R_CURLY@42..43 "}"
+        WHITESPACE@43..44 "\n"
+        R_CURLY@44..45 "}"
   WHITESPACE@45..46 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0126_attr_on_expr_stmt.rast b/crates/syntax/test_data/parser/inline/ok/0126_attr_on_expr_stmt.rast
index 2a4a52eeb50..b69276ceeb4 100644
--- a/crates/syntax/test_data/parser/inline/ok/0126_attr_on_expr_stmt.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0126_attr_on_expr_stmt.rast
@@ -9,94 +9,96 @@ SOURCE_FILE@0..82
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..81
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..26
-        CALL_EXPR@15..25
-          ATTR@15..19
-            POUND@15..16 "#"
-            L_BRACK@16..17 "["
-            META@17..18
-              PATH@17..18
-                PATH_SEGMENT@17..18
-                  NAME_REF@17..18
-                    IDENT@17..18 "A"
-            R_BRACK@18..19 "]"
-          WHITESPACE@19..20 " "
-          PATH_EXPR@20..23
-            PATH@20..23
-              PATH_SEGMENT@20..23
-                NAME_REF@20..23
-                  IDENT@20..23 "foo"
-          ARG_LIST@23..25
-            L_PAREN@23..24 "("
-            R_PAREN@24..25 ")"
-        SEMICOLON@25..26 ";"
-      WHITESPACE@26..31 "\n    "
-      EXPR_STMT@31..42
-        MACRO_CALL@31..42
-          ATTR@31..35
-            POUND@31..32 "#"
-            L_BRACK@32..33 "["
-            META@33..34
-              PATH@33..34
-                PATH_SEGMENT@33..34
-                  NAME_REF@33..34
-                    IDENT@33..34 "B"
-            R_BRACK@34..35 "]"
-          WHITESPACE@35..36 " "
-          PATH@36..39
-            PATH_SEGMENT@36..39
-              NAME_REF@36..39
-                IDENT@36..39 "bar"
-          BANG@39..40 "!"
-          TOKEN_TREE@40..42
-            L_CURLY@40..41 "{"
-            R_CURLY@41..42 "}"
-      WHITESPACE@42..47 "\n    "
-      EXPR_STMT@47..59
-        BLOCK_EXPR@47..59
-          ATTR@47..51
-            POUND@47..48 "#"
-            L_BRACK@48..49 "["
-            META@49..50
-              PATH@49..50
-                PATH_SEGMENT@49..50
-                  NAME_REF@49..50
-                    IDENT@49..50 "C"
-            R_BRACK@50..51 "]"
-          WHITESPACE@51..52 " "
-          ATTR@52..56
-            POUND@52..53 "#"
-            L_BRACK@53..54 "["
-            META@54..55
-              PATH@54..55
-                PATH_SEGMENT@54..55
-                  NAME_REF@54..55
-                    IDENT@54..55 "D"
-            R_BRACK@55..56 "]"
-          WHITESPACE@56..57 " "
-          L_CURLY@57..58 "{"
-          R_CURLY@58..59 "}"
-      WHITESPACE@59..64 "\n    "
-      EXPR_STMT@64..79
-        RETURN_EXPR@64..78
-          ATTR@64..68
-            POUND@64..65 "#"
-            L_BRACK@65..66 "["
-            META@66..67
-              PATH@66..67
-                PATH_SEGMENT@66..67
-                  NAME_REF@66..67
-                    IDENT@66..67 "D"
-            R_BRACK@67..68 "]"
-          WHITESPACE@68..69 " "
-          RETURN_KW@69..75 "return"
-          WHITESPACE@75..76 " "
-          TUPLE_EXPR@76..78
-            L_PAREN@76..77 "("
-            R_PAREN@77..78 ")"
-        SEMICOLON@78..79 ";"
-      WHITESPACE@79..80 "\n"
-      R_CURLY@80..81 "}"
+      STMT_LIST@9..81
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..26
+          CALL_EXPR@15..25
+            ATTR@15..19
+              POUND@15..16 "#"
+              L_BRACK@16..17 "["
+              META@17..18
+                PATH@17..18
+                  PATH_SEGMENT@17..18
+                    NAME_REF@17..18
+                      IDENT@17..18 "A"
+              R_BRACK@18..19 "]"
+            WHITESPACE@19..20 " "
+            PATH_EXPR@20..23
+              PATH@20..23
+                PATH_SEGMENT@20..23
+                  NAME_REF@20..23
+                    IDENT@20..23 "foo"
+            ARG_LIST@23..25
+              L_PAREN@23..24 "("
+              R_PAREN@24..25 ")"
+          SEMICOLON@25..26 ";"
+        WHITESPACE@26..31 "\n    "
+        EXPR_STMT@31..42
+          MACRO_CALL@31..42
+            ATTR@31..35
+              POUND@31..32 "#"
+              L_BRACK@32..33 "["
+              META@33..34
+                PATH@33..34
+                  PATH_SEGMENT@33..34
+                    NAME_REF@33..34
+                      IDENT@33..34 "B"
+              R_BRACK@34..35 "]"
+            WHITESPACE@35..36 " "
+            PATH@36..39
+              PATH_SEGMENT@36..39
+                NAME_REF@36..39
+                  IDENT@36..39 "bar"
+            BANG@39..40 "!"
+            TOKEN_TREE@40..42
+              L_CURLY@40..41 "{"
+              R_CURLY@41..42 "}"
+        WHITESPACE@42..47 "\n    "
+        EXPR_STMT@47..59
+          BLOCK_EXPR@47..59
+            ATTR@47..51
+              POUND@47..48 "#"
+              L_BRACK@48..49 "["
+              META@49..50
+                PATH@49..50
+                  PATH_SEGMENT@49..50
+                    NAME_REF@49..50
+                      IDENT@49..50 "C"
+              R_BRACK@50..51 "]"
+            WHITESPACE@51..52 " "
+            ATTR@52..56
+              POUND@52..53 "#"
+              L_BRACK@53..54 "["
+              META@54..55
+                PATH@54..55
+                  PATH_SEGMENT@54..55
+                    NAME_REF@54..55
+                      IDENT@54..55 "D"
+              R_BRACK@55..56 "]"
+            WHITESPACE@56..57 " "
+            STMT_LIST@57..59
+              L_CURLY@57..58 "{"
+              R_CURLY@58..59 "}"
+        WHITESPACE@59..64 "\n    "
+        EXPR_STMT@64..79
+          RETURN_EXPR@64..78
+            ATTR@64..68
+              POUND@64..65 "#"
+              L_BRACK@65..66 "["
+              META@66..67
+                PATH@66..67
+                  PATH_SEGMENT@66..67
+                    NAME_REF@66..67
+                      IDENT@66..67 "D"
+              R_BRACK@67..68 "]"
+            WHITESPACE@68..69 " "
+            RETURN_KW@69..75 "return"
+            WHITESPACE@75..76 " "
+            TUPLE_EXPR@76..78
+              L_PAREN@76..77 "("
+              R_PAREN@77..78 ")"
+          SEMICOLON@78..79 ";"
+        WHITESPACE@79..80 "\n"
+        R_CURLY@80..81 "}"
   WHITESPACE@81..82 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0129_marco_pat.rast b/crates/syntax/test_data/parser/inline/ok/0129_marco_pat.rast
index e283966ca23..0e262735647 100644
--- a/crates/syntax/test_data/parser/inline/ok/0129_marco_pat.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0129_marco_pat.rast
@@ -9,28 +9,29 @@ SOURCE_FILE@0..33
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..32
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      LET_STMT@16..30
-        LET_KW@16..19 "let"
-        WHITESPACE@19..20 " "
-        MACRO_PAT@20..25
-          MACRO_CALL@20..25
-            PATH@20..21
-              PATH_SEGMENT@20..21
-                NAME_REF@20..21
-                  IDENT@20..21 "m"
-            BANG@21..22 "!"
-            TOKEN_TREE@22..25
-              L_PAREN@22..23 "("
-              IDENT@23..24 "x"
-              R_PAREN@24..25 ")"
-        WHITESPACE@25..26 " "
-        EQ@26..27 "="
-        WHITESPACE@27..28 " "
-        LITERAL@28..29
-          INT_NUMBER@28..29 "0"
-        SEMICOLON@29..30 ";"
-      WHITESPACE@30..31 "\n"
-      R_CURLY@31..32 "}"
+      STMT_LIST@10..32
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        LET_STMT@16..30
+          LET_KW@16..19 "let"
+          WHITESPACE@19..20 " "
+          MACRO_PAT@20..25
+            MACRO_CALL@20..25
+              PATH@20..21
+                PATH_SEGMENT@20..21
+                  NAME_REF@20..21
+                    IDENT@20..21 "m"
+              BANG@21..22 "!"
+              TOKEN_TREE@22..25
+                L_PAREN@22..23 "("
+                IDENT@23..24 "x"
+                R_PAREN@24..25 ")"
+          WHITESPACE@25..26 " "
+          EQ@26..27 "="
+          WHITESPACE@27..28 " "
+          LITERAL@28..29
+            INT_NUMBER@28..29 "0"
+          SEMICOLON@29..30 ";"
+        WHITESPACE@30..31 "\n"
+        R_CURLY@31..32 "}"
   WHITESPACE@32..33 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0130_let_stmt.rast b/crates/syntax/test_data/parser/inline/ok/0130_let_stmt.rast
index af3b11376b3..c3141e15455 100644
--- a/crates/syntax/test_data/parser/inline/ok/0130_let_stmt.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0130_let_stmt.rast
@@ -9,27 +9,28 @@ SOURCE_FILE@0..28
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..27
-      L_CURLY@7..8 "{"
-      WHITESPACE@8..9 " "
-      LET_STMT@9..25
-        LET_KW@9..12 "let"
-        WHITESPACE@12..13 " "
-        IDENT_PAT@13..14
-          NAME@13..14
-            IDENT@13..14 "x"
-        COLON@14..15 ":"
-        WHITESPACE@15..16 " "
-        PATH_TYPE@16..19
-          PATH@16..19
-            PATH_SEGMENT@16..19
-              NAME_REF@16..19
-                IDENT@16..19 "i32"
-        WHITESPACE@19..20 " "
-        EQ@20..21 "="
-        WHITESPACE@21..22 " "
-        LITERAL@22..24
-          INT_NUMBER@22..24 "92"
-        SEMICOLON@24..25 ";"
-      WHITESPACE@25..26 " "
-      R_CURLY@26..27 "}"
+      STMT_LIST@7..27
+        L_CURLY@7..8 "{"
+        WHITESPACE@8..9 " "
+        LET_STMT@9..25
+          LET_KW@9..12 "let"
+          WHITESPACE@12..13 " "
+          IDENT_PAT@13..14
+            NAME@13..14
+              IDENT@13..14 "x"
+          COLON@14..15 ":"
+          WHITESPACE@15..16 " "
+          PATH_TYPE@16..19
+            PATH@16..19
+              PATH_SEGMENT@16..19
+                NAME_REF@16..19
+                  IDENT@16..19 "i32"
+          WHITESPACE@19..20 " "
+          EQ@20..21 "="
+          WHITESPACE@21..22 " "
+          LITERAL@22..24
+            INT_NUMBER@22..24 "92"
+          SEMICOLON@24..25 ";"
+        WHITESPACE@25..26 " "
+        R_CURLY@26..27 "}"
   WHITESPACE@27..28 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0130_try_block_expr.rast b/crates/syntax/test_data/parser/inline/ok/0130_try_block_expr.rast
index ffdffe2f801..bd3652280b1 100644
--- a/crates/syntax/test_data/parser/inline/ok/0130_try_block_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0130_try_block_expr.rast
@@ -9,23 +9,24 @@ SOURCE_FILE@0..33
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..32
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      LET_STMT@15..30
-        LET_KW@15..18 "let"
-        WHITESPACE@18..19 " "
-        WILDCARD_PAT@19..20
-          UNDERSCORE@19..20 "_"
-        WHITESPACE@20..21 " "
-        EQ@21..22 "="
-        WHITESPACE@22..23 " "
-        EFFECT_EXPR@23..29
-          TRY_KW@23..26 "try"
-          WHITESPACE@26..27 " "
-          BLOCK_EXPR@27..29
-            L_CURLY@27..28 "{"
-            R_CURLY@28..29 "}"
-        SEMICOLON@29..30 ";"
-      WHITESPACE@30..31 "\n"
-      R_CURLY@31..32 "}"
+      STMT_LIST@9..32
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        LET_STMT@15..30
+          LET_KW@15..18 "let"
+          WHITESPACE@18..19 " "
+          WILDCARD_PAT@19..20
+            UNDERSCORE@19..20 "_"
+          WHITESPACE@20..21 " "
+          EQ@21..22 "="
+          WHITESPACE@22..23 " "
+          BLOCK_EXPR@23..29
+            TRY_KW@23..26 "try"
+            WHITESPACE@26..27 " "
+            STMT_LIST@27..29
+              L_CURLY@27..28 "{"
+              R_CURLY@28..29 "}"
+          SEMICOLON@29..30 ";"
+        WHITESPACE@30..31 "\n"
+        R_CURLY@31..32 "}"
   WHITESPACE@32..33 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0132_box_expr.rast b/crates/syntax/test_data/parser/inline/ok/0132_box_expr.rast
index c5503824729..29f97a3a77e 100644
--- a/crates/syntax/test_data/parser/inline/ok/0132_box_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0132_box_expr.rast
@@ -9,81 +9,82 @@ SOURCE_FILE@0..106
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..105
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      LET_STMT@15..32
-        LET_KW@15..18 "let"
-        WHITESPACE@18..19 " "
-        IDENT_PAT@19..20
-          NAME@19..20
-            IDENT@19..20 "x"
-        WHITESPACE@20..21 " "
-        EQ@21..22 "="
-        WHITESPACE@22..23 " "
-        BOX_EXPR@23..31
-          BOX_KW@23..26 "box"
-          WHITESPACE@26..27 " "
-          LITERAL@27..31
-            INT_NUMBER@27..31 "1i32"
-        SEMICOLON@31..32 ";"
-      WHITESPACE@32..37 "\n    "
-      LET_STMT@37..66
-        LET_KW@37..40 "let"
-        WHITESPACE@40..41 " "
-        IDENT_PAT@41..42
-          NAME@41..42
-            IDENT@41..42 "y"
-        WHITESPACE@42..43 " "
-        EQ@43..44 "="
-        WHITESPACE@44..45 " "
-        TUPLE_EXPR@45..65
-          L_PAREN@45..46 "("
-          BOX_EXPR@46..54
-            BOX_KW@46..49 "box"
-            WHITESPACE@49..50 " "
-            LITERAL@50..54
-              INT_NUMBER@50..54 "1i32"
-          COMMA@54..55 ","
-          WHITESPACE@55..56 " "
-          BOX_EXPR@56..64
-            BOX_KW@56..59 "box"
-            WHITESPACE@59..60 " "
-            LITERAL@60..64
-              INT_NUMBER@60..64 "2i32"
-          R_PAREN@64..65 ")"
-        SEMICOLON@65..66 ";"
-      WHITESPACE@66..71 "\n    "
-      LET_STMT@71..103
-        LET_KW@71..74 "let"
-        WHITESPACE@74..75 " "
-        IDENT_PAT@75..76
-          NAME@75..76
-            IDENT@75..76 "z"
-        WHITESPACE@76..77 " "
-        EQ@77..78 "="
-        WHITESPACE@78..79 " "
-        CALL_EXPR@79..102
-          PATH_EXPR@79..82
-            PATH@79..82
-              PATH_SEGMENT@79..82
-                NAME_REF@79..82
-                  IDENT@79..82 "Foo"
-          ARG_LIST@82..102
-            L_PAREN@82..83 "("
-            BOX_EXPR@83..91
-              BOX_KW@83..86 "box"
-              WHITESPACE@86..87 " "
-              LITERAL@87..91
-                INT_NUMBER@87..91 "1i32"
-            COMMA@91..92 ","
-            WHITESPACE@92..93 " "
-            BOX_EXPR@93..101
-              BOX_KW@93..96 "box"
-              WHITESPACE@96..97 " "
-              LITERAL@97..101
-                INT_NUMBER@97..101 "2i32"
-            R_PAREN@101..102 ")"
-        SEMICOLON@102..103 ";"
-      WHITESPACE@103..104 "\n"
-      R_CURLY@104..105 "}"
+      STMT_LIST@9..105
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        LET_STMT@15..32
+          LET_KW@15..18 "let"
+          WHITESPACE@18..19 " "
+          IDENT_PAT@19..20
+            NAME@19..20
+              IDENT@19..20 "x"
+          WHITESPACE@20..21 " "
+          EQ@21..22 "="
+          WHITESPACE@22..23 " "
+          BOX_EXPR@23..31
+            BOX_KW@23..26 "box"
+            WHITESPACE@26..27 " "
+            LITERAL@27..31
+              INT_NUMBER@27..31 "1i32"
+          SEMICOLON@31..32 ";"
+        WHITESPACE@32..37 "\n    "
+        LET_STMT@37..66
+          LET_KW@37..40 "let"
+          WHITESPACE@40..41 " "
+          IDENT_PAT@41..42
+            NAME@41..42
+              IDENT@41..42 "y"
+          WHITESPACE@42..43 " "
+          EQ@43..44 "="
+          WHITESPACE@44..45 " "
+          TUPLE_EXPR@45..65
+            L_PAREN@45..46 "("
+            BOX_EXPR@46..54
+              BOX_KW@46..49 "box"
+              WHITESPACE@49..50 " "
+              LITERAL@50..54
+                INT_NUMBER@50..54 "1i32"
+            COMMA@54..55 ","
+            WHITESPACE@55..56 " "
+            BOX_EXPR@56..64
+              BOX_KW@56..59 "box"
+              WHITESPACE@59..60 " "
+              LITERAL@60..64
+                INT_NUMBER@60..64 "2i32"
+            R_PAREN@64..65 ")"
+          SEMICOLON@65..66 ";"
+        WHITESPACE@66..71 "\n    "
+        LET_STMT@71..103
+          LET_KW@71..74 "let"
+          WHITESPACE@74..75 " "
+          IDENT_PAT@75..76
+            NAME@75..76
+              IDENT@75..76 "z"
+          WHITESPACE@76..77 " "
+          EQ@77..78 "="
+          WHITESPACE@78..79 " "
+          CALL_EXPR@79..102
+            PATH_EXPR@79..82
+              PATH@79..82
+                PATH_SEGMENT@79..82
+                  NAME_REF@79..82
+                    IDENT@79..82 "Foo"
+            ARG_LIST@82..102
+              L_PAREN@82..83 "("
+              BOX_EXPR@83..91
+                BOX_KW@83..86 "box"
+                WHITESPACE@86..87 " "
+                LITERAL@87..91
+                  INT_NUMBER@87..91 "1i32"
+              COMMA@91..92 ","
+              WHITESPACE@92..93 " "
+              BOX_EXPR@93..101
+                BOX_KW@93..96 "box"
+                WHITESPACE@96..97 " "
+                LITERAL@97..101
+                  INT_NUMBER@97..101 "2i32"
+              R_PAREN@101..102 ")"
+          SEMICOLON@102..103 ";"
+        WHITESPACE@103..104 "\n"
+        R_CURLY@104..105 "}"
   WHITESPACE@105..106 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0134_nocontentexpr_after_item.rast b/crates/syntax/test_data/parser/inline/ok/0134_nocontentexpr_after_item.rast
index 429a0506e1a..f0b45b4a163 100644
--- a/crates/syntax/test_data/parser/inline/ok/0134_nocontentexpr_after_item.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0134_nocontentexpr_after_item.rast
@@ -9,54 +9,56 @@ SOURCE_FILE@0..111
       R_PAREN@19..20 ")"
     WHITESPACE@20..21 " "
     BLOCK_EXPR@21..110
-      L_CURLY@21..22 "{"
-      WHITESPACE@22..27 "\n    "
-      ENUM@27..75
-        ENUM_KW@27..31 "enum"
-        WHITESPACE@31..32 " "
-        NAME@32..41
-          IDENT@32..41 "LocalEnum"
-        WHITESPACE@41..42 " "
-        VARIANT_LIST@42..75
-          L_CURLY@42..43 "{"
-          WHITESPACE@43..52 "\n        "
-          VARIANT@52..55
-            NAME@52..55
-              IDENT@52..55 "One"
-          COMMA@55..56 ","
-          WHITESPACE@56..65 "\n        "
-          VARIANT@65..68
-            NAME@65..68
-              IDENT@65..68 "Two"
-          COMMA@68..69 ","
-          WHITESPACE@69..74 "\n    "
-          R_CURLY@74..75 "}"
-      SEMICOLON@75..76 ";"
-      WHITESPACE@76..81 "\n    "
-      FN@81..90
-        FN_KW@81..83 "fn"
-        WHITESPACE@83..84 " "
-        NAME@84..85
-          IDENT@84..85 "f"
-        PARAM_LIST@85..87
-          L_PAREN@85..86 "("
-          R_PAREN@86..87 ")"
-        WHITESPACE@87..88 " "
-        BLOCK_EXPR@88..90
-          L_CURLY@88..89 "{"
-          R_CURLY@89..90 "}"
-      SEMICOLON@90..91 ";"
-      WHITESPACE@91..96 "\n    "
-      STRUCT@96..107
-        STRUCT_KW@96..102 "struct"
-        WHITESPACE@102..103 " "
-        NAME@103..104
-          IDENT@103..104 "S"
-        WHITESPACE@104..105 " "
-        RECORD_FIELD_LIST@105..107
-          L_CURLY@105..106 "{"
-          R_CURLY@106..107 "}"
-      SEMICOLON@107..108 ";"
-      WHITESPACE@108..109 "\n"
-      R_CURLY@109..110 "}"
+      STMT_LIST@21..110
+        L_CURLY@21..22 "{"
+        WHITESPACE@22..27 "\n    "
+        ENUM@27..75
+          ENUM_KW@27..31 "enum"
+          WHITESPACE@31..32 " "
+          NAME@32..41
+            IDENT@32..41 "LocalEnum"
+          WHITESPACE@41..42 " "
+          VARIANT_LIST@42..75
+            L_CURLY@42..43 "{"
+            WHITESPACE@43..52 "\n        "
+            VARIANT@52..55
+              NAME@52..55
+                IDENT@52..55 "One"
+            COMMA@55..56 ","
+            WHITESPACE@56..65 "\n        "
+            VARIANT@65..68
+              NAME@65..68
+                IDENT@65..68 "Two"
+            COMMA@68..69 ","
+            WHITESPACE@69..74 "\n    "
+            R_CURLY@74..75 "}"
+        SEMICOLON@75..76 ";"
+        WHITESPACE@76..81 "\n    "
+        FN@81..90
+          FN_KW@81..83 "fn"
+          WHITESPACE@83..84 " "
+          NAME@84..85
+            IDENT@84..85 "f"
+          PARAM_LIST@85..87
+            L_PAREN@85..86 "("
+            R_PAREN@86..87 ")"
+          WHITESPACE@87..88 " "
+          BLOCK_EXPR@88..90
+            STMT_LIST@88..90
+              L_CURLY@88..89 "{"
+              R_CURLY@89..90 "}"
+        SEMICOLON@90..91 ";"
+        WHITESPACE@91..96 "\n    "
+        STRUCT@96..107
+          STRUCT_KW@96..102 "struct"
+          WHITESPACE@102..103 " "
+          NAME@103..104
+            IDENT@103..104 "S"
+          WHITESPACE@104..105 " "
+          RECORD_FIELD_LIST@105..107
+            L_CURLY@105..106 "{"
+            R_CURLY@106..107 "}"
+        SEMICOLON@107..108 ";"
+        WHITESPACE@108..109 "\n"
+        R_CURLY@109..110 "}"
   WHITESPACE@110..111 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0137_await_expr.rast b/crates/syntax/test_data/parser/inline/ok/0137_await_expr.rast
index 923effe3831..cacd3fa816f 100644
--- a/crates/syntax/test_data/parser/inline/ok/0137_await_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0137_await_expr.rast
@@ -9,61 +9,62 @@ SOURCE_FILE@0..67
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..66
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..23
-        AWAIT_EXPR@15..22
-          PATH_EXPR@15..16
-            PATH@15..16
-              PATH_SEGMENT@15..16
-                NAME_REF@15..16
-                  IDENT@15..16 "x"
-          DOT@16..17 "."
-          AWAIT_KW@17..22 "await"
-        SEMICOLON@22..23 ";"
-      WHITESPACE@23..28 "\n    "
-      EXPR_STMT@28..38
-        AWAIT_EXPR@28..37
-          FIELD_EXPR@28..31
-            PATH_EXPR@28..29
-              PATH@28..29
-                PATH_SEGMENT@28..29
-                  NAME_REF@28..29
-                    IDENT@28..29 "x"
-            DOT@29..30 "."
-            NAME_REF@30..31
-              INT_NUMBER@30..31 "0"
-          DOT@31..32 "."
-          AWAIT_KW@32..37 "await"
-        SEMICOLON@37..38 ";"
-      WHITESPACE@38..43 "\n    "
-      EXPR_STMT@43..64
-        METHOD_CALL_EXPR@43..63
-          TRY_EXPR@43..55
-            AWAIT_EXPR@43..54
-              CALL_EXPR@43..48
-                FIELD_EXPR@43..46
-                  PATH_EXPR@43..44
-                    PATH@43..44
-                      PATH_SEGMENT@43..44
-                        NAME_REF@43..44
-                          IDENT@43..44 "x"
-                  DOT@44..45 "."
-                  NAME_REF@45..46
-                    INT_NUMBER@45..46 "0"
-                ARG_LIST@46..48
-                  L_PAREN@46..47 "("
-                  R_PAREN@47..48 ")"
-              DOT@48..49 "."
-              AWAIT_KW@49..54 "await"
-            QUESTION@54..55 "?"
-          DOT@55..56 "."
-          NAME_REF@56..61
-            IDENT@56..61 "hello"
-          ARG_LIST@61..63
-            L_PAREN@61..62 "("
-            R_PAREN@62..63 ")"
-        SEMICOLON@63..64 ";"
-      WHITESPACE@64..65 "\n"
-      R_CURLY@65..66 "}"
+      STMT_LIST@9..66
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..23
+          AWAIT_EXPR@15..22
+            PATH_EXPR@15..16
+              PATH@15..16
+                PATH_SEGMENT@15..16
+                  NAME_REF@15..16
+                    IDENT@15..16 "x"
+            DOT@16..17 "."
+            AWAIT_KW@17..22 "await"
+          SEMICOLON@22..23 ";"
+        WHITESPACE@23..28 "\n    "
+        EXPR_STMT@28..38
+          AWAIT_EXPR@28..37
+            FIELD_EXPR@28..31
+              PATH_EXPR@28..29
+                PATH@28..29
+                  PATH_SEGMENT@28..29
+                    NAME_REF@28..29
+                      IDENT@28..29 "x"
+              DOT@29..30 "."
+              NAME_REF@30..31
+                INT_NUMBER@30..31 "0"
+            DOT@31..32 "."
+            AWAIT_KW@32..37 "await"
+          SEMICOLON@37..38 ";"
+        WHITESPACE@38..43 "\n    "
+        EXPR_STMT@43..64
+          METHOD_CALL_EXPR@43..63
+            TRY_EXPR@43..55
+              AWAIT_EXPR@43..54
+                CALL_EXPR@43..48
+                  FIELD_EXPR@43..46
+                    PATH_EXPR@43..44
+                      PATH@43..44
+                        PATH_SEGMENT@43..44
+                          NAME_REF@43..44
+                            IDENT@43..44 "x"
+                    DOT@44..45 "."
+                    NAME_REF@45..46
+                      INT_NUMBER@45..46 "0"
+                  ARG_LIST@46..48
+                    L_PAREN@46..47 "("
+                    R_PAREN@47..48 ")"
+                DOT@48..49 "."
+                AWAIT_KW@49..54 "await"
+              QUESTION@54..55 "?"
+            DOT@55..56 "."
+            NAME_REF@56..61
+              IDENT@56..61 "hello"
+            ARG_LIST@61..63
+              L_PAREN@61..62 "("
+              R_PAREN@62..63 ")"
+          SEMICOLON@63..64 ";"
+        WHITESPACE@64..65 "\n"
+        R_CURLY@65..66 "}"
   WHITESPACE@66..67 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0138_associated_type_bounds.rast b/crates/syntax/test_data/parser/inline/ok/0138_associated_type_bounds.rast
index a34aff3cbed..c3f03c49b73 100644
--- a/crates/syntax/test_data/parser/inline/ok/0138_associated_type_bounds.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0138_associated_type_bounds.rast
@@ -105,6 +105,7 @@ SOURCE_FILE@0..108
       R_PAREN@103..104 ")"
     WHITESPACE@104..105 " "
     BLOCK_EXPR@105..107
-      L_CURLY@105..106 "{"
-      R_CURLY@106..107 "}"
+      STMT_LIST@105..107
+        L_CURLY@105..106 "{"
+        R_CURLY@106..107 "}"
   WHITESPACE@107..108 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0138_expression_after_block.rast b/crates/syntax/test_data/parser/inline/ok/0138_expression_after_block.rast
index f7c0e0ab0b7..134438715a7 100644
--- a/crates/syntax/test_data/parser/inline/ok/0138_expression_after_block.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0138_expression_after_block.rast
@@ -9,56 +9,58 @@ SOURCE_FILE@0..52
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..51
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..14 "\n   "
-      LET_STMT@14..34
-        LET_KW@14..17 "let"
-        WHITESPACE@17..18 " "
-        IDENT_PAT@18..23
-          MUT_KW@18..21 "mut"
-          WHITESPACE@21..22 " "
-          NAME@22..23
-            IDENT@22..23 "p"
-        WHITESPACE@23..24 " "
-        EQ@24..25 "="
-        WHITESPACE@25..26 " "
-        RECORD_EXPR@26..33
-          PATH@26..27
-            PATH_SEGMENT@26..27
-              NAME_REF@26..27
-                IDENT@26..27 "F"
-          RECORD_EXPR_FIELD_LIST@27..33
-            L_CURLY@27..28 "{"
-            RECORD_EXPR_FIELD@28..32
-              NAME_REF@28..29
-                IDENT@28..29 "x"
-              COLON@29..30 ":"
-              WHITESPACE@30..31 " "
-              LITERAL@31..32
-                INT_NUMBER@31..32 "5"
-            R_CURLY@32..33 "}"
-        SEMICOLON@33..34 ";"
-      WHITESPACE@34..38 "\n   "
-      EXPR_STMT@38..49
-        BIN_EXPR@38..48
-          FIELD_EXPR@38..43
-            BLOCK_EXPR@38..41
-              L_CURLY@38..39 "{"
-              PATH_EXPR@39..40
-                PATH@39..40
-                  PATH_SEGMENT@39..40
-                    NAME_REF@39..40
-                      IDENT@39..40 "p"
-              R_CURLY@40..41 "}"
-            DOT@41..42 "."
-            NAME_REF@42..43
-              IDENT@42..43 "x"
-          WHITESPACE@43..44 " "
-          EQ@44..45 "="
-          WHITESPACE@45..46 " "
-          LITERAL@46..48
-            INT_NUMBER@46..48 "10"
-        SEMICOLON@48..49 ";"
-      WHITESPACE@49..50 "\n"
-      R_CURLY@50..51 "}"
+      STMT_LIST@9..51
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..14 "\n   "
+        LET_STMT@14..34
+          LET_KW@14..17 "let"
+          WHITESPACE@17..18 " "
+          IDENT_PAT@18..23
+            MUT_KW@18..21 "mut"
+            WHITESPACE@21..22 " "
+            NAME@22..23
+              IDENT@22..23 "p"
+          WHITESPACE@23..24 " "
+          EQ@24..25 "="
+          WHITESPACE@25..26 " "
+          RECORD_EXPR@26..33
+            PATH@26..27
+              PATH_SEGMENT@26..27
+                NAME_REF@26..27
+                  IDENT@26..27 "F"
+            RECORD_EXPR_FIELD_LIST@27..33
+              L_CURLY@27..28 "{"
+              RECORD_EXPR_FIELD@28..32
+                NAME_REF@28..29
+                  IDENT@28..29 "x"
+                COLON@29..30 ":"
+                WHITESPACE@30..31 " "
+                LITERAL@31..32
+                  INT_NUMBER@31..32 "5"
+              R_CURLY@32..33 "}"
+          SEMICOLON@33..34 ";"
+        WHITESPACE@34..38 "\n   "
+        EXPR_STMT@38..49
+          BIN_EXPR@38..48
+            FIELD_EXPR@38..43
+              BLOCK_EXPR@38..41
+                STMT_LIST@38..41
+                  L_CURLY@38..39 "{"
+                  PATH_EXPR@39..40
+                    PATH@39..40
+                      PATH_SEGMENT@39..40
+                        NAME_REF@39..40
+                          IDENT@39..40 "p"
+                  R_CURLY@40..41 "}"
+              DOT@41..42 "."
+              NAME_REF@42..43
+                IDENT@42..43 "x"
+            WHITESPACE@43..44 " "
+            EQ@44..45 "="
+            WHITESPACE@45..46 " "
+            LITERAL@46..48
+              INT_NUMBER@46..48 "10"
+          SEMICOLON@48..49 ";"
+        WHITESPACE@49..50 "\n"
+        R_CURLY@50..51 "}"
   WHITESPACE@51..52 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0138_self_param_outer_attr.rast b/crates/syntax/test_data/parser/inline/ok/0138_self_param_outer_attr.rast
index 891eace5995..6a80b72e45b 100644
--- a/crates/syntax/test_data/parser/inline/ok/0138_self_param_outer_attr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0138_self_param_outer_attr.rast
@@ -22,6 +22,7 @@ SOURCE_FILE@0..26
       R_PAREN@21..22 ")"
     WHITESPACE@22..23 " "
     BLOCK_EXPR@23..25
-      L_CURLY@23..24 "{"
-      R_CURLY@24..25 "}"
+      STMT_LIST@23..25
+        L_CURLY@23..24 "{"
+        R_CURLY@24..25 "}"
   WHITESPACE@25..26 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0139_param_outer_arg.rast b/crates/syntax/test_data/parser/inline/ok/0139_param_outer_arg.rast
index a363e592b7a..7cdd38917de 100644
--- a/crates/syntax/test_data/parser/inline/ok/0139_param_outer_arg.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0139_param_outer_arg.rast
@@ -30,6 +30,7 @@ SOURCE_FILE@0..28
       R_PAREN@23..24 ")"
     WHITESPACE@24..25 " "
     BLOCK_EXPR@25..27
-      L_CURLY@25..26 "{"
-      R_CURLY@26..27 "}"
+      STMT_LIST@25..27
+        L_CURLY@25..26 "{"
+        R_CURLY@26..27 "}"
   WHITESPACE@27..28 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0142_for_range_from.rast b/crates/syntax/test_data/parser/inline/ok/0142_for_range_from.rast
index 36e448c94ee..4f859c30e5c 100644
--- a/crates/syntax/test_data/parser/inline/ok/0142_for_range_from.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0142_for_range_from.rast
@@ -9,32 +9,34 @@ SOURCE_FILE@0..51
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..50
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..14 "\n   "
-      FOR_EXPR@14..48
-        FOR_KW@14..17 "for"
-        WHITESPACE@17..18 " "
-        IDENT_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 " "
-          DOT2@25..27 ".."
-        WHITESPACE@27..28 " "
-        BLOCK_EXPR@28..48
-          L_CURLY@28..29 "{"
-          WHITESPACE@29..37 "\n       "
-          EXPR_STMT@37..43
-            BREAK_EXPR@37..42
-              BREAK_KW@37..42 "break"
-            SEMICOLON@42..43 ";"
-          WHITESPACE@43..47 "\n   "
-          R_CURLY@47..48 "}"
-      WHITESPACE@48..49 "\n"
-      R_CURLY@49..50 "}"
+      STMT_LIST@9..50
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..14 "\n   "
+        FOR_EXPR@14..48
+          FOR_KW@14..17 "for"
+          WHITESPACE@17..18 " "
+          IDENT_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 " "
+            DOT2@25..27 ".."
+          WHITESPACE@27..28 " "
+          BLOCK_EXPR@28..48
+            STMT_LIST@28..48
+              L_CURLY@28..29 "{"
+              WHITESPACE@29..37 "\n       "
+              EXPR_STMT@37..43
+                BREAK_EXPR@37..42
+                  BREAK_KW@37..42 "break"
+                SEMICOLON@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/syntax/test_data/parser/inline/ok/0143_box_pat.rast b/crates/syntax/test_data/parser/inline/ok/0143_box_pat.rast
index 65887b96216..a5f990cff96 100644
--- a/crates/syntax/test_data/parser/inline/ok/0143_box_pat.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0143_box_pat.rast
@@ -9,102 +9,103 @@ SOURCE_FILE@0..118
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..117
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      LET_STMT@16..31
-        LET_KW@16..19 "let"
-        WHITESPACE@19..20 " "
-        BOX_PAT@20..25
-          BOX_KW@20..23 "box"
-          WHITESPACE@23..24 " "
-          IDENT_PAT@24..25
-            NAME@24..25
-              IDENT@24..25 "i"
-        WHITESPACE@25..26 " "
-        EQ@26..27 "="
-        WHITESPACE@27..28 " "
-        TUPLE_EXPR@28..30
-          L_PAREN@28..29 "("
-          R_PAREN@29..30 ")"
-        SEMICOLON@30..31 ";"
-      WHITESPACE@31..36 "\n    "
-      LET_STMT@36..87
-        LET_KW@36..39 "let"
-        WHITESPACE@39..40 " "
-        BOX_PAT@40..81
-          BOX_KW@40..43 "box"
-          WHITESPACE@43..44 " "
-          RECORD_PAT@44..81
-            PATH@44..49
-              PATH_SEGMENT@44..49
-                NAME_REF@44..49
-                  IDENT@44..49 "Outer"
-            WHITESPACE@49..50 " "
-            RECORD_PAT_FIELD_LIST@50..81
-              L_CURLY@50..51 "{"
-              WHITESPACE@51..52 " "
-              RECORD_PAT_FIELD@52..57
-                BOX_PAT@52..57
-                  BOX_KW@52..55 "box"
-                  WHITESPACE@55..56 " "
-                  IDENT_PAT@56..57
-                    NAME@56..57
-                      IDENT@56..57 "i"
-              COMMA@57..58 ","
-              WHITESPACE@58..59 " "
-              RECORD_PAT_FIELD@59..79
-                NAME_REF@59..60
-                  IDENT@59..60 "j"
-                COLON@60..61 ":"
-                WHITESPACE@61..62 " "
-                BOX_PAT@62..79
-                  BOX_KW@62..65 "box"
-                  WHITESPACE@65..66 " "
-                  TUPLE_STRUCT_PAT@66..79
-                    PATH@66..71
-                      PATH_SEGMENT@66..71
-                        NAME_REF@66..71
-                          IDENT@66..71 "Inner"
-                    L_PAREN@71..72 "("
-                    BOX_PAT@72..78
-                      BOX_KW@72..75 "box"
-                      WHITESPACE@75..76 " "
-                      REF_PAT@76..78
-                        AMP@76..77 "&"
-                        IDENT_PAT@77..78
-                          NAME@77..78
-                            IDENT@77..78 "x"
-                    R_PAREN@78..79 ")"
-              WHITESPACE@79..80 " "
-              R_CURLY@80..81 "}"
-        WHITESPACE@81..82 " "
-        EQ@82..83 "="
-        WHITESPACE@83..84 " "
-        TUPLE_EXPR@84..86
-          L_PAREN@84..85 "("
-          R_PAREN@85..86 ")"
-        SEMICOLON@86..87 ";"
-      WHITESPACE@87..92 "\n    "
-      LET_STMT@92..115
-        LET_KW@92..95 "let"
-        WHITESPACE@95..96 " "
-        BOX_PAT@96..109
-          BOX_KW@96..99 "box"
-          WHITESPACE@99..100 " "
-          IDENT_PAT@100..109
-            REF_KW@100..103 "ref"
-            WHITESPACE@103..104 " "
-            MUT_KW@104..107 "mut"
-            WHITESPACE@107..108 " "
-            NAME@108..109
-              IDENT@108..109 "i"
-        WHITESPACE@109..110 " "
-        EQ@110..111 "="
-        WHITESPACE@111..112 " "
-        TUPLE_EXPR@112..114
-          L_PAREN@112..113 "("
-          R_PAREN@113..114 ")"
-        SEMICOLON@114..115 ";"
-      WHITESPACE@115..116 "\n"
-      R_CURLY@116..117 "}"
+      STMT_LIST@10..117
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        LET_STMT@16..31
+          LET_KW@16..19 "let"
+          WHITESPACE@19..20 " "
+          BOX_PAT@20..25
+            BOX_KW@20..23 "box"
+            WHITESPACE@23..24 " "
+            IDENT_PAT@24..25
+              NAME@24..25
+                IDENT@24..25 "i"
+          WHITESPACE@25..26 " "
+          EQ@26..27 "="
+          WHITESPACE@27..28 " "
+          TUPLE_EXPR@28..30
+            L_PAREN@28..29 "("
+            R_PAREN@29..30 ")"
+          SEMICOLON@30..31 ";"
+        WHITESPACE@31..36 "\n    "
+        LET_STMT@36..87
+          LET_KW@36..39 "let"
+          WHITESPACE@39..40 " "
+          BOX_PAT@40..81
+            BOX_KW@40..43 "box"
+            WHITESPACE@43..44 " "
+            RECORD_PAT@44..81
+              PATH@44..49
+                PATH_SEGMENT@44..49
+                  NAME_REF@44..49
+                    IDENT@44..49 "Outer"
+              WHITESPACE@49..50 " "
+              RECORD_PAT_FIELD_LIST@50..81
+                L_CURLY@50..51 "{"
+                WHITESPACE@51..52 " "
+                RECORD_PAT_FIELD@52..57
+                  BOX_PAT@52..57
+                    BOX_KW@52..55 "box"
+                    WHITESPACE@55..56 " "
+                    IDENT_PAT@56..57
+                      NAME@56..57
+                        IDENT@56..57 "i"
+                COMMA@57..58 ","
+                WHITESPACE@58..59 " "
+                RECORD_PAT_FIELD@59..79
+                  NAME_REF@59..60
+                    IDENT@59..60 "j"
+                  COLON@60..61 ":"
+                  WHITESPACE@61..62 " "
+                  BOX_PAT@62..79
+                    BOX_KW@62..65 "box"
+                    WHITESPACE@65..66 " "
+                    TUPLE_STRUCT_PAT@66..79
+                      PATH@66..71
+                        PATH_SEGMENT@66..71
+                          NAME_REF@66..71
+                            IDENT@66..71 "Inner"
+                      L_PAREN@71..72 "("
+                      BOX_PAT@72..78
+                        BOX_KW@72..75 "box"
+                        WHITESPACE@75..76 " "
+                        REF_PAT@76..78
+                          AMP@76..77 "&"
+                          IDENT_PAT@77..78
+                            NAME@77..78
+                              IDENT@77..78 "x"
+                      R_PAREN@78..79 ")"
+                WHITESPACE@79..80 " "
+                R_CURLY@80..81 "}"
+          WHITESPACE@81..82 " "
+          EQ@82..83 "="
+          WHITESPACE@83..84 " "
+          TUPLE_EXPR@84..86
+            L_PAREN@84..85 "("
+            R_PAREN@85..86 ")"
+          SEMICOLON@86..87 ";"
+        WHITESPACE@87..92 "\n    "
+        LET_STMT@92..115
+          LET_KW@92..95 "let"
+          WHITESPACE@95..96 " "
+          BOX_PAT@96..109
+            BOX_KW@96..99 "box"
+            WHITESPACE@99..100 " "
+            IDENT_PAT@100..109
+              REF_KW@100..103 "ref"
+              WHITESPACE@103..104 " "
+              MUT_KW@104..107 "mut"
+              WHITESPACE@107..108 " "
+              NAME@108..109
+                IDENT@108..109 "i"
+          WHITESPACE@109..110 " "
+          EQ@110..111 "="
+          WHITESPACE@111..112 " "
+          TUPLE_EXPR@112..114
+            L_PAREN@112..113 "("
+            R_PAREN@113..114 ")"
+          SEMICOLON@114..115 ";"
+        WHITESPACE@115..116 "\n"
+        R_CURLY@116..117 "}"
   WHITESPACE@117..118 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0144_dot_dot_pat.rast b/crates/syntax/test_data/parser/inline/ok/0144_dot_dot_pat.rast
index 8a5bde0b6af..6a423ff14cc 100644
--- a/crates/syntax/test_data/parser/inline/ok/0144_dot_dot_pat.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0144_dot_dot_pat.rast
@@ -9,447 +9,448 @@ SOURCE_FILE@0..555
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..554
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      LET_STMT@16..28
-        LET_KW@16..19 "let"
-        WHITESPACE@19..20 " "
-        REST_PAT@20..22
-          DOT2@20..22 ".."
-        WHITESPACE@22..23 " "
-        EQ@23..24 "="
-        WHITESPACE@24..25 " "
-        TUPLE_EXPR@25..27
-          L_PAREN@25..26 "("
-          R_PAREN@26..27 ")"
-        SEMICOLON@27..28 ";"
-      WHITESPACE@28..33 "\n    "
-      COMMENT@33..35 "//"
-      WHITESPACE@35..40 "\n    "
-      COMMENT@40..49 "// Tuples"
-      WHITESPACE@49..54 "\n    "
-      COMMENT@54..56 "//"
-      WHITESPACE@56..61 "\n    "
-      LET_STMT@61..78
-        LET_KW@61..64 "let"
-        WHITESPACE@64..65 " "
-        TUPLE_PAT@65..72
-          L_PAREN@65..66 "("
-          IDENT_PAT@66..67
-            NAME@66..67
-              IDENT@66..67 "a"
-          COMMA@67..68 ","
-          WHITESPACE@68..69 " "
-          REST_PAT@69..71
-            DOT2@69..71 ".."
-          R_PAREN@71..72 ")"
-        WHITESPACE@72..73 " "
-        EQ@73..74 "="
-        WHITESPACE@74..75 " "
-        TUPLE_EXPR@75..77
-          L_PAREN@75..76 "("
-          R_PAREN@76..77 ")"
-        SEMICOLON@77..78 ";"
-      WHITESPACE@78..83 "\n    "
-      LET_STMT@83..101
-        LET_KW@83..86 "let"
-        WHITESPACE@86..87 " "
-        TUPLE_PAT@87..95
-          L_PAREN@87..88 "("
-          IDENT_PAT@88..89
-            NAME@88..89
-              IDENT@88..89 "a"
-          COMMA@89..90 ","
-          WHITESPACE@90..91 " "
-          REST_PAT@91..93
-            DOT2@91..93 ".."
-          COMMA@93..94 ","
-          R_PAREN@94..95 ")"
-        WHITESPACE@95..96 " "
-        EQ@96..97 "="
-        WHITESPACE@97..98 " "
-        TUPLE_EXPR@98..100
-          L_PAREN@98..99 "("
-          R_PAREN@99..100 ")"
-        SEMICOLON@100..101 ";"
-      WHITESPACE@101..106 "\n    "
-      LET_STMT@106..128
-        LET_KW@106..109 "let"
-        WHITESPACE@109..110 " "
-        TUPLE_STRUCT_PAT@110..122
-          PATH@110..115
-            PATH_SEGMENT@110..115
-              NAME_REF@110..115
-                IDENT@110..115 "Tuple"
-          L_PAREN@115..116 "("
-          IDENT_PAT@116..117
-            NAME@116..117
-              IDENT@116..117 "a"
-          COMMA@117..118 ","
-          WHITESPACE@118..119 " "
-          REST_PAT@119..121
-            DOT2@119..121 ".."
-          R_PAREN@121..122 ")"
-        WHITESPACE@122..123 " "
-        EQ@123..124 "="
-        WHITESPACE@124..125 " "
-        TUPLE_EXPR@125..127
-          L_PAREN@125..126 "("
-          R_PAREN@126..127 ")"
-        SEMICOLON@127..128 ";"
-      WHITESPACE@128..133 "\n    "
-      LET_STMT@133..156
-        LET_KW@133..136 "let"
-        WHITESPACE@136..137 " "
-        TUPLE_STRUCT_PAT@137..150
-          PATH@137..142
-            PATH_SEGMENT@137..142
-              NAME_REF@137..142
-                IDENT@137..142 "Tuple"
-          L_PAREN@142..143 "("
-          IDENT_PAT@143..144
-            NAME@143..144
-              IDENT@143..144 "a"
-          COMMA@144..145 ","
-          WHITESPACE@145..146 " "
-          REST_PAT@146..148
-            DOT2@146..148 ".."
-          COMMA@148..149 ","
-          R_PAREN@149..150 ")"
-        WHITESPACE@150..151 " "
-        EQ@151..152 "="
-        WHITESPACE@152..153 " "
-        TUPLE_EXPR@153..155
-          L_PAREN@153..154 "("
-          R_PAREN@154..155 ")"
-        SEMICOLON@155..156 ";"
-      WHITESPACE@156..161 "\n    "
-      LET_STMT@161..179
-        LET_KW@161..164 "let"
-        WHITESPACE@164..165 " "
-        TUPLE_PAT@165..173
-          L_PAREN@165..166 "("
-          REST_PAT@166..168
-            DOT2@166..168 ".."
-          COMMA@168..169 ","
-          WHITESPACE@169..170 " "
-          REST_PAT@170..172
-            DOT2@170..172 ".."
-          R_PAREN@172..173 ")"
-        WHITESPACE@173..174 " "
-        EQ@174..175 "="
-        WHITESPACE@175..176 " "
-        TUPLE_EXPR@176..178
-          L_PAREN@176..177 "("
-          R_PAREN@177..178 ")"
-        SEMICOLON@178..179 ";"
-      WHITESPACE@179..184 "\n    "
-      LET_STMT@184..207
-        LET_KW@184..187 "let"
-        WHITESPACE@187..188 " "
-        TUPLE_STRUCT_PAT@188..201
-          PATH@188..193
-            PATH_SEGMENT@188..193
-              NAME_REF@188..193
-                IDENT@188..193 "Tuple"
-          L_PAREN@193..194 "("
-          REST_PAT@194..196
-            DOT2@194..196 ".."
-          COMMA@196..197 ","
-          WHITESPACE@197..198 " "
-          REST_PAT@198..200
-            DOT2@198..200 ".."
-          R_PAREN@200..201 ")"
-        WHITESPACE@201..202 " "
-        EQ@202..203 "="
-        WHITESPACE@203..204 " "
-        TUPLE_EXPR@204..206
-          L_PAREN@204..205 "("
-          R_PAREN@205..206 ")"
-        SEMICOLON@206..207 ";"
-      WHITESPACE@207..212 "\n    "
-      LET_STMT@212..233
-        LET_KW@212..215 "let"
-        WHITESPACE@215..216 " "
-        TUPLE_PAT@216..227
-          L_PAREN@216..217 "("
-          REST_PAT@217..219
-            DOT2@217..219 ".."
-          COMMA@219..220 ","
-          WHITESPACE@220..221 " "
-          IDENT_PAT@221..222
-            NAME@221..222
-              IDENT@221..222 "a"
-          COMMA@222..223 ","
-          WHITESPACE@223..224 " "
-          REST_PAT@224..226
-            DOT2@224..226 ".."
-          R_PAREN@226..227 ")"
-        WHITESPACE@227..228 " "
-        EQ@228..229 "="
-        WHITESPACE@229..230 " "
-        TUPLE_EXPR@230..232
-          L_PAREN@230..231 "("
-          R_PAREN@231..232 ")"
-        SEMICOLON@232..233 ";"
-      WHITESPACE@233..238 "\n    "
-      LET_STMT@238..264
-        LET_KW@238..241 "let"
-        WHITESPACE@241..242 " "
-        TUPLE_STRUCT_PAT@242..258
-          PATH@242..247
-            PATH_SEGMENT@242..247
-              NAME_REF@242..247
-                IDENT@242..247 "Tuple"
-          L_PAREN@247..248 "("
-          REST_PAT@248..250
-            DOT2@248..250 ".."
-          COMMA@250..251 ","
-          WHITESPACE@251..252 " "
-          IDENT_PAT@252..253
-            NAME@252..253
-              IDENT@252..253 "a"
-          COMMA@253..254 ","
-          WHITESPACE@254..255 " "
-          REST_PAT@255..257
-            DOT2@255..257 ".."
-          R_PAREN@257..258 ")"
-        WHITESPACE@258..259 " "
-        EQ@259..260 "="
-        WHITESPACE@260..261 " "
-        TUPLE_EXPR@261..263
-          L_PAREN@261..262 "("
-          R_PAREN@262..263 ")"
-        SEMICOLON@263..264 ";"
-      WHITESPACE@264..269 "\n    "
-      COMMENT@269..271 "//"
-      WHITESPACE@271..276 "\n    "
-      COMMENT@276..285 "// Slices"
-      WHITESPACE@285..290 "\n    "
-      COMMENT@290..292 "//"
-      WHITESPACE@292..297 "\n    "
-      LET_STMT@297..311
-        LET_KW@297..300 "let"
-        WHITESPACE@300..301 " "
-        SLICE_PAT@301..305
-          L_BRACK@301..302 "["
-          REST_PAT@302..304
-            DOT2@302..304 ".."
-          R_BRACK@304..305 "]"
-        WHITESPACE@305..306 " "
-        EQ@306..307 "="
-        WHITESPACE@307..308 " "
-        TUPLE_EXPR@308..310
-          L_PAREN@308..309 "("
-          R_PAREN@309..310 ")"
-        SEMICOLON@310..311 ";"
-      WHITESPACE@311..316 "\n    "
-      LET_STMT@316..336
-        LET_KW@316..319 "let"
-        WHITESPACE@319..320 " "
-        SLICE_PAT@320..330
-          L_BRACK@320..321 "["
-          IDENT_PAT@321..325
-            NAME@321..325
-              IDENT@321..325 "head"
-          COMMA@325..326 ","
-          WHITESPACE@326..327 " "
-          REST_PAT@327..329
-            DOT2@327..329 ".."
-          R_BRACK@329..330 "]"
-        WHITESPACE@330..331 " "
-        EQ@331..332 "="
-        WHITESPACE@332..333 " "
-        TUPLE_EXPR@333..335
-          L_PAREN@333..334 "("
-          R_PAREN@334..335 ")"
-        SEMICOLON@335..336 ";"
-      WHITESPACE@336..341 "\n    "
-      LET_STMT@341..368
-        LET_KW@341..344 "let"
-        WHITESPACE@344..345 " "
-        SLICE_PAT@345..362
-          L_BRACK@345..346 "["
-          IDENT_PAT@346..350
-            NAME@346..350
-              IDENT@346..350 "head"
-          COMMA@350..351 ","
-          WHITESPACE@351..352 " "
-          IDENT_PAT@352..361
-            NAME@352..356
-              IDENT@352..356 "tail"
-            WHITESPACE@356..357 " "
-            AT@357..358 "@"
-            WHITESPACE@358..359 " "
-            REST_PAT@359..361
-              DOT2@359..361 ".."
-          R_BRACK@361..362 "]"
-        WHITESPACE@362..363 " "
-        EQ@363..364 "="
-        WHITESPACE@364..365 " "
-        TUPLE_EXPR@365..367
-          L_PAREN@365..366 "("
-          R_PAREN@366..367 ")"
-        SEMICOLON@367..368 ";"
-      WHITESPACE@368..373 "\n    "
-      LET_STMT@373..399
-        LET_KW@373..376 "let"
-        WHITESPACE@376..377 " "
-        SLICE_PAT@377..393
-          L_BRACK@377..378 "["
-          IDENT_PAT@378..382
-            NAME@378..382
-              IDENT@378..382 "head"
-          COMMA@382..383 ","
-          WHITESPACE@383..384 " "
-          REST_PAT@384..386
-            DOT2@384..386 ".."
-          COMMA@386..387 ","
-          WHITESPACE@387..388 " "
-          IDENT_PAT@388..392
-            NAME@388..392
-              IDENT@388..392 "cons"
-          R_BRACK@392..393 "]"
-        WHITESPACE@393..394 " "
-        EQ@394..395 "="
-        WHITESPACE@395..396 " "
-        TUPLE_EXPR@396..398
-          L_PAREN@396..397 "("
-          R_PAREN@397..398 ")"
-        SEMICOLON@398..399 ";"
-      WHITESPACE@399..404 "\n    "
-      LET_STMT@404..436
-        LET_KW@404..407 "let"
-        WHITESPACE@407..408 " "
-        SLICE_PAT@408..430
-          L_BRACK@408..409 "["
-          IDENT_PAT@409..413
-            NAME@409..413
-              IDENT@409..413 "head"
-          COMMA@413..414 ","
-          WHITESPACE@414..415 " "
-          IDENT_PAT@415..423
-            NAME@415..418
-              IDENT@415..418 "mid"
-            WHITESPACE@418..419 " "
-            AT@419..420 "@"
-            WHITESPACE@420..421 " "
-            REST_PAT@421..423
-              DOT2@421..423 ".."
-          COMMA@423..424 ","
-          WHITESPACE@424..425 " "
-          IDENT_PAT@425..429
-            NAME@425..429
-              IDENT@425..429 "cons"
-          R_BRACK@429..430 "]"
-        WHITESPACE@430..431 " "
-        EQ@431..432 "="
-        WHITESPACE@432..433 " "
-        TUPLE_EXPR@433..435
-          L_PAREN@433..434 "("
-          R_PAREN@434..435 ")"
-        SEMICOLON@435..436 ";"
-      WHITESPACE@436..441 "\n    "
-      LET_STMT@441..471
-        LET_KW@441..444 "let"
-        WHITESPACE@444..445 " "
-        SLICE_PAT@445..465
-          L_BRACK@445..446 "["
-          IDENT_PAT@446..450
-            NAME@446..450
-              IDENT@446..450 "head"
-          COMMA@450..451 ","
-          WHITESPACE@451..452 " "
-          REST_PAT@452..454
-            DOT2@452..454 ".."
-          COMMA@454..455 ","
-          WHITESPACE@455..456 " "
-          REST_PAT@456..458
-            DOT2@456..458 ".."
-          COMMA@458..459 ","
-          WHITESPACE@459..460 " "
-          IDENT_PAT@460..464
-            NAME@460..464
-              IDENT@460..464 "cons"
-          R_BRACK@464..465 "]"
-        WHITESPACE@465..466 " "
-        EQ@466..467 "="
-        WHITESPACE@467..468 " "
-        TUPLE_EXPR@468..470
-          L_PAREN@468..469 "("
-          R_PAREN@469..470 ")"
-        SEMICOLON@470..471 ";"
-      WHITESPACE@471..476 "\n    "
-      LET_STMT@476..512
-        LET_KW@476..479 "let"
-        WHITESPACE@479..480 " "
-        SLICE_PAT@480..506
-          L_BRACK@480..481 "["
-          IDENT_PAT@481..485
-            NAME@481..485
-              IDENT@481..485 "head"
-          COMMA@485..486 ","
-          WHITESPACE@486..487 " "
-          REST_PAT@487..489
-            DOT2@487..489 ".."
-          COMMA@489..490 ","
-          WHITESPACE@490..491 " "
-          IDENT_PAT@491..494
-            NAME@491..494
-              IDENT@491..494 "mid"
-          COMMA@494..495 ","
-          WHITESPACE@495..496 " "
-          IDENT_PAT@496..505
-            NAME@496..500
-              IDENT@496..500 "tail"
-            WHITESPACE@500..501 " "
-            AT@501..502 "@"
-            WHITESPACE@502..503 " "
-            REST_PAT@503..505
-              DOT2@503..505 ".."
-          R_BRACK@505..506 "]"
-        WHITESPACE@506..507 " "
-        EQ@507..508 "="
-        WHITESPACE@508..509 " "
-        TUPLE_EXPR@509..511
-          L_PAREN@509..510 "("
-          R_PAREN@510..511 ")"
-        SEMICOLON@511..512 ";"
-      WHITESPACE@512..517 "\n    "
-      LET_STMT@517..552
-        LET_KW@517..520 "let"
-        WHITESPACE@520..521 " "
-        SLICE_PAT@521..546
-          L_BRACK@521..522 "["
-          IDENT_PAT@522..526
-            NAME@522..526
-              IDENT@522..526 "head"
-          COMMA@526..527 ","
-          WHITESPACE@527..528 " "
-          REST_PAT@528..530
-            DOT2@528..530 ".."
-          COMMA@530..531 ","
-          WHITESPACE@531..532 " "
-          IDENT_PAT@532..535
-            NAME@532..535
-              IDENT@532..535 "mid"
-          COMMA@535..536 ","
-          WHITESPACE@536..537 " "
-          REST_PAT@537..539
-            DOT2@537..539 ".."
-          COMMA@539..540 ","
-          WHITESPACE@540..541 " "
-          IDENT_PAT@541..545
-            NAME@541..545
-              IDENT@541..545 "cons"
-          R_BRACK@545..546 "]"
-        WHITESPACE@546..547 " "
-        EQ@547..548 "="
-        WHITESPACE@548..549 " "
-        TUPLE_EXPR@549..551
-          L_PAREN@549..550 "("
-          R_PAREN@550..551 ")"
-        SEMICOLON@551..552 ";"
-      WHITESPACE@552..553 "\n"
-      R_CURLY@553..554 "}"
+      STMT_LIST@10..554
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        LET_STMT@16..28
+          LET_KW@16..19 "let"
+          WHITESPACE@19..20 " "
+          REST_PAT@20..22
+            DOT2@20..22 ".."
+          WHITESPACE@22..23 " "
+          EQ@23..24 "="
+          WHITESPACE@24..25 " "
+          TUPLE_EXPR@25..27
+            L_PAREN@25..26 "("
+            R_PAREN@26..27 ")"
+          SEMICOLON@27..28 ";"
+        WHITESPACE@28..33 "\n    "
+        COMMENT@33..35 "//"
+        WHITESPACE@35..40 "\n    "
+        COMMENT@40..49 "// Tuples"
+        WHITESPACE@49..54 "\n    "
+        COMMENT@54..56 "//"
+        WHITESPACE@56..61 "\n    "
+        LET_STMT@61..78
+          LET_KW@61..64 "let"
+          WHITESPACE@64..65 " "
+          TUPLE_PAT@65..72
+            L_PAREN@65..66 "("
+            IDENT_PAT@66..67
+              NAME@66..67
+                IDENT@66..67 "a"
+            COMMA@67..68 ","
+            WHITESPACE@68..69 " "
+            REST_PAT@69..71
+              DOT2@69..71 ".."
+            R_PAREN@71..72 ")"
+          WHITESPACE@72..73 " "
+          EQ@73..74 "="
+          WHITESPACE@74..75 " "
+          TUPLE_EXPR@75..77
+            L_PAREN@75..76 "("
+            R_PAREN@76..77 ")"
+          SEMICOLON@77..78 ";"
+        WHITESPACE@78..83 "\n    "
+        LET_STMT@83..101
+          LET_KW@83..86 "let"
+          WHITESPACE@86..87 " "
+          TUPLE_PAT@87..95
+            L_PAREN@87..88 "("
+            IDENT_PAT@88..89
+              NAME@88..89
+                IDENT@88..89 "a"
+            COMMA@89..90 ","
+            WHITESPACE@90..91 " "
+            REST_PAT@91..93
+              DOT2@91..93 ".."
+            COMMA@93..94 ","
+            R_PAREN@94..95 ")"
+          WHITESPACE@95..96 " "
+          EQ@96..97 "="
+          WHITESPACE@97..98 " "
+          TUPLE_EXPR@98..100
+            L_PAREN@98..99 "("
+            R_PAREN@99..100 ")"
+          SEMICOLON@100..101 ";"
+        WHITESPACE@101..106 "\n    "
+        LET_STMT@106..128
+          LET_KW@106..109 "let"
+          WHITESPACE@109..110 " "
+          TUPLE_STRUCT_PAT@110..122
+            PATH@110..115
+              PATH_SEGMENT@110..115
+                NAME_REF@110..115
+                  IDENT@110..115 "Tuple"
+            L_PAREN@115..116 "("
+            IDENT_PAT@116..117
+              NAME@116..117
+                IDENT@116..117 "a"
+            COMMA@117..118 ","
+            WHITESPACE@118..119 " "
+            REST_PAT@119..121
+              DOT2@119..121 ".."
+            R_PAREN@121..122 ")"
+          WHITESPACE@122..123 " "
+          EQ@123..124 "="
+          WHITESPACE@124..125 " "
+          TUPLE_EXPR@125..127
+            L_PAREN@125..126 "("
+            R_PAREN@126..127 ")"
+          SEMICOLON@127..128 ";"
+        WHITESPACE@128..133 "\n    "
+        LET_STMT@133..156
+          LET_KW@133..136 "let"
+          WHITESPACE@136..137 " "
+          TUPLE_STRUCT_PAT@137..150
+            PATH@137..142
+              PATH_SEGMENT@137..142
+                NAME_REF@137..142
+                  IDENT@137..142 "Tuple"
+            L_PAREN@142..143 "("
+            IDENT_PAT@143..144
+              NAME@143..144
+                IDENT@143..144 "a"
+            COMMA@144..145 ","
+            WHITESPACE@145..146 " "
+            REST_PAT@146..148
+              DOT2@146..148 ".."
+            COMMA@148..149 ","
+            R_PAREN@149..150 ")"
+          WHITESPACE@150..151 " "
+          EQ@151..152 "="
+          WHITESPACE@152..153 " "
+          TUPLE_EXPR@153..155
+            L_PAREN@153..154 "("
+            R_PAREN@154..155 ")"
+          SEMICOLON@155..156 ";"
+        WHITESPACE@156..161 "\n    "
+        LET_STMT@161..179
+          LET_KW@161..164 "let"
+          WHITESPACE@164..165 " "
+          TUPLE_PAT@165..173
+            L_PAREN@165..166 "("
+            REST_PAT@166..168
+              DOT2@166..168 ".."
+            COMMA@168..169 ","
+            WHITESPACE@169..170 " "
+            REST_PAT@170..172
+              DOT2@170..172 ".."
+            R_PAREN@172..173 ")"
+          WHITESPACE@173..174 " "
+          EQ@174..175 "="
+          WHITESPACE@175..176 " "
+          TUPLE_EXPR@176..178
+            L_PAREN@176..177 "("
+            R_PAREN@177..178 ")"
+          SEMICOLON@178..179 ";"
+        WHITESPACE@179..184 "\n    "
+        LET_STMT@184..207
+          LET_KW@184..187 "let"
+          WHITESPACE@187..188 " "
+          TUPLE_STRUCT_PAT@188..201
+            PATH@188..193
+              PATH_SEGMENT@188..193
+                NAME_REF@188..193
+                  IDENT@188..193 "Tuple"
+            L_PAREN@193..194 "("
+            REST_PAT@194..196
+              DOT2@194..196 ".."
+            COMMA@196..197 ","
+            WHITESPACE@197..198 " "
+            REST_PAT@198..200
+              DOT2@198..200 ".."
+            R_PAREN@200..201 ")"
+          WHITESPACE@201..202 " "
+          EQ@202..203 "="
+          WHITESPACE@203..204 " "
+          TUPLE_EXPR@204..206
+            L_PAREN@204..205 "("
+            R_PAREN@205..206 ")"
+          SEMICOLON@206..207 ";"
+        WHITESPACE@207..212 "\n    "
+        LET_STMT@212..233
+          LET_KW@212..215 "let"
+          WHITESPACE@215..216 " "
+          TUPLE_PAT@216..227
+            L_PAREN@216..217 "("
+            REST_PAT@217..219
+              DOT2@217..219 ".."
+            COMMA@219..220 ","
+            WHITESPACE@220..221 " "
+            IDENT_PAT@221..222
+              NAME@221..222
+                IDENT@221..222 "a"
+            COMMA@222..223 ","
+            WHITESPACE@223..224 " "
+            REST_PAT@224..226
+              DOT2@224..226 ".."
+            R_PAREN@226..227 ")"
+          WHITESPACE@227..228 " "
+          EQ@228..229 "="
+          WHITESPACE@229..230 " "
+          TUPLE_EXPR@230..232
+            L_PAREN@230..231 "("
+            R_PAREN@231..232 ")"
+          SEMICOLON@232..233 ";"
+        WHITESPACE@233..238 "\n    "
+        LET_STMT@238..264
+          LET_KW@238..241 "let"
+          WHITESPACE@241..242 " "
+          TUPLE_STRUCT_PAT@242..258
+            PATH@242..247
+              PATH_SEGMENT@242..247
+                NAME_REF@242..247
+                  IDENT@242..247 "Tuple"
+            L_PAREN@247..248 "("
+            REST_PAT@248..250
+              DOT2@248..250 ".."
+            COMMA@250..251 ","
+            WHITESPACE@251..252 " "
+            IDENT_PAT@252..253
+              NAME@252..253
+                IDENT@252..253 "a"
+            COMMA@253..254 ","
+            WHITESPACE@254..255 " "
+            REST_PAT@255..257
+              DOT2@255..257 ".."
+            R_PAREN@257..258 ")"
+          WHITESPACE@258..259 " "
+          EQ@259..260 "="
+          WHITESPACE@260..261 " "
+          TUPLE_EXPR@261..263
+            L_PAREN@261..262 "("
+            R_PAREN@262..263 ")"
+          SEMICOLON@263..264 ";"
+        WHITESPACE@264..269 "\n    "
+        COMMENT@269..271 "//"
+        WHITESPACE@271..276 "\n    "
+        COMMENT@276..285 "// Slices"
+        WHITESPACE@285..290 "\n    "
+        COMMENT@290..292 "//"
+        WHITESPACE@292..297 "\n    "
+        LET_STMT@297..311
+          LET_KW@297..300 "let"
+          WHITESPACE@300..301 " "
+          SLICE_PAT@301..305
+            L_BRACK@301..302 "["
+            REST_PAT@302..304
+              DOT2@302..304 ".."
+            R_BRACK@304..305 "]"
+          WHITESPACE@305..306 " "
+          EQ@306..307 "="
+          WHITESPACE@307..308 " "
+          TUPLE_EXPR@308..310
+            L_PAREN@308..309 "("
+            R_PAREN@309..310 ")"
+          SEMICOLON@310..311 ";"
+        WHITESPACE@311..316 "\n    "
+        LET_STMT@316..336
+          LET_KW@316..319 "let"
+          WHITESPACE@319..320 " "
+          SLICE_PAT@320..330
+            L_BRACK@320..321 "["
+            IDENT_PAT@321..325
+              NAME@321..325
+                IDENT@321..325 "head"
+            COMMA@325..326 ","
+            WHITESPACE@326..327 " "
+            REST_PAT@327..329
+              DOT2@327..329 ".."
+            R_BRACK@329..330 "]"
+          WHITESPACE@330..331 " "
+          EQ@331..332 "="
+          WHITESPACE@332..333 " "
+          TUPLE_EXPR@333..335
+            L_PAREN@333..334 "("
+            R_PAREN@334..335 ")"
+          SEMICOLON@335..336 ";"
+        WHITESPACE@336..341 "\n    "
+        LET_STMT@341..368
+          LET_KW@341..344 "let"
+          WHITESPACE@344..345 " "
+          SLICE_PAT@345..362
+            L_BRACK@345..346 "["
+            IDENT_PAT@346..350
+              NAME@346..350
+                IDENT@346..350 "head"
+            COMMA@350..351 ","
+            WHITESPACE@351..352 " "
+            IDENT_PAT@352..361
+              NAME@352..356
+                IDENT@352..356 "tail"
+              WHITESPACE@356..357 " "
+              AT@357..358 "@"
+              WHITESPACE@358..359 " "
+              REST_PAT@359..361
+                DOT2@359..361 ".."
+            R_BRACK@361..362 "]"
+          WHITESPACE@362..363 " "
+          EQ@363..364 "="
+          WHITESPACE@364..365 " "
+          TUPLE_EXPR@365..367
+            L_PAREN@365..366 "("
+            R_PAREN@366..367 ")"
+          SEMICOLON@367..368 ";"
+        WHITESPACE@368..373 "\n    "
+        LET_STMT@373..399
+          LET_KW@373..376 "let"
+          WHITESPACE@376..377 " "
+          SLICE_PAT@377..393
+            L_BRACK@377..378 "["
+            IDENT_PAT@378..382
+              NAME@378..382
+                IDENT@378..382 "head"
+            COMMA@382..383 ","
+            WHITESPACE@383..384 " "
+            REST_PAT@384..386
+              DOT2@384..386 ".."
+            COMMA@386..387 ","
+            WHITESPACE@387..388 " "
+            IDENT_PAT@388..392
+              NAME@388..392
+                IDENT@388..392 "cons"
+            R_BRACK@392..393 "]"
+          WHITESPACE@393..394 " "
+          EQ@394..395 "="
+          WHITESPACE@395..396 " "
+          TUPLE_EXPR@396..398
+            L_PAREN@396..397 "("
+            R_PAREN@397..398 ")"
+          SEMICOLON@398..399 ";"
+        WHITESPACE@399..404 "\n    "
+        LET_STMT@404..436
+          LET_KW@404..407 "let"
+          WHITESPACE@407..408 " "
+          SLICE_PAT@408..430
+            L_BRACK@408..409 "["
+            IDENT_PAT@409..413
+              NAME@409..413
+                IDENT@409..413 "head"
+            COMMA@413..414 ","
+            WHITESPACE@414..415 " "
+            IDENT_PAT@415..423
+              NAME@415..418
+                IDENT@415..418 "mid"
+              WHITESPACE@418..419 " "
+              AT@419..420 "@"
+              WHITESPACE@420..421 " "
+              REST_PAT@421..423
+                DOT2@421..423 ".."
+            COMMA@423..424 ","
+            WHITESPACE@424..425 " "
+            IDENT_PAT@425..429
+              NAME@425..429
+                IDENT@425..429 "cons"
+            R_BRACK@429..430 "]"
+          WHITESPACE@430..431 " "
+          EQ@431..432 "="
+          WHITESPACE@432..433 " "
+          TUPLE_EXPR@433..435
+            L_PAREN@433..434 "("
+            R_PAREN@434..435 ")"
+          SEMICOLON@435..436 ";"
+        WHITESPACE@436..441 "\n    "
+        LET_STMT@441..471
+          LET_KW@441..444 "let"
+          WHITESPACE@444..445 " "
+          SLICE_PAT@445..465
+            L_BRACK@445..446 "["
+            IDENT_PAT@446..450
+              NAME@446..450
+                IDENT@446..450 "head"
+            COMMA@450..451 ","
+            WHITESPACE@451..452 " "
+            REST_PAT@452..454
+              DOT2@452..454 ".."
+            COMMA@454..455 ","
+            WHITESPACE@455..456 " "
+            REST_PAT@456..458
+              DOT2@456..458 ".."
+            COMMA@458..459 ","
+            WHITESPACE@459..460 " "
+            IDENT_PAT@460..464
+              NAME@460..464
+                IDENT@460..464 "cons"
+            R_BRACK@464..465 "]"
+          WHITESPACE@465..466 " "
+          EQ@466..467 "="
+          WHITESPACE@467..468 " "
+          TUPLE_EXPR@468..470
+            L_PAREN@468..469 "("
+            R_PAREN@469..470 ")"
+          SEMICOLON@470..471 ";"
+        WHITESPACE@471..476 "\n    "
+        LET_STMT@476..512
+          LET_KW@476..479 "let"
+          WHITESPACE@479..480 " "
+          SLICE_PAT@480..506
+            L_BRACK@480..481 "["
+            IDENT_PAT@481..485
+              NAME@481..485
+                IDENT@481..485 "head"
+            COMMA@485..486 ","
+            WHITESPACE@486..487 " "
+            REST_PAT@487..489
+              DOT2@487..489 ".."
+            COMMA@489..490 ","
+            WHITESPACE@490..491 " "
+            IDENT_PAT@491..494
+              NAME@491..494
+                IDENT@491..494 "mid"
+            COMMA@494..495 ","
+            WHITESPACE@495..496 " "
+            IDENT_PAT@496..505
+              NAME@496..500
+                IDENT@496..500 "tail"
+              WHITESPACE@500..501 " "
+              AT@501..502 "@"
+              WHITESPACE@502..503 " "
+              REST_PAT@503..505
+                DOT2@503..505 ".."
+            R_BRACK@505..506 "]"
+          WHITESPACE@506..507 " "
+          EQ@507..508 "="
+          WHITESPACE@508..509 " "
+          TUPLE_EXPR@509..511
+            L_PAREN@509..510 "("
+            R_PAREN@510..511 ")"
+          SEMICOLON@511..512 ";"
+        WHITESPACE@512..517 "\n    "
+        LET_STMT@517..552
+          LET_KW@517..520 "let"
+          WHITESPACE@520..521 " "
+          SLICE_PAT@521..546
+            L_BRACK@521..522 "["
+            IDENT_PAT@522..526
+              NAME@522..526
+                IDENT@522..526 "head"
+            COMMA@526..527 ","
+            WHITESPACE@527..528 " "
+            REST_PAT@528..530
+              DOT2@528..530 ".."
+            COMMA@530..531 ","
+            WHITESPACE@531..532 " "
+            IDENT_PAT@532..535
+              NAME@532..535
+                IDENT@532..535 "mid"
+            COMMA@535..536 ","
+            WHITESPACE@536..537 " "
+            REST_PAT@537..539
+              DOT2@537..539 ".."
+            COMMA@539..540 ","
+            WHITESPACE@540..541 " "
+            IDENT_PAT@541..545
+              NAME@541..545
+                IDENT@541..545 "cons"
+            R_BRACK@545..546 "]"
+          WHITESPACE@546..547 " "
+          EQ@547..548 "="
+          WHITESPACE@548..549 " "
+          TUPLE_EXPR@549..551
+            L_PAREN@549..550 "("
+            R_PAREN@550..551 ")"
+          SEMICOLON@551..552 ";"
+        WHITESPACE@552..553 "\n"
+        R_CURLY@553..554 "}"
   WHITESPACE@554..555 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0145_record_pat_field.rast b/crates/syntax/test_data/parser/inline/ok/0145_record_pat_field.rast
index c606a7c9b04..b79690b9ed7 100644
--- a/crates/syntax/test_data/parser/inline/ok/0145_record_pat_field.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0145_record_pat_field.rast
@@ -9,114 +9,115 @@ SOURCE_FILE@0..102
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..101
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      LET_STMT@15..35
-        LET_KW@15..18 "let"
-        WHITESPACE@18..19 " "
-        RECORD_PAT@19..29
-          PATH@19..20
-            PATH_SEGMENT@19..20
-              NAME_REF@19..20
-                IDENT@19..20 "S"
-          WHITESPACE@20..21 " "
-          RECORD_PAT_FIELD_LIST@21..29
-            L_CURLY@21..22 "{"
-            WHITESPACE@22..23 " "
-            RECORD_PAT_FIELD@23..27
-              NAME_REF@23..24
-                INT_NUMBER@23..24 "0"
-              COLON@24..25 ":"
-              WHITESPACE@25..26 " "
-              LITERAL_PAT@26..27
-                LITERAL@26..27
-                  INT_NUMBER@26..27 "1"
-            WHITESPACE@27..28 " "
-            R_CURLY@28..29 "}"
-        WHITESPACE@29..30 " "
-        EQ@30..31 "="
-        WHITESPACE@31..32 " "
-        TUPLE_EXPR@32..34
-          L_PAREN@32..33 "("
-          R_PAREN@33..34 ")"
-        SEMICOLON@34..35 ";"
-      WHITESPACE@35..40 "\n    "
-      LET_STMT@40..60
-        LET_KW@40..43 "let"
-        WHITESPACE@43..44 " "
-        RECORD_PAT@44..54
-          PATH@44..45
-            PATH_SEGMENT@44..45
-              NAME_REF@44..45
-                IDENT@44..45 "S"
-          WHITESPACE@45..46 " "
-          RECORD_PAT_FIELD_LIST@46..54
-            L_CURLY@46..47 "{"
-            WHITESPACE@47..48 " "
-            RECORD_PAT_FIELD@48..52
-              NAME_REF@48..49
-                IDENT@48..49 "x"
-              COLON@49..50 ":"
-              WHITESPACE@50..51 " "
-              LITERAL_PAT@51..52
-                LITERAL@51..52
-                  INT_NUMBER@51..52 "1"
-            WHITESPACE@52..53 " "
-            R_CURLY@53..54 "}"
-        WHITESPACE@54..55 " "
-        EQ@55..56 "="
-        WHITESPACE@56..57 " "
-        TUPLE_EXPR@57..59
-          L_PAREN@57..58 "("
-          R_PAREN@58..59 ")"
-        SEMICOLON@59..60 ";"
-      WHITESPACE@60..65 "\n    "
-      LET_STMT@65..99
-        LET_KW@65..68 "let"
-        WHITESPACE@68..69 " "
-        RECORD_PAT@69..93
-          PATH@69..70
-            PATH_SEGMENT@69..70
-              NAME_REF@69..70
-                IDENT@69..70 "S"
-          WHITESPACE@70..71 " "
-          RECORD_PAT_FIELD_LIST@71..93
-            L_CURLY@71..72 "{"
-            WHITESPACE@72..73 " "
-            RECORD_PAT_FIELD@73..91
-              ATTR@73..86
-                POUND@73..74 "#"
-                L_BRACK@74..75 "["
-                META@75..85
-                  PATH@75..78
-                    PATH_SEGMENT@75..78
-                      NAME_REF@75..78
-                        IDENT@75..78 "cfg"
-                  TOKEN_TREE@78..85
-                    L_PAREN@78..79 "("
-                    IDENT@79..82 "any"
-                    TOKEN_TREE@82..84
-                      L_PAREN@82..83 "("
-                      R_PAREN@83..84 ")"
-                    R_PAREN@84..85 ")"
-                R_BRACK@85..86 "]"
-              WHITESPACE@86..87 " "
-              NAME_REF@87..88
-                IDENT@87..88 "x"
-              COLON@88..89 ":"
-              WHITESPACE@89..90 " "
-              LITERAL_PAT@90..91
-                LITERAL@90..91
-                  INT_NUMBER@90..91 "1"
-            WHITESPACE@91..92 " "
-            R_CURLY@92..93 "}"
-        WHITESPACE@93..94 " "
-        EQ@94..95 "="
-        WHITESPACE@95..96 " "
-        TUPLE_EXPR@96..98
-          L_PAREN@96..97 "("
-          R_PAREN@97..98 ")"
-        SEMICOLON@98..99 ";"
-      WHITESPACE@99..100 "\n"
-      R_CURLY@100..101 "}"
+      STMT_LIST@9..101
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        LET_STMT@15..35
+          LET_KW@15..18 "let"
+          WHITESPACE@18..19 " "
+          RECORD_PAT@19..29
+            PATH@19..20
+              PATH_SEGMENT@19..20
+                NAME_REF@19..20
+                  IDENT@19..20 "S"
+            WHITESPACE@20..21 " "
+            RECORD_PAT_FIELD_LIST@21..29
+              L_CURLY@21..22 "{"
+              WHITESPACE@22..23 " "
+              RECORD_PAT_FIELD@23..27
+                NAME_REF@23..24
+                  INT_NUMBER@23..24 "0"
+                COLON@24..25 ":"
+                WHITESPACE@25..26 " "
+                LITERAL_PAT@26..27
+                  LITERAL@26..27
+                    INT_NUMBER@26..27 "1"
+              WHITESPACE@27..28 " "
+              R_CURLY@28..29 "}"
+          WHITESPACE@29..30 " "
+          EQ@30..31 "="
+          WHITESPACE@31..32 " "
+          TUPLE_EXPR@32..34
+            L_PAREN@32..33 "("
+            R_PAREN@33..34 ")"
+          SEMICOLON@34..35 ";"
+        WHITESPACE@35..40 "\n    "
+        LET_STMT@40..60
+          LET_KW@40..43 "let"
+          WHITESPACE@43..44 " "
+          RECORD_PAT@44..54
+            PATH@44..45
+              PATH_SEGMENT@44..45
+                NAME_REF@44..45
+                  IDENT@44..45 "S"
+            WHITESPACE@45..46 " "
+            RECORD_PAT_FIELD_LIST@46..54
+              L_CURLY@46..47 "{"
+              WHITESPACE@47..48 " "
+              RECORD_PAT_FIELD@48..52
+                NAME_REF@48..49
+                  IDENT@48..49 "x"
+                COLON@49..50 ":"
+                WHITESPACE@50..51 " "
+                LITERAL_PAT@51..52
+                  LITERAL@51..52
+                    INT_NUMBER@51..52 "1"
+              WHITESPACE@52..53 " "
+              R_CURLY@53..54 "}"
+          WHITESPACE@54..55 " "
+          EQ@55..56 "="
+          WHITESPACE@56..57 " "
+          TUPLE_EXPR@57..59
+            L_PAREN@57..58 "("
+            R_PAREN@58..59 ")"
+          SEMICOLON@59..60 ";"
+        WHITESPACE@60..65 "\n    "
+        LET_STMT@65..99
+          LET_KW@65..68 "let"
+          WHITESPACE@68..69 " "
+          RECORD_PAT@69..93
+            PATH@69..70
+              PATH_SEGMENT@69..70
+                NAME_REF@69..70
+                  IDENT@69..70 "S"
+            WHITESPACE@70..71 " "
+            RECORD_PAT_FIELD_LIST@71..93
+              L_CURLY@71..72 "{"
+              WHITESPACE@72..73 " "
+              RECORD_PAT_FIELD@73..91
+                ATTR@73..86
+                  POUND@73..74 "#"
+                  L_BRACK@74..75 "["
+                  META@75..85
+                    PATH@75..78
+                      PATH_SEGMENT@75..78
+                        NAME_REF@75..78
+                          IDENT@75..78 "cfg"
+                    TOKEN_TREE@78..85
+                      L_PAREN@78..79 "("
+                      IDENT@79..82 "any"
+                      TOKEN_TREE@82..84
+                        L_PAREN@82..83 "("
+                        R_PAREN@83..84 ")"
+                      R_PAREN@84..85 ")"
+                  R_BRACK@85..86 "]"
+                WHITESPACE@86..87 " "
+                NAME_REF@87..88
+                  IDENT@87..88 "x"
+                COLON@88..89 ":"
+                WHITESPACE@89..90 " "
+                LITERAL_PAT@90..91
+                  LITERAL@90..91
+                    INT_NUMBER@90..91 "1"
+              WHITESPACE@91..92 " "
+              R_CURLY@92..93 "}"
+          WHITESPACE@93..94 " "
+          EQ@94..95 "="
+          WHITESPACE@95..96 " "
+          TUPLE_EXPR@96..98
+            L_PAREN@96..97 "("
+            R_PAREN@97..98 ")"
+          SEMICOLON@98..99 ";"
+        WHITESPACE@99..100 "\n"
+        R_CURLY@100..101 "}"
   WHITESPACE@101..102 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0146_as_precedence.rast b/crates/syntax/test_data/parser/inline/ok/0146_as_precedence.rast
index c9cfb97ef36..5a51b3bbea2 100644
--- a/crates/syntax/test_data/parser/inline/ok/0146_as_precedence.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0146_as_precedence.rast
@@ -9,34 +9,35 @@ SOURCE_FILE@0..37
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..36
-      L_CURLY@7..8 "{"
-      WHITESPACE@8..9 " "
-      LET_STMT@9..34
-        LET_KW@9..12 "let"
-        WHITESPACE@12..13 " "
-        WILDCARD_PAT@13..14
-          UNDERSCORE@13..14 "_"
-        WHITESPACE@14..15 " "
-        EQ@15..16 "="
-        WHITESPACE@16..17 " "
-        CAST_EXPR@17..33
-          REF_EXPR@17..19
-            AMP@17..18 "&"
-            LITERAL@18..19
-              INT_NUMBER@18..19 "1"
-          WHITESPACE@19..20 " "
-          AS_KW@20..22 "as"
-          WHITESPACE@22..23 " "
-          PTR_TYPE@23..33
-            STAR@23..24 "*"
-            CONST_KW@24..29 "const"
-            WHITESPACE@29..30 " "
-            PATH_TYPE@30..33
-              PATH@30..33
-                PATH_SEGMENT@30..33
-                  NAME_REF@30..33
-                    IDENT@30..33 "i32"
-        SEMICOLON@33..34 ";"
-      WHITESPACE@34..35 " "
-      R_CURLY@35..36 "}"
+      STMT_LIST@7..36
+        L_CURLY@7..8 "{"
+        WHITESPACE@8..9 " "
+        LET_STMT@9..34
+          LET_KW@9..12 "let"
+          WHITESPACE@12..13 " "
+          WILDCARD_PAT@13..14
+            UNDERSCORE@13..14 "_"
+          WHITESPACE@14..15 " "
+          EQ@15..16 "="
+          WHITESPACE@16..17 " "
+          CAST_EXPR@17..33
+            REF_EXPR@17..19
+              AMP@17..18 "&"
+              LITERAL@18..19
+                INT_NUMBER@18..19 "1"
+            WHITESPACE@19..20 " "
+            AS_KW@20..22 "as"
+            WHITESPACE@22..23 " "
+            PTR_TYPE@23..33
+              STAR@23..24 "*"
+              CONST_KW@24..29 "const"
+              WHITESPACE@29..30 " "
+              PATH_TYPE@30..33
+                PATH@30..33
+                  PATH_SEGMENT@30..33
+                    NAME_REF@30..33
+                      IDENT@30..33 "i32"
+          SEMICOLON@33..34 ";"
+        WHITESPACE@34..35 " "
+        R_CURLY@35..36 "}"
   WHITESPACE@36..37 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0151_fn.rast b/crates/syntax/test_data/parser/inline/ok/0151_fn.rast
index 23c4269b306..ec93d4a1c75 100644
--- a/crates/syntax/test_data/parser/inline/ok/0151_fn.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0151_fn.rast
@@ -9,6 +9,7 @@ SOURCE_FILE@0..12
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..11
-      L_CURLY@9..10 "{"
-      R_CURLY@10..11 "}"
+      STMT_LIST@9..11
+        L_CURLY@9..10 "{"
+        R_CURLY@10..11 "}"
   WHITESPACE@11..12 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0152_arg_with_attr.rast b/crates/syntax/test_data/parser/inline/ok/0152_arg_with_attr.rast
index 1d20765b033..7a6d2daa38f 100644
--- a/crates/syntax/test_data/parser/inline/ok/0152_arg_with_attr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0152_arg_with_attr.rast
@@ -9,29 +9,30 @@ SOURCE_FILE@0..34
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..33
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      CALL_EXPR@16..31
-        PATH_EXPR@16..19
-          PATH@16..19
-            PATH_SEGMENT@16..19
-              NAME_REF@16..19
-                IDENT@16..19 "foo"
-        ARG_LIST@19..31
-          L_PAREN@19..20 "("
-          LITERAL@20..30
-            ATTR@20..27
-              POUND@20..21 "#"
-              L_BRACK@21..22 "["
-              META@22..26
-                PATH@22..26
-                  PATH_SEGMENT@22..26
-                    NAME_REF@22..26
-                      IDENT@22..26 "attr"
-              R_BRACK@26..27 "]"
-            WHITESPACE@27..28 " "
-            INT_NUMBER@28..30 "92"
-          R_PAREN@30..31 ")"
-      WHITESPACE@31..32 "\n"
-      R_CURLY@32..33 "}"
+      STMT_LIST@10..33
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        CALL_EXPR@16..31
+          PATH_EXPR@16..19
+            PATH@16..19
+              PATH_SEGMENT@16..19
+                NAME_REF@16..19
+                  IDENT@16..19 "foo"
+          ARG_LIST@19..31
+            L_PAREN@19..20 "("
+            LITERAL@20..30
+              ATTR@20..27
+                POUND@20..21 "#"
+                L_BRACK@21..22 "["
+                META@22..26
+                  PATH@22..26
+                    PATH_SEGMENT@22..26
+                      NAME_REF@22..26
+                        IDENT@22..26 "attr"
+                R_BRACK@26..27 "]"
+              WHITESPACE@27..28 " "
+              INT_NUMBER@28..30 "92"
+            R_PAREN@30..31 ")"
+        WHITESPACE@31..32 "\n"
+        R_CURLY@32..33 "}"
   WHITESPACE@33..34 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0155_closure_params.rast b/crates/syntax/test_data/parser/inline/ok/0155_closure_params.rast
index 31671b42018..ca5fb62a854 100644
--- a/crates/syntax/test_data/parser/inline/ok/0155_closure_params.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0155_closure_params.rast
@@ -9,61 +9,62 @@ SOURCE_FILE@0..63
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..62
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..15 "\n   "
-      LET_STMT@15..60
-        LET_KW@15..18 "let"
-        WHITESPACE@18..19 " "
-        IDENT_PAT@19..22
-          NAME@19..22
-            IDENT@19..22 "foo"
-        WHITESPACE@22..23 " "
-        EQ@23..24 "="
-        WHITESPACE@24..25 " "
-        CLOSURE_EXPR@25..59
-          PARAM_LIST@25..56
-            PIPE@25..26 "|"
-            PARAM@26..29
-              IDENT_PAT@26..29
-                NAME@26..29
-                  IDENT@26..29 "bar"
-            COMMA@29..30 ","
-            WHITESPACE@30..31 " "
-            PARAM@31..39
-              IDENT_PAT@31..34
-                NAME@31..34
-                  IDENT@31..34 "baz"
-              COLON@34..35 ":"
-              WHITESPACE@35..36 " "
-              PATH_TYPE@36..39
-                PATH@36..39
-                  PATH_SEGMENT@36..39
-                    NAME_REF@36..39
-                      IDENT@36..39 "Baz"
-            COMMA@39..40 ","
-            WHITESPACE@40..41 " "
-            PARAM@41..55
-              IDENT_PAT@41..44
-                NAME@41..44
-                  IDENT@41..44 "qux"
-              COLON@44..45 ":"
-              WHITESPACE@45..46 " "
-              PATH_TYPE@46..55
-                PATH@46..55
-                  PATH@46..49
-                    PATH_SEGMENT@46..49
-                      NAME_REF@46..49
-                        IDENT@46..49 "Qux"
-                  COLON2@49..51 "::"
-                  PATH_SEGMENT@51..55
-                    NAME_REF@51..55
-                      IDENT@51..55 "Quux"
-            PIPE@55..56 "|"
-          WHITESPACE@56..57 " "
-          TUPLE_EXPR@57..59
-            L_PAREN@57..58 "("
-            R_PAREN@58..59 ")"
-        SEMICOLON@59..60 ";"
-      WHITESPACE@60..61 "\n"
-      R_CURLY@61..62 "}"
+      STMT_LIST@10..62
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..15 "\n   "
+        LET_STMT@15..60
+          LET_KW@15..18 "let"
+          WHITESPACE@18..19 " "
+          IDENT_PAT@19..22
+            NAME@19..22
+              IDENT@19..22 "foo"
+          WHITESPACE@22..23 " "
+          EQ@23..24 "="
+          WHITESPACE@24..25 " "
+          CLOSURE_EXPR@25..59
+            PARAM_LIST@25..56
+              PIPE@25..26 "|"
+              PARAM@26..29
+                IDENT_PAT@26..29
+                  NAME@26..29
+                    IDENT@26..29 "bar"
+              COMMA@29..30 ","
+              WHITESPACE@30..31 " "
+              PARAM@31..39
+                IDENT_PAT@31..34
+                  NAME@31..34
+                    IDENT@31..34 "baz"
+                COLON@34..35 ":"
+                WHITESPACE@35..36 " "
+                PATH_TYPE@36..39
+                  PATH@36..39
+                    PATH_SEGMENT@36..39
+                      NAME_REF@36..39
+                        IDENT@36..39 "Baz"
+              COMMA@39..40 ","
+              WHITESPACE@40..41 " "
+              PARAM@41..55
+                IDENT_PAT@41..44
+                  NAME@41..44
+                    IDENT@41..44 "qux"
+                COLON@44..45 ":"
+                WHITESPACE@45..46 " "
+                PATH_TYPE@46..55
+                  PATH@46..55
+                    PATH@46..49
+                      PATH_SEGMENT@46..49
+                        NAME_REF@46..49
+                          IDENT@46..49 "Qux"
+                    COLON2@49..51 "::"
+                    PATH_SEGMENT@51..55
+                      NAME_REF@51..55
+                        IDENT@51..55 "Quux"
+              PIPE@55..56 "|"
+            WHITESPACE@56..57 " "
+            TUPLE_EXPR@57..59
+              L_PAREN@57..58 "("
+              R_PAREN@58..59 ")"
+          SEMICOLON@59..60 ";"
+        WHITESPACE@60..61 "\n"
+        R_CURLY@61..62 "}"
   WHITESPACE@62..63 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0156_const_block_pat.rast b/crates/syntax/test_data/parser/inline/ok/0156_const_block_pat.rast
index 8ff4822c4ef..1144d5684d3 100644
--- a/crates/syntax/test_data/parser/inline/ok/0156_const_block_pat.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0156_const_block_pat.rast
@@ -9,68 +9,71 @@ SOURCE_FILE@0..78
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..77
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      LET_STMT@16..38
-        LET_KW@16..19 "let"
-        WHITESPACE@19..20 " "
-        CONST_BLOCK_PAT@20..32
-          CONST_KW@20..25 "const"
-          WHITESPACE@25..26 " "
-          BLOCK_EXPR@26..32
-            L_CURLY@26..27 "{"
-            WHITESPACE@27..28 " "
-            LITERAL@28..30
-              INT_NUMBER@28..30 "15"
-            WHITESPACE@30..31 " "
-            R_CURLY@31..32 "}"
-        WHITESPACE@32..33 " "
-        EQ@33..34 "="
-        WHITESPACE@34..35 " "
-        TUPLE_EXPR@35..37
-          L_PAREN@35..36 "("
-          R_PAREN@36..37 ")"
-        SEMICOLON@37..38 ";"
-      WHITESPACE@38..43 "\n    "
-      LET_STMT@43..75
-        LET_KW@43..46 "let"
-        WHITESPACE@46..47 " "
-        CONST_BLOCK_PAT@47..69
-          CONST_KW@47..52 "const"
-          WHITESPACE@52..53 " "
-          BLOCK_EXPR@53..69
-            L_CURLY@53..54 "{"
-            WHITESPACE@54..55 " "
-            EXPR_STMT@55..61
-              CALL_EXPR@55..60
-                PATH_EXPR@55..58
-                  PATH@55..58
-                    PATH_SEGMENT@55..58
-                      NAME_REF@55..58
-                        IDENT@55..58 "foo"
-                ARG_LIST@58..60
-                  L_PAREN@58..59 "("
-                  R_PAREN@59..60 ")"
-              SEMICOLON@60..61 ";"
-            WHITESPACE@61..62 " "
-            CALL_EXPR@62..67
-              PATH_EXPR@62..65
-                PATH@62..65
-                  PATH_SEGMENT@62..65
-                    NAME_REF@62..65
-                      IDENT@62..65 "bar"
-              ARG_LIST@65..67
-                L_PAREN@65..66 "("
-                R_PAREN@66..67 ")"
-            WHITESPACE@67..68 " "
-            R_CURLY@68..69 "}"
-        WHITESPACE@69..70 " "
-        EQ@70..71 "="
-        WHITESPACE@71..72 " "
-        TUPLE_EXPR@72..74
-          L_PAREN@72..73 "("
-          R_PAREN@73..74 ")"
-        SEMICOLON@74..75 ";"
-      WHITESPACE@75..76 "\n"
-      R_CURLY@76..77 "}"
+      STMT_LIST@10..77
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        LET_STMT@16..38
+          LET_KW@16..19 "let"
+          WHITESPACE@19..20 " "
+          CONST_BLOCK_PAT@20..32
+            CONST_KW@20..25 "const"
+            WHITESPACE@25..26 " "
+            BLOCK_EXPR@26..32
+              STMT_LIST@26..32
+                L_CURLY@26..27 "{"
+                WHITESPACE@27..28 " "
+                LITERAL@28..30
+                  INT_NUMBER@28..30 "15"
+                WHITESPACE@30..31 " "
+                R_CURLY@31..32 "}"
+          WHITESPACE@32..33 " "
+          EQ@33..34 "="
+          WHITESPACE@34..35 " "
+          TUPLE_EXPR@35..37
+            L_PAREN@35..36 "("
+            R_PAREN@36..37 ")"
+          SEMICOLON@37..38 ";"
+        WHITESPACE@38..43 "\n    "
+        LET_STMT@43..75
+          LET_KW@43..46 "let"
+          WHITESPACE@46..47 " "
+          CONST_BLOCK_PAT@47..69
+            CONST_KW@47..52 "const"
+            WHITESPACE@52..53 " "
+            BLOCK_EXPR@53..69
+              STMT_LIST@53..69
+                L_CURLY@53..54 "{"
+                WHITESPACE@54..55 " "
+                EXPR_STMT@55..61
+                  CALL_EXPR@55..60
+                    PATH_EXPR@55..58
+                      PATH@55..58
+                        PATH_SEGMENT@55..58
+                          NAME_REF@55..58
+                            IDENT@55..58 "foo"
+                    ARG_LIST@58..60
+                      L_PAREN@58..59 "("
+                      R_PAREN@59..60 ")"
+                  SEMICOLON@60..61 ";"
+                WHITESPACE@61..62 " "
+                CALL_EXPR@62..67
+                  PATH_EXPR@62..65
+                    PATH@62..65
+                      PATH_SEGMENT@62..65
+                        NAME_REF@62..65
+                          IDENT@62..65 "bar"
+                  ARG_LIST@65..67
+                    L_PAREN@65..66 "("
+                    R_PAREN@66..67 ")"
+                WHITESPACE@67..68 " "
+                R_CURLY@68..69 "}"
+          WHITESPACE@69..70 " "
+          EQ@70..71 "="
+          WHITESPACE@71..72 " "
+          TUPLE_EXPR@72..74
+            L_PAREN@72..73 "("
+            R_PAREN@73..74 ")"
+          SEMICOLON@74..75 ";"
+        WHITESPACE@75..76 "\n"
+        R_CURLY@76..77 "}"
   WHITESPACE@77..78 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0156_fn_def_param.rast b/crates/syntax/test_data/parser/inline/ok/0156_fn_def_param.rast
index 508b4aca7d2..241ae090a77 100644
--- a/crates/syntax/test_data/parser/inline/ok/0156_fn_def_param.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0156_fn_def_param.rast
@@ -38,6 +38,7 @@ SOURCE_FILE@0..30
       R_PAREN@25..26 ")"
     WHITESPACE@26..27 " "
     BLOCK_EXPR@27..29
-      L_CURLY@27..28 "{"
-      R_CURLY@28..29 "}"
+      STMT_LIST@27..29
+        L_CURLY@27..28 "{"
+        R_CURLY@28..29 "}"
   WHITESPACE@29..30 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0156_or_pattern.rast b/crates/syntax/test_data/parser/inline/ok/0156_or_pattern.rast
index 41119dbc16d..e41bf541108 100644
--- a/crates/syntax/test_data/parser/inline/ok/0156_or_pattern.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0156_or_pattern.rast
@@ -9,103 +9,104 @@ SOURCE_FILE@0..130
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..129
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      MATCH_EXPR@16..127
-        MATCH_KW@16..21 "match"
-        WHITESPACE@21..22 " "
-        TUPLE_EXPR@22..24
-          L_PAREN@22..23 "("
-          R_PAREN@23..24 ")"
-        WHITESPACE@24..25 " "
-        MATCH_ARM_LIST@25..127
-          L_CURLY@25..26 "{"
-          WHITESPACE@26..35 "\n        "
-          MATCH_ARM@35..49
-            PAREN_PAT@35..42
-              L_PAREN@35..36 "("
-              OR_PAT@36..41
-                WILDCARD_PAT@36..37
-                  UNDERSCORE@36..37 "_"
-                WHITESPACE@37..38 " "
-                PIPE@38..39 "|"
-                WHITESPACE@39..40 " "
-                WILDCARD_PAT@40..41
-                  UNDERSCORE@40..41 "_"
-              R_PAREN@41..42 ")"
-            WHITESPACE@42..43 " "
-            FAT_ARROW@43..45 "=>"
-            WHITESPACE@45..46 " "
-            TUPLE_EXPR@46..48
-              L_PAREN@46..47 "("
-              R_PAREN@47..48 ")"
-            COMMA@48..49 ","
-          WHITESPACE@49..58 "\n        "
-          MATCH_ARM@58..73
-            REF_PAT@58..66
-              AMP@58..59 "&"
-              PAREN_PAT@59..66
-                L_PAREN@59..60 "("
-                OR_PAT@60..65
-                  WILDCARD_PAT@60..61
-                    UNDERSCORE@60..61 "_"
-                  WHITESPACE@61..62 " "
-                  PIPE@62..63 "|"
-                  WHITESPACE@63..64 " "
-                  WILDCARD_PAT@64..65
-                    UNDERSCORE@64..65 "_"
-                R_PAREN@65..66 ")"
-            WHITESPACE@66..67 " "
-            FAT_ARROW@67..69 "=>"
-            WHITESPACE@69..70 " "
-            TUPLE_EXPR@70..72
-              L_PAREN@70..71 "("
-              R_PAREN@71..72 ")"
-            COMMA@72..73 ","
-          WHITESPACE@73..82 "\n        "
-          MATCH_ARM@82..97
-            TUPLE_PAT@82..90
-              L_PAREN@82..83 "("
-              OR_PAT@83..88
-                WILDCARD_PAT@83..84
-                  UNDERSCORE@83..84 "_"
-                WHITESPACE@84..85 " "
-                PIPE@85..86 "|"
-                WHITESPACE@86..87 " "
-                WILDCARD_PAT@87..88
-                  UNDERSCORE@87..88 "_"
-              COMMA@88..89 ","
-              R_PAREN@89..90 ")"
-            WHITESPACE@90..91 " "
-            FAT_ARROW@91..93 "=>"
-            WHITESPACE@93..94 " "
-            TUPLE_EXPR@94..96
-              L_PAREN@94..95 "("
-              R_PAREN@95..96 ")"
-            COMMA@96..97 ","
-          WHITESPACE@97..106 "\n        "
-          MATCH_ARM@106..121
-            SLICE_PAT@106..114
-              L_BRACK@106..107 "["
-              OR_PAT@107..112
-                WILDCARD_PAT@107..108
-                  UNDERSCORE@107..108 "_"
-                WHITESPACE@108..109 " "
-                PIPE@109..110 "|"
-                WHITESPACE@110..111 " "
-                WILDCARD_PAT@111..112
-                  UNDERSCORE@111..112 "_"
-              COMMA@112..113 ","
-              R_BRACK@113..114 "]"
-            WHITESPACE@114..115 " "
-            FAT_ARROW@115..117 "=>"
-            WHITESPACE@117..118 " "
-            TUPLE_EXPR@118..120
-              L_PAREN@118..119 "("
-              R_PAREN@119..120 ")"
-            COMMA@120..121 ","
-          WHITESPACE@121..126 "\n    "
-          R_CURLY@126..127 "}"
-      WHITESPACE@127..128 "\n"
-      R_CURLY@128..129 "}"
+      STMT_LIST@10..129
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        MATCH_EXPR@16..127
+          MATCH_KW@16..21 "match"
+          WHITESPACE@21..22 " "
+          TUPLE_EXPR@22..24
+            L_PAREN@22..23 "("
+            R_PAREN@23..24 ")"
+          WHITESPACE@24..25 " "
+          MATCH_ARM_LIST@25..127
+            L_CURLY@25..26 "{"
+            WHITESPACE@26..35 "\n        "
+            MATCH_ARM@35..49
+              PAREN_PAT@35..42
+                L_PAREN@35..36 "("
+                OR_PAT@36..41
+                  WILDCARD_PAT@36..37
+                    UNDERSCORE@36..37 "_"
+                  WHITESPACE@37..38 " "
+                  PIPE@38..39 "|"
+                  WHITESPACE@39..40 " "
+                  WILDCARD_PAT@40..41
+                    UNDERSCORE@40..41 "_"
+                R_PAREN@41..42 ")"
+              WHITESPACE@42..43 " "
+              FAT_ARROW@43..45 "=>"
+              WHITESPACE@45..46 " "
+              TUPLE_EXPR@46..48
+                L_PAREN@46..47 "("
+                R_PAREN@47..48 ")"
+              COMMA@48..49 ","
+            WHITESPACE@49..58 "\n        "
+            MATCH_ARM@58..73
+              REF_PAT@58..66
+                AMP@58..59 "&"
+                PAREN_PAT@59..66
+                  L_PAREN@59..60 "("
+                  OR_PAT@60..65
+                    WILDCARD_PAT@60..61
+                      UNDERSCORE@60..61 "_"
+                    WHITESPACE@61..62 " "
+                    PIPE@62..63 "|"
+                    WHITESPACE@63..64 " "
+                    WILDCARD_PAT@64..65
+                      UNDERSCORE@64..65 "_"
+                  R_PAREN@65..66 ")"
+              WHITESPACE@66..67 " "
+              FAT_ARROW@67..69 "=>"
+              WHITESPACE@69..70 " "
+              TUPLE_EXPR@70..72
+                L_PAREN@70..71 "("
+                R_PAREN@71..72 ")"
+              COMMA@72..73 ","
+            WHITESPACE@73..82 "\n        "
+            MATCH_ARM@82..97
+              TUPLE_PAT@82..90
+                L_PAREN@82..83 "("
+                OR_PAT@83..88
+                  WILDCARD_PAT@83..84
+                    UNDERSCORE@83..84 "_"
+                  WHITESPACE@84..85 " "
+                  PIPE@85..86 "|"
+                  WHITESPACE@86..87 " "
+                  WILDCARD_PAT@87..88
+                    UNDERSCORE@87..88 "_"
+                COMMA@88..89 ","
+                R_PAREN@89..90 ")"
+              WHITESPACE@90..91 " "
+              FAT_ARROW@91..93 "=>"
+              WHITESPACE@93..94 " "
+              TUPLE_EXPR@94..96
+                L_PAREN@94..95 "("
+                R_PAREN@95..96 ")"
+              COMMA@96..97 ","
+            WHITESPACE@97..106 "\n        "
+            MATCH_ARM@106..121
+              SLICE_PAT@106..114
+                L_BRACK@106..107 "["
+                OR_PAT@107..112
+                  WILDCARD_PAT@107..108
+                    UNDERSCORE@107..108 "_"
+                  WHITESPACE@108..109 " "
+                  PIPE@109..110 "|"
+                  WHITESPACE@110..111 " "
+                  WILDCARD_PAT@111..112
+                    UNDERSCORE@111..112 "_"
+                COMMA@112..113 ","
+                R_BRACK@113..114 "]"
+              WHITESPACE@114..115 " "
+              FAT_ARROW@115..117 "=>"
+              WHITESPACE@117..118 " "
+              TUPLE_EXPR@118..120
+                L_PAREN@118..119 "("
+                R_PAREN@119..120 ")"
+              COMMA@120..121 ","
+            WHITESPACE@121..126 "\n    "
+            R_CURLY@126..127 "}"
+        WHITESPACE@127..128 "\n"
+        R_CURLY@128..129 "}"
   WHITESPACE@129..130 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0157_const_block.rast b/crates/syntax/test_data/parser/inline/ok/0157_const_block.rast
index d5d2c8fe306..82e06d3b301 100644
--- a/crates/syntax/test_data/parser/inline/ok/0157_const_block.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0157_const_block.rast
@@ -9,15 +9,16 @@ SOURCE_FILE@0..21
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..20
-      L_CURLY@7..8 "{"
-      WHITESPACE@8..9 " "
-      EFFECT_EXPR@9..18
-        CONST_KW@9..14 "const"
-        WHITESPACE@14..15 " "
-        BLOCK_EXPR@15..18
-          L_CURLY@15..16 "{"
-          WHITESPACE@16..17 " "
-          R_CURLY@17..18 "}"
-      WHITESPACE@18..19 " "
-      R_CURLY@19..20 "}"
+      STMT_LIST@7..20
+        L_CURLY@7..8 "{"
+        WHITESPACE@8..9 " "
+        BLOCK_EXPR@9..18
+          CONST_KW@9..14 "const"
+          WHITESPACE@14..15 " "
+          STMT_LIST@15..18
+            L_CURLY@15..16 "{"
+            WHITESPACE@16..17 " "
+            R_CURLY@17..18 "}"
+        WHITESPACE@18..19 " "
+        R_CURLY@19..20 "}"
   WHITESPACE@20..21 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0158_binop_resets_statementness.rast b/crates/syntax/test_data/parser/inline/ok/0158_binop_resets_statementness.rast
index 7473f4836ed..da705ad9c14 100644
--- a/crates/syntax/test_data/parser/inline/ok/0158_binop_resets_statementness.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0158_binop_resets_statementness.rast
@@ -9,28 +9,30 @@ SOURCE_FILE@0..22
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..21
-      L_CURLY@7..8 "{"
-      WHITESPACE@8..9 " "
-      EXPR_STMT@9..19
-        BIN_EXPR@9..18
-          PATH_EXPR@9..10
-            PATH@9..10
-              PATH_SEGMENT@9..10
-                NAME_REF@9..10
-                  IDENT@9..10 "v"
-          WHITESPACE@10..11 " "
-          EQ@11..12 "="
-          WHITESPACE@12..13 " "
-          BIN_EXPR@13..18
-            BLOCK_EXPR@13..16
-              L_CURLY@13..14 "{"
-              LITERAL@14..15
-                INT_NUMBER@14..15 "1"
-              R_CURLY@15..16 "}"
-            AMP@16..17 "&"
-            LITERAL@17..18
-              INT_NUMBER@17..18 "2"
-        SEMICOLON@18..19 ";"
-      WHITESPACE@19..20 " "
-      R_CURLY@20..21 "}"
+      STMT_LIST@7..21
+        L_CURLY@7..8 "{"
+        WHITESPACE@8..9 " "
+        EXPR_STMT@9..19
+          BIN_EXPR@9..18
+            PATH_EXPR@9..10
+              PATH@9..10
+                PATH_SEGMENT@9..10
+                  NAME_REF@9..10
+                    IDENT@9..10 "v"
+            WHITESPACE@10..11 " "
+            EQ@11..12 "="
+            WHITESPACE@12..13 " "
+            BIN_EXPR@13..18
+              BLOCK_EXPR@13..16
+                STMT_LIST@13..16
+                  L_CURLY@13..14 "{"
+                  LITERAL@14..15
+                    INT_NUMBER@14..15 "1"
+                  R_CURLY@15..16 "}"
+              AMP@16..17 "&"
+              LITERAL@17..18
+                INT_NUMBER@17..18 "2"
+          SEMICOLON@18..19 ";"
+        WHITESPACE@19..20 " "
+        R_CURLY@20..21 "}"
   WHITESPACE@21..22 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0158_lambda_ret_block.rast b/crates/syntax/test_data/parser/inline/ok/0158_lambda_ret_block.rast
index aa4099a9293..3272b0b9da4 100644
--- a/crates/syntax/test_data/parser/inline/ok/0158_lambda_ret_block.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0158_lambda_ret_block.rast
@@ -9,35 +9,37 @@ SOURCE_FILE@0..34
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..33
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..12 " "
-      EXPR_STMT@12..31
-        CALL_EXPR@12..30
-          CLOSURE_EXPR@12..28
-            PARAM_LIST@12..14
-              PIPE@12..13 "|"
-              PIPE@13..14 "|"
-            WHITESPACE@14..15 " "
-            RET_TYPE@15..21
-              THIN_ARROW@15..17 "->"
-              WHITESPACE@17..18 " "
-              PATH_TYPE@18..21
-                PATH@18..21
-                  PATH_SEGMENT@18..21
-                    NAME_REF@18..21
-                      IDENT@18..21 "i32"
-            WHITESPACE@21..22 " "
-            BLOCK_EXPR@22..28
-              L_CURLY@22..23 "{"
-              WHITESPACE@23..24 " "
-              LITERAL@24..26
-                INT_NUMBER@24..26 "92"
-              WHITESPACE@26..27 " "
-              R_CURLY@27..28 "}"
-          ARG_LIST@28..30
-            L_PAREN@28..29 "("
-            R_PAREN@29..30 ")"
-        SEMICOLON@30..31 ";"
-      WHITESPACE@31..32 " "
-      R_CURLY@32..33 "}"
+      STMT_LIST@10..33
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..12 " "
+        EXPR_STMT@12..31
+          CALL_EXPR@12..30
+            CLOSURE_EXPR@12..28
+              PARAM_LIST@12..14
+                PIPE@12..13 "|"
+                PIPE@13..14 "|"
+              WHITESPACE@14..15 " "
+              RET_TYPE@15..21
+                THIN_ARROW@15..17 "->"
+                WHITESPACE@17..18 " "
+                PATH_TYPE@18..21
+                  PATH@18..21
+                    PATH_SEGMENT@18..21
+                      NAME_REF@18..21
+                        IDENT@18..21 "i32"
+              WHITESPACE@21..22 " "
+              BLOCK_EXPR@22..28
+                STMT_LIST@22..28
+                  L_CURLY@22..23 "{"
+                  WHITESPACE@23..24 " "
+                  LITERAL@24..26
+                    INT_NUMBER@24..26 "92"
+                  WHITESPACE@26..27 " "
+                  R_CURLY@27..28 "}"
+            ARG_LIST@28..30
+              L_PAREN@28..29 "("
+              R_PAREN@29..30 ")"
+          SEMICOLON@30..31 ";"
+        WHITESPACE@31..32 " "
+        R_CURLY@32..33 "}"
   WHITESPACE@33..34 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0159_try_macro_fallback.rast b/crates/syntax/test_data/parser/inline/ok/0159_try_macro_fallback.rast
index fb46d4ce401..25665dfd8d3 100644
--- a/crates/syntax/test_data/parser/inline/ok/0159_try_macro_fallback.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0159_try_macro_fallback.rast
@@ -9,26 +9,27 @@ SOURCE_FILE@0..27
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..26
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..11 " "
-      EXPR_STMT@11..24
-        MACRO_CALL@11..23
-          PATH@11..14
-            PATH_SEGMENT@11..14
-              NAME_REF@11..14
-                IDENT@11..14 "try"
-          BANG@14..15 "!"
-          TOKEN_TREE@15..23
-            L_PAREN@15..16 "("
-            IDENT@16..18 "Ok"
-            TOKEN_TREE@18..22
-              L_PAREN@18..19 "("
-              TOKEN_TREE@19..21
-                L_PAREN@19..20 "("
-                R_PAREN@20..21 ")"
-              R_PAREN@21..22 ")"
-            R_PAREN@22..23 ")"
-        SEMICOLON@23..24 ";"
-      WHITESPACE@24..25 " "
-      R_CURLY@25..26 "}"
+      STMT_LIST@9..26
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..11 " "
+        EXPR_STMT@11..24
+          MACRO_CALL@11..23
+            PATH@11..14
+              PATH_SEGMENT@11..14
+                NAME_REF@11..14
+                  IDENT@11..14 "try"
+            BANG@14..15 "!"
+            TOKEN_TREE@15..23
+              L_PAREN@15..16 "("
+              IDENT@16..18 "Ok"
+              TOKEN_TREE@18..22
+                L_PAREN@18..19 "("
+                TOKEN_TREE@19..21
+                  L_PAREN@19..20 "("
+                  R_PAREN@20..21 ")"
+                R_PAREN@21..22 ")"
+              R_PAREN@22..23 ")"
+          SEMICOLON@23..24 ";"
+        WHITESPACE@24..25 " "
+        R_CURLY@25..26 "}"
   WHITESPACE@26..27 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0159_yield_expr.rast b/crates/syntax/test_data/parser/inline/ok/0159_yield_expr.rast
index 05fc90743e9..bdc880972be 100644
--- a/crates/syntax/test_data/parser/inline/ok/0159_yield_expr.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0159_yield_expr.rast
@@ -9,20 +9,21 @@ SOURCE_FILE@0..37
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..36
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..21
-        YIELD_EXPR@15..20
-          YIELD_KW@15..20 "yield"
-        SEMICOLON@20..21 ";"
-      WHITESPACE@21..26 "\n    "
-      EXPR_STMT@26..34
-        YIELD_EXPR@26..33
-          YIELD_KW@26..31 "yield"
-          WHITESPACE@31..32 " "
-          LITERAL@32..33
-            INT_NUMBER@32..33 "1"
-        SEMICOLON@33..34 ";"
-      WHITESPACE@34..35 "\n"
-      R_CURLY@35..36 "}"
+      STMT_LIST@9..36
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..21
+          YIELD_EXPR@15..20
+            YIELD_KW@15..20 "yield"
+          SEMICOLON@20..21 ";"
+        WHITESPACE@21..26 "\n    "
+        EXPR_STMT@26..34
+          YIELD_EXPR@26..33
+            YIELD_KW@26..31 "yield"
+            WHITESPACE@31..32 " "
+            LITERAL@32..33
+              INT_NUMBER@32..33 "1"
+          SEMICOLON@33..34 ";"
+        WHITESPACE@34..35 "\n"
+        R_CURLY@35..36 "}"
   WHITESPACE@36..37 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0161_labeled_block.rast b/crates/syntax/test_data/parser/inline/ok/0161_labeled_block.rast
index 47e8859ed07..b5f9d22951a 100644
--- a/crates/syntax/test_data/parser/inline/ok/0161_labeled_block.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0161_labeled_block.rast
@@ -9,19 +9,20 @@ SOURCE_FILE@0..23
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..22
-      L_CURLY@7..8 "{"
-      WHITESPACE@8..9 " "
-      EXPR_STMT@9..20
-        EFFECT_EXPR@9..19
-          LABEL@9..16
-            LIFETIME@9..15
-              LIFETIME_IDENT@9..15 "'label"
-            COLON@15..16 ":"
-          WHITESPACE@16..17 " "
-          BLOCK_EXPR@17..19
-            L_CURLY@17..18 "{"
-            R_CURLY@18..19 "}"
-        SEMICOLON@19..20 ";"
-      WHITESPACE@20..21 " "
-      R_CURLY@21..22 "}"
+      STMT_LIST@7..22
+        L_CURLY@7..8 "{"
+        WHITESPACE@8..9 " "
+        EXPR_STMT@9..20
+          BLOCK_EXPR@9..19
+            LABEL@9..16
+              LIFETIME@9..15
+                LIFETIME_IDENT@9..15 "'label"
+              COLON@15..16 ":"
+            WHITESPACE@16..17 " "
+            STMT_LIST@17..19
+              L_CURLY@17..18 "{"
+              R_CURLY@18..19 "}"
+          SEMICOLON@19..20 ";"
+        WHITESPACE@20..21 " "
+        R_CURLY@21..22 "}"
   WHITESPACE@22..23 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0162_default_async_unsafe_fn.rast b/crates/syntax/test_data/parser/inline/ok/0162_default_async_unsafe_fn.rast
index 61c17333a4c..e3f655b9b0a 100644
--- a/crates/syntax/test_data/parser/inline/ok/0162_default_async_unsafe_fn.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0162_default_async_unsafe_fn.rast
@@ -35,8 +35,9 @@ SOURCE_FILE@0..56
           R_PAREN@49..50 ")"
         WHITESPACE@50..51 " "
         BLOCK_EXPR@51..53
-          L_CURLY@51..52 "{"
-          R_CURLY@52..53 "}"
+          STMT_LIST@51..53
+            L_CURLY@51..52 "{"
+            R_CURLY@52..53 "}"
       WHITESPACE@53..54 "\n"
       R_CURLY@54..55 "}"
   WHITESPACE@55..56 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0162_unsafe_block.rast b/crates/syntax/test_data/parser/inline/ok/0162_unsafe_block.rast
index ca9a1183d6a..6274f78fe84 100644
--- a/crates/syntax/test_data/parser/inline/ok/0162_unsafe_block.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0162_unsafe_block.rast
@@ -9,15 +9,16 @@ SOURCE_FILE@0..22
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..21
-      L_CURLY@7..8 "{"
-      WHITESPACE@8..9 " "
-      EFFECT_EXPR@9..19
-        UNSAFE_KW@9..15 "unsafe"
-        WHITESPACE@15..16 " "
-        BLOCK_EXPR@16..19
-          L_CURLY@16..17 "{"
-          WHITESPACE@17..18 " "
-          R_CURLY@18..19 "}"
-      WHITESPACE@19..20 " "
-      R_CURLY@20..21 "}"
+      STMT_LIST@7..21
+        L_CURLY@7..8 "{"
+        WHITESPACE@8..9 " "
+        BLOCK_EXPR@9..19
+          UNSAFE_KW@9..15 "unsafe"
+          WHITESPACE@15..16 " "
+          STMT_LIST@16..19
+            L_CURLY@16..17 "{"
+            WHITESPACE@17..18 " "
+            R_CURLY@18..19 "}"
+        WHITESPACE@19..20 " "
+        R_CURLY@20..21 "}"
   WHITESPACE@21..22 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0163_default_async_fn.rast b/crates/syntax/test_data/parser/inline/ok/0163_default_async_fn.rast
index 9c43ccea525..9af407cdd65 100644
--- a/crates/syntax/test_data/parser/inline/ok/0163_default_async_fn.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0163_default_async_fn.rast
@@ -33,8 +33,9 @@ SOURCE_FILE@0..49
           R_PAREN@42..43 ")"
         WHITESPACE@43..44 " "
         BLOCK_EXPR@44..46
-          L_CURLY@44..45 "{"
-          R_CURLY@45..46 "}"
+          STMT_LIST@44..46
+            L_CURLY@44..45 "{"
+            R_CURLY@45..46 "}"
       WHITESPACE@46..47 "\n"
       R_CURLY@47..48 "}"
   WHITESPACE@48..49 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0163_default_unsafe_item.rast b/crates/syntax/test_data/parser/inline/ok/0163_default_unsafe_item.rast
index f2e2014605a..ee05ab0fe97 100644
--- a/crates/syntax/test_data/parser/inline/ok/0163_default_unsafe_item.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0163_default_unsafe_item.rast
@@ -37,8 +37,9 @@ SOURCE_FILE@0..65
           R_PAREN@58..59 ")"
         WHITESPACE@59..60 " "
         BLOCK_EXPR@60..62
-          L_CURLY@60..61 "{"
-          R_CURLY@61..62 "}"
+          STMT_LIST@60..62
+            L_CURLY@60..61 "{"
+            R_CURLY@61..62 "}"
       WHITESPACE@62..63 "\n"
       R_CURLY@63..64 "}"
   WHITESPACE@64..65 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0164_type_path_in_pattern.rast b/crates/syntax/test_data/parser/inline/ok/0164_type_path_in_pattern.rast
index f8910677b46..8eb64ccb177 100644
--- a/crates/syntax/test_data/parser/inline/ok/0164_type_path_in_pattern.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0164_type_path_in_pattern.rast
@@ -9,30 +9,31 @@ SOURCE_FILE@0..33
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..32
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..12 " "
-      LET_STMT@12..30
-        LET_KW@12..15 "let"
-        WHITESPACE@15..16 " "
-        PATH_PAT@16..24
-          PATH@16..24
-            PATH@16..19
-              PATH_SEGMENT@16..19
-                L_ANGLE@16..17 "<"
-                INFER_TYPE@17..18
-                  UNDERSCORE@17..18 "_"
-                R_ANGLE@18..19 ">"
-            COLON2@19..21 "::"
-            PATH_SEGMENT@21..24
-              NAME_REF@21..24
-                IDENT@21..24 "Foo"
-        WHITESPACE@24..25 " "
-        EQ@25..26 "="
-        WHITESPACE@26..27 " "
-        TUPLE_EXPR@27..29
-          L_PAREN@27..28 "("
-          R_PAREN@28..29 ")"
-        SEMICOLON@29..30 ";"
-      WHITESPACE@30..31 " "
-      R_CURLY@31..32 "}"
+      STMT_LIST@10..32
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..12 " "
+        LET_STMT@12..30
+          LET_KW@12..15 "let"
+          WHITESPACE@15..16 " "
+          PATH_PAT@16..24
+            PATH@16..24
+              PATH@16..19
+                PATH_SEGMENT@16..19
+                  L_ANGLE@16..17 "<"
+                  INFER_TYPE@17..18
+                    UNDERSCORE@17..18 "_"
+                  R_ANGLE@18..19 ">"
+              COLON2@19..21 "::"
+              PATH_SEGMENT@21..24
+                NAME_REF@21..24
+                  IDENT@21..24 "Foo"
+          WHITESPACE@24..25 " "
+          EQ@25..26 "="
+          WHITESPACE@26..27 " "
+          TUPLE_EXPR@27..29
+            L_PAREN@27..28 "("
+            R_PAREN@28..29 ")"
+          SEMICOLON@29..30 ";"
+        WHITESPACE@30..31 " "
+        R_CURLY@31..32 "}"
   WHITESPACE@32..33 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0166_half_open_range_pat.rast b/crates/syntax/test_data/parser/inline/ok/0166_half_open_range_pat.rast
index 67ac6a4633f..f0cc6b3441f 100644
--- a/crates/syntax/test_data/parser/inline/ok/0166_half_open_range_pat.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0166_half_open_range_pat.rast
@@ -9,23 +9,24 @@ SOURCE_FILE@0..28
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..27
-      L_CURLY@7..8 "{"
-      WHITESPACE@8..9 " "
-      LET_STMT@9..25
-        LET_KW@9..12 "let"
-        WHITESPACE@12..13 " "
-        RANGE_PAT@13..17
-          LITERAL_PAT@13..14
-            LITERAL@13..14
-              INT_NUMBER@13..14 "0"
-          WHITESPACE@14..15 " "
-          DOT2@15..17 ".."
-        WHITESPACE@17..18 " "
-        EQ@18..19 "="
-        WHITESPACE@19..20 " "
-        LITERAL@20..24
-          INT_NUMBER@20..24 "1u32"
-        SEMICOLON@24..25 ";"
-      WHITESPACE@25..26 " "
-      R_CURLY@26..27 "}"
+      STMT_LIST@7..27
+        L_CURLY@7..8 "{"
+        WHITESPACE@8..9 " "
+        LET_STMT@9..25
+          LET_KW@9..12 "let"
+          WHITESPACE@12..13 " "
+          RANGE_PAT@13..17
+            LITERAL_PAT@13..14
+              LITERAL@13..14
+                INT_NUMBER@13..14 "0"
+            WHITESPACE@14..15 " "
+            DOT2@15..17 ".."
+          WHITESPACE@17..18 " "
+          EQ@18..19 "="
+          WHITESPACE@19..20 " "
+          LITERAL@20..24
+            INT_NUMBER@20..24 "1u32"
+          SEMICOLON@24..25 ";"
+        WHITESPACE@25..26 " "
+        R_CURLY@26..27 "}"
   WHITESPACE@27..28 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0181_generic_param_attribute.rast b/crates/syntax/test_data/parser/inline/ok/0181_generic_param_attribute.rast
index 475c2367663..4564f43e0fa 100644
--- a/crates/syntax/test_data/parser/inline/ok/0181_generic_param_attribute.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0181_generic_param_attribute.rast
@@ -40,6 +40,7 @@ SOURCE_FILE@0..40
       R_PAREN@35..36 ")"
     WHITESPACE@36..37 " "
     BLOCK_EXPR@37..39
-      L_CURLY@37..38 "{"
-      R_CURLY@38..39 "}"
+      STMT_LIST@37..39
+        L_CURLY@37..38 "{"
+        R_CURLY@38..39 "}"
   WHITESPACE@39..40 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0182_lifetime_param.rast b/crates/syntax/test_data/parser/inline/ok/0182_lifetime_param.rast
index 0eb7361ce42..704c991fe14 100644
--- a/crates/syntax/test_data/parser/inline/ok/0182_lifetime_param.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0182_lifetime_param.rast
@@ -19,6 +19,7 @@ SOURCE_FILE@0..18
       R_PAREN@13..14 ")"
     WHITESPACE@14..15 " "
     BLOCK_EXPR@15..17
-      L_CURLY@15..16 "{"
-      R_CURLY@16..17 "}"
+      STMT_LIST@15..17
+        L_CURLY@15..16 "{"
+        R_CURLY@16..17 "}"
   WHITESPACE@17..18 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0183_const_arg_block.rast b/crates/syntax/test_data/parser/inline/ok/0183_const_arg_block.rast
index 9020d1b8617..6bbb6c40dde 100644
--- a/crates/syntax/test_data/parser/inline/ok/0183_const_arg_block.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0183_const_arg_block.rast
@@ -16,16 +16,17 @@ SOURCE_FILE@0..22
             L_ANGLE@10..11 "<"
             CONST_ARG@11..19
               BLOCK_EXPR@11..19
-                L_CURLY@11..12 "{"
-                BIN_EXPR@12..18
-                  LITERAL@12..14
-                    INT_NUMBER@12..14 "90"
-                  WHITESPACE@14..15 " "
-                  PLUS@15..16 "+"
-                  WHITESPACE@16..17 " "
-                  LITERAL@17..18
-                    INT_NUMBER@17..18 "2"
-                R_CURLY@18..19 "}"
+                STMT_LIST@11..19
+                  L_CURLY@11..12 "{"
+                  BIN_EXPR@12..18
+                    LITERAL@12..14
+                      INT_NUMBER@12..14 "90"
+                    WHITESPACE@14..15 " "
+                    PLUS@15..16 "+"
+                    WHITESPACE@16..17 " "
+                    LITERAL@17..18
+                      INT_NUMBER@17..18 "2"
+                  R_CURLY@18..19 "}"
             R_ANGLE@19..20 ">"
     SEMICOLON@20..21 ";"
   WHITESPACE@21..22 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0183_type_param.rast b/crates/syntax/test_data/parser/inline/ok/0183_type_param.rast
index 9d8ab493e07..450bccff330 100644
--- a/crates/syntax/test_data/parser/inline/ok/0183_type_param.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0183_type_param.rast
@@ -24,6 +24,7 @@ SOURCE_FILE@0..20
       R_PAREN@15..16 ")"
     WHITESPACE@16..17 " "
     BLOCK_EXPR@17..19
-      L_CURLY@17..18 "{"
-      R_CURLY@18..19 "}"
+      STMT_LIST@17..19
+        L_CURLY@17..18 "{"
+        R_CURLY@18..19 "}"
   WHITESPACE@19..20 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0184_generic_param_list.rast b/crates/syntax/test_data/parser/inline/ok/0184_generic_param_list.rast
index 9d8ab493e07..450bccff330 100644
--- a/crates/syntax/test_data/parser/inline/ok/0184_generic_param_list.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0184_generic_param_list.rast
@@ -24,6 +24,7 @@ SOURCE_FILE@0..20
       R_PAREN@15..16 ")"
     WHITESPACE@16..17 " "
     BLOCK_EXPR@17..19
-      L_CURLY@17..18 "{"
-      R_CURLY@18..19 "}"
+      STMT_LIST@17..19
+        L_CURLY@17..18 "{"
+        R_CURLY@18..19 "}"
   WHITESPACE@19..20 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0193_let_stmt_init.rast b/crates/syntax/test_data/parser/inline/ok/0193_let_stmt_init.rast
index cc5d72ff74c..dcb7b1c4593 100644
--- a/crates/syntax/test_data/parser/inline/ok/0193_let_stmt_init.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0193_let_stmt_init.rast
@@ -9,20 +9,21 @@ SOURCE_FILE@0..23
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..22
-      L_CURLY@7..8 "{"
-      WHITESPACE@8..9 " "
-      LET_STMT@9..20
-        LET_KW@9..12 "let"
-        WHITESPACE@12..13 " "
-        IDENT_PAT@13..14
-          NAME@13..14
-            IDENT@13..14 "x"
-        WHITESPACE@14..15 " "
-        EQ@15..16 "="
-        WHITESPACE@16..17 " "
-        LITERAL@17..19
-          INT_NUMBER@17..19 "92"
-        SEMICOLON@19..20 ";"
-      WHITESPACE@20..21 " "
-      R_CURLY@21..22 "}"
+      STMT_LIST@7..22
+        L_CURLY@7..8 "{"
+        WHITESPACE@8..9 " "
+        LET_STMT@9..20
+          LET_KW@9..12 "let"
+          WHITESPACE@12..13 " "
+          IDENT_PAT@13..14
+            NAME@13..14
+              IDENT@13..14 "x"
+          WHITESPACE@14..15 " "
+          EQ@15..16 "="
+          WHITESPACE@16..17 " "
+          LITERAL@17..19
+            INT_NUMBER@17..19 "92"
+          SEMICOLON@19..20 ";"
+        WHITESPACE@20..21 " "
+        R_CURLY@21..22 "}"
   WHITESPACE@22..23 "\n"
diff --git a/crates/syntax/test_data/parser/inline/ok/0194_let_stmt_ascription.rast b/crates/syntax/test_data/parser/inline/ok/0194_let_stmt_ascription.rast
index 41acb0dd983..679b0c4ce94 100644
--- a/crates/syntax/test_data/parser/inline/ok/0194_let_stmt_ascription.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0194_let_stmt_ascription.rast
@@ -9,22 +9,23 @@ SOURCE_FILE@0..23
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..22
-      L_CURLY@7..8 "{"
-      WHITESPACE@8..9 " "
-      LET_STMT@9..20
-        LET_KW@9..12 "let"
-        WHITESPACE@12..13 " "
-        IDENT_PAT@13..14
-          NAME@13..14
-            IDENT@13..14 "x"
-        COLON@14..15 ":"
-        WHITESPACE@15..16 " "
-        PATH_TYPE@16..19
-          PATH@16..19
-            PATH_SEGMENT@16..19
-              NAME_REF@16..19
-                IDENT@16..19 "i32"
-        SEMICOLON@19..20 ";"
-      WHITESPACE@20..21 " "
-      R_CURLY@21..22 "}"
+      STMT_LIST@7..22
+        L_CURLY@7..8 "{"
+        WHITESPACE@8..9 " "
+        LET_STMT@9..20
+          LET_KW@9..12 "let"
+          WHITESPACE@12..13 " "
+          IDENT_PAT@13..14
+            NAME@13..14
+              IDENT@13..14 "x"
+          COLON@14..15 ":"
+          WHITESPACE@15..16 " "
+          PATH_TYPE@16..19
+            PATH@16..19
+              PATH_SEGMENT@16..19
+                NAME_REF@16..19
+                  IDENT@16..19 "i32"
+          SEMICOLON@19..20 ";"
+        WHITESPACE@20..21 " "
+        R_CURLY@21..22 "}"
   WHITESPACE@22..23 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0005_fn_item.rast b/crates/syntax/test_data/parser/ok/0005_fn_item.rast
index a7a2b11a723..845f9a6f357 100644
--- a/crates/syntax/test_data/parser/ok/0005_fn_item.rast
+++ b/crates/syntax/test_data/parser/ok/0005_fn_item.rast
@@ -9,7 +9,8 @@ SOURCE_FILE@0..13
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..12
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..11 "\n"
-      R_CURLY@11..12 "}"
+      STMT_LIST@9..12
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..11 "\n"
+        R_CURLY@11..12 "}"
   WHITESPACE@12..13 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0008_mod_item.rast b/crates/syntax/test_data/parser/ok/0008_mod_item.rast
index 712e1534625..e864641834f 100644
--- a/crates/syntax/test_data/parser/ok/0008_mod_item.rast
+++ b/crates/syntax/test_data/parser/ok/0008_mod_item.rast
@@ -18,9 +18,10 @@ SOURCE_FILE@0..100
           R_PAREN@19..20 ")"
         WHITESPACE@20..21 " "
         BLOCK_EXPR@21..28
-          L_CURLY@21..22 "{"
-          WHITESPACE@22..27 "\n    "
-          R_CURLY@27..28 "}"
+          STMT_LIST@21..28
+            L_CURLY@21..22 "{"
+            WHITESPACE@22..27 "\n    "
+            R_CURLY@27..28 "}"
       WHITESPACE@28..33 "\n    "
       STRUCT@33..44
         STRUCT_KW@33..39 "struct"
diff --git a/crates/syntax/test_data/parser/ok/0011_outer_attribute.rast b/crates/syntax/test_data/parser/ok/0011_outer_attribute.rast
index 31f76589dea..bb35b40f4e7 100644
--- a/crates/syntax/test_data/parser/ok/0011_outer_attribute.rast
+++ b/crates/syntax/test_data/parser/ok/0011_outer_attribute.rast
@@ -33,8 +33,9 @@ SOURCE_FILE@0..60
       R_PAREN@30..31 ")"
     WHITESPACE@31..32 " "
     BLOCK_EXPR@32..34
-      L_CURLY@32..33 "{"
-      R_CURLY@33..34 "}"
+      STMT_LIST@32..34
+        L_CURLY@32..33 "{"
+        R_CURLY@33..34 "}"
   WHITESPACE@34..36 "\n\n"
   MODULE@36..59
     ATTR@36..52
diff --git a/crates/syntax/test_data/parser/ok/0012_visibility.rast b/crates/syntax/test_data/parser/ok/0012_visibility.rast
index 79dc9001a21..e046b0bb1c8 100644
--- a/crates/syntax/test_data/parser/ok/0012_visibility.rast
+++ b/crates/syntax/test_data/parser/ok/0012_visibility.rast
@@ -9,8 +9,9 @@ SOURCE_FILE@0..122
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..9
-      L_CURLY@7..8 "{"
-      R_CURLY@8..9 "}"
+      STMT_LIST@7..9
+        L_CURLY@7..8 "{"
+        R_CURLY@8..9 "}"
   WHITESPACE@9..10 "\n"
   FN@10..23
     VISIBILITY@10..13
@@ -25,8 +26,9 @@ SOURCE_FILE@0..122
       R_PAREN@19..20 ")"
     WHITESPACE@20..21 " "
     BLOCK_EXPR@21..23
-      L_CURLY@21..22 "{"
-      R_CURLY@22..23 "}"
+      STMT_LIST@21..23
+        L_CURLY@21..22 "{"
+        R_CURLY@22..23 "}"
   WHITESPACE@23..24 "\n"
   MACRO_DEF@24..47
     VISIBILITY@24..27
@@ -67,8 +69,9 @@ SOURCE_FILE@0..122
       R_PAREN@64..65 ")"
     WHITESPACE@65..66 " "
     BLOCK_EXPR@66..68
-      L_CURLY@66..67 "{"
-      R_CURLY@67..68 "}"
+      STMT_LIST@66..68
+        L_CURLY@66..67 "{"
+        R_CURLY@67..68 "}"
   WHITESPACE@68..69 "\n"
   FN@69..89
     VISIBILITY@69..79
@@ -89,8 +92,9 @@ SOURCE_FILE@0..122
       R_PAREN@85..86 ")"
     WHITESPACE@86..87 " "
     BLOCK_EXPR@87..89
-      L_CURLY@87..88 "{"
-      R_CURLY@88..89 "}"
+      STMT_LIST@87..89
+        L_CURLY@87..88 "{"
+        R_CURLY@88..89 "}"
   WHITESPACE@89..90 "\n"
   FN@90..121
     VISIBILITY@90..111
@@ -123,6 +127,7 @@ SOURCE_FILE@0..122
       R_PAREN@117..118 ")"
     WHITESPACE@118..119 " "
     BLOCK_EXPR@119..121
-      L_CURLY@119..120 "{"
-      R_CURLY@120..121 "}"
+      STMT_LIST@119..121
+        L_CURLY@119..120 "{"
+        R_CURLY@120..121 "}"
   WHITESPACE@121..122 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0017_attr_trailing_comma.rast b/crates/syntax/test_data/parser/ok/0017_attr_trailing_comma.rast
index 94791f771c8..938a3f17b68 100644
--- a/crates/syntax/test_data/parser/ok/0017_attr_trailing_comma.rast
+++ b/crates/syntax/test_data/parser/ok/0017_attr_trailing_comma.rast
@@ -24,6 +24,7 @@ SOURCE_FILE@0..23
       R_PAREN@18..19 ")"
     WHITESPACE@19..20 " "
     BLOCK_EXPR@20..22
-      L_CURLY@20..21 "{"
-      R_CURLY@21..22 "}"
+      STMT_LIST@20..22
+        L_CURLY@20..21 "{"
+        R_CURLY@21..22 "}"
   WHITESPACE@22..23 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0025_extern_fn_in_block.rast b/crates/syntax/test_data/parser/ok/0025_extern_fn_in_block.rast
index bb6527b484a..21ed8ebfa48 100644
--- a/crates/syntax/test_data/parser/ok/0025_extern_fn_in_block.rast
+++ b/crates/syntax/test_data/parser/ok/0025_extern_fn_in_block.rast
@@ -9,23 +9,25 @@ SOURCE_FILE@0..35
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..34
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      FN@16..32
-        ABI@16..22
-          EXTERN_KW@16..22 "extern"
-        WHITESPACE@22..23 " "
-        FN_KW@23..25 "fn"
-        WHITESPACE@25..26 " "
-        NAME@26..27
-          IDENT@26..27 "f"
-        PARAM_LIST@27..29
-          L_PAREN@27..28 "("
-          R_PAREN@28..29 ")"
-        WHITESPACE@29..30 " "
-        BLOCK_EXPR@30..32
-          L_CURLY@30..31 "{"
-          R_CURLY@31..32 "}"
-      WHITESPACE@32..33 "\n"
-      R_CURLY@33..34 "}"
+      STMT_LIST@10..34
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        FN@16..32
+          ABI@16..22
+            EXTERN_KW@16..22 "extern"
+          WHITESPACE@22..23 " "
+          FN_KW@23..25 "fn"
+          WHITESPACE@25..26 " "
+          NAME@26..27
+            IDENT@26..27 "f"
+          PARAM_LIST@27..29
+            L_PAREN@27..28 "("
+            R_PAREN@28..29 ")"
+          WHITESPACE@29..30 " "
+          BLOCK_EXPR@30..32
+            STMT_LIST@30..32
+              L_CURLY@30..31 "{"
+              R_CURLY@31..32 "}"
+        WHITESPACE@32..33 "\n"
+        R_CURLY@33..34 "}"
   WHITESPACE@34..35 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0026_const_fn_in_block.rast b/crates/syntax/test_data/parser/ok/0026_const_fn_in_block.rast
index 5bcf54deb69..ad4cd31cb65 100644
--- a/crates/syntax/test_data/parser/ok/0026_const_fn_in_block.rast
+++ b/crates/syntax/test_data/parser/ok/0026_const_fn_in_block.rast
@@ -9,22 +9,24 @@ SOURCE_FILE@0..34
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..33
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      FN@16..31
-        CONST_KW@16..21 "const"
-        WHITESPACE@21..22 " "
-        FN_KW@22..24 "fn"
-        WHITESPACE@24..25 " "
-        NAME@25..26
-          IDENT@25..26 "f"
-        PARAM_LIST@26..28
-          L_PAREN@26..27 "("
-          R_PAREN@27..28 ")"
-        WHITESPACE@28..29 " "
-        BLOCK_EXPR@29..31
-          L_CURLY@29..30 "{"
-          R_CURLY@30..31 "}"
-      WHITESPACE@31..32 "\n"
-      R_CURLY@32..33 "}"
+      STMT_LIST@10..33
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        FN@16..31
+          CONST_KW@16..21 "const"
+          WHITESPACE@21..22 " "
+          FN_KW@22..24 "fn"
+          WHITESPACE@24..25 " "
+          NAME@25..26
+            IDENT@25..26 "f"
+          PARAM_LIST@26..28
+            L_PAREN@26..27 "("
+            R_PAREN@27..28 ")"
+          WHITESPACE@28..29 " "
+          BLOCK_EXPR@29..31
+            STMT_LIST@29..31
+              L_CURLY@29..30 "{"
+              R_CURLY@30..31 "}"
+        WHITESPACE@31..32 "\n"
+        R_CURLY@32..33 "}"
   WHITESPACE@33..34 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0027_unsafe_fn_in_block.rast b/crates/syntax/test_data/parser/ok/0027_unsafe_fn_in_block.rast
index a7cc122951f..eb1fa2819c0 100644
--- a/crates/syntax/test_data/parser/ok/0027_unsafe_fn_in_block.rast
+++ b/crates/syntax/test_data/parser/ok/0027_unsafe_fn_in_block.rast
@@ -9,33 +9,35 @@ SOURCE_FILE@0..53
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..52
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      FN@16..32
-        UNSAFE_KW@16..22 "unsafe"
-        WHITESPACE@22..23 " "
-        FN_KW@23..25 "fn"
-        WHITESPACE@25..26 " "
-        NAME@26..27
-          IDENT@26..27 "f"
-        PARAM_LIST@27..29
-          L_PAREN@27..28 "("
-          R_PAREN@28..29 ")"
-        WHITESPACE@29..30 " "
-        BLOCK_EXPR@30..32
-          L_CURLY@30..31 "{"
-          R_CURLY@31..32 "}"
-      WHITESPACE@32..37 "\n    "
-      EFFECT_EXPR@37..50
-        UNSAFE_KW@37..43 "unsafe"
-        WHITESPACE@43..44 " "
-        BLOCK_EXPR@44..50
-          L_CURLY@44..45 "{"
-          WHITESPACE@45..46 " "
-          LITERAL@46..48
-            INT_NUMBER@46..48 "92"
-          WHITESPACE@48..49 " "
-          R_CURLY@49..50 "}"
-      WHITESPACE@50..51 "\n"
-      R_CURLY@51..52 "}"
+      STMT_LIST@10..52
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        FN@16..32
+          UNSAFE_KW@16..22 "unsafe"
+          WHITESPACE@22..23 " "
+          FN_KW@23..25 "fn"
+          WHITESPACE@25..26 " "
+          NAME@26..27
+            IDENT@26..27 "f"
+          PARAM_LIST@27..29
+            L_PAREN@27..28 "("
+            R_PAREN@28..29 ")"
+          WHITESPACE@29..30 " "
+          BLOCK_EXPR@30..32
+            STMT_LIST@30..32
+              L_CURLY@30..31 "{"
+              R_CURLY@31..32 "}"
+        WHITESPACE@32..37 "\n    "
+        BLOCK_EXPR@37..50
+          UNSAFE_KW@37..43 "unsafe"
+          WHITESPACE@43..44 " "
+          STMT_LIST@44..50
+            L_CURLY@44..45 "{"
+            WHITESPACE@45..46 " "
+            LITERAL@46..48
+              INT_NUMBER@46..48 "92"
+            WHITESPACE@48..49 " "
+            R_CURLY@49..50 "}"
+        WHITESPACE@50..51 "\n"
+        R_CURLY@51..52 "}"
   WHITESPACE@52..53 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0028_operator_binding_power.rast b/crates/syntax/test_data/parser/ok/0028_operator_binding_power.rast
index 3271a4695d2..96c75052fa8 100644
--- a/crates/syntax/test_data/parser/ok/0028_operator_binding_power.rast
+++ b/crates/syntax/test_data/parser/ok/0028_operator_binding_power.rast
@@ -9,177 +9,178 @@ SOURCE_FILE@0..248
       R_PAREN@17..18 ")"
     WHITESPACE@18..19 " "
     BLOCK_EXPR@19..247
-      L_CURLY@19..20 "{"
-      WHITESPACE@20..25 "\n    "
-      LET_STMT@25..55
-        LET_KW@25..28 "let"
-        WHITESPACE@28..29 " "
-        IDENT_PAT@29..30
-          NAME@29..30
-            IDENT@29..30 "x"
-        WHITESPACE@30..31 " "
-        EQ@31..32 "="
-        WHITESPACE@32..33 " "
-        BIN_EXPR@33..54
-          BIN_EXPR@33..46
-            LITERAL@33..34
-              INT_NUMBER@33..34 "1"
-            WHITESPACE@34..35 " "
-            PLUS@35..36 "+"
-            WHITESPACE@36..37 " "
-            BIN_EXPR@37..46
-              BIN_EXPR@37..42
-                LITERAL@37..38
-                  INT_NUMBER@37..38 "2"
-                WHITESPACE@38..39 " "
-                STAR@39..40 "*"
-                WHITESPACE@40..41 " "
-                LITERAL@41..42
-                  INT_NUMBER@41..42 "3"
-              WHITESPACE@42..43 " "
-              PERCENT@43..44 "%"
-              WHITESPACE@44..45 " "
-              LITERAL@45..46
-                INT_NUMBER@45..46 "4"
-          WHITESPACE@46..47 " "
-          MINUS@47..48 "-"
-          WHITESPACE@48..49 " "
-          BIN_EXPR@49..54
-            LITERAL@49..50
-              INT_NUMBER@49..50 "5"
-            WHITESPACE@50..51 " "
-            SLASH@51..52 "/"
-            WHITESPACE@52..53 " "
-            LITERAL@53..54
-              INT_NUMBER@53..54 "6"
-        SEMICOLON@54..55 ";"
-      WHITESPACE@55..60 "\n    "
-      EXPR_STMT@60..70
-        BIN_EXPR@60..69
-          LITERAL@60..61
-            INT_NUMBER@60..61 "1"
-          WHITESPACE@61..62 " "
-          PLUS@62..63 "+"
-          WHITESPACE@63..64 " "
-          BIN_EXPR@64..69
-            LITERAL@64..65
-              INT_NUMBER@64..65 "2"
-            WHITESPACE@65..66 " "
-            STAR@66..67 "*"
-            WHITESPACE@67..68 " "
-            LITERAL@68..69
-              INT_NUMBER@68..69 "3"
-        SEMICOLON@69..70 ";"
-      WHITESPACE@70..75 "\n    "
-      EXPR_STMT@75..86
-        BIN_EXPR@75..85
-          LITERAL@75..76
-            INT_NUMBER@75..76 "1"
-          WHITESPACE@76..77 " "
-          SHL@77..79 "<<"
-          WHITESPACE@79..80 " "
-          BIN_EXPR@80..85
-            LITERAL@80..81
-              INT_NUMBER@80..81 "2"
-            WHITESPACE@81..82 " "
-            PLUS@82..83 "+"
-            WHITESPACE@83..84 " "
-            LITERAL@84..85
-              INT_NUMBER@84..85 "3"
-        SEMICOLON@85..86 ";"
-      WHITESPACE@86..91 "\n    "
-      EXPR_STMT@91..102
-        BIN_EXPR@91..101
-          LITERAL@91..92
-            INT_NUMBER@91..92 "1"
-          WHITESPACE@92..93 " "
-          AMP@93..94 "&"
-          WHITESPACE@94..95 " "
-          BIN_EXPR@95..101
-            LITERAL@95..96
-              INT_NUMBER@95..96 "2"
-            WHITESPACE@96..97 " "
-            SHR@97..99 ">>"
-            WHITESPACE@99..100 " "
-            LITERAL@100..101
-              INT_NUMBER@100..101 "3"
-        SEMICOLON@101..102 ";"
-      WHITESPACE@102..107 "\n    "
-      EXPR_STMT@107..117
-        BIN_EXPR@107..116
-          LITERAL@107..108
-            INT_NUMBER@107..108 "1"
-          WHITESPACE@108..109 " "
-          CARET@109..110 "^"
-          WHITESPACE@110..111 " "
-          BIN_EXPR@111..116
-            LITERAL@111..112
-              INT_NUMBER@111..112 "2"
-            WHITESPACE@112..113 " "
-            AMP@113..114 "&"
-            WHITESPACE@114..115 " "
-            LITERAL@115..116
-              INT_NUMBER@115..116 "3"
-        SEMICOLON@116..117 ";"
-      WHITESPACE@117..122 "\n    "
-      EXPR_STMT@122..132
-        BIN_EXPR@122..131
-          LITERAL@122..123
-            INT_NUMBER@122..123 "1"
-          WHITESPACE@123..124 " "
-          PIPE@124..125 "|"
-          WHITESPACE@125..126 " "
-          BIN_EXPR@126..131
-            LITERAL@126..127
-              INT_NUMBER@126..127 "2"
-            WHITESPACE@127..128 " "
-            CARET@128..129 "^"
-            WHITESPACE@129..130 " "
-            LITERAL@130..131
-              INT_NUMBER@130..131 "3"
-        SEMICOLON@131..132 ";"
-      WHITESPACE@132..137 "\n    "
-      EXPR_STMT@137..148
-        BIN_EXPR@137..147
-          LITERAL@137..138
-            INT_NUMBER@137..138 "1"
-          WHITESPACE@138..139 " "
-          EQ2@139..141 "=="
-          WHITESPACE@141..142 " "
-          BIN_EXPR@142..147
-            LITERAL@142..143
-              INT_NUMBER@142..143 "2"
-            WHITESPACE@143..144 " "
-            PIPE@144..145 "|"
-            WHITESPACE@145..146 " "
-            LITERAL@146..147
-              INT_NUMBER@146..147 "3"
-        SEMICOLON@147..148 ";"
-      WHITESPACE@148..153 "\n    "
-      EXPR_STMT@153..165
-        BIN_EXPR@153..164
-          LITERAL@153..154
-            INT_NUMBER@153..154 "1"
-          WHITESPACE@154..155 " "
-          AMP2@155..157 "&&"
-          WHITESPACE@157..158 " "
-          BIN_EXPR@158..164
-            LITERAL@158..159
-              INT_NUMBER@158..159 "2"
-            WHITESPACE@159..160 " "
-            EQ2@160..162 "=="
-            WHITESPACE@162..163 " "
-            LITERAL@163..164
-              INT_NUMBER@163..164 "3"
-        SEMICOLON@164..165 ";"
-      WHITESPACE@165..170 "\n    "
-      COMMENT@170..184 "//1 || 2 && 2;"
-      WHITESPACE@184..189 "\n    "
-      COMMENT@189..203 "//1 .. 2 || 3;"
-      WHITESPACE@203..208 "\n    "
-      COMMENT@208..221 "//1 = 2 .. 3;"
-      WHITESPACE@221..226 "\n    "
-      COMMENT@226..245 "//---&*1 - --2 * 9;"
-      WHITESPACE@245..246 "\n"
-      R_CURLY@246..247 "}"
+      STMT_LIST@19..247
+        L_CURLY@19..20 "{"
+        WHITESPACE@20..25 "\n    "
+        LET_STMT@25..55
+          LET_KW@25..28 "let"
+          WHITESPACE@28..29 " "
+          IDENT_PAT@29..30
+            NAME@29..30
+              IDENT@29..30 "x"
+          WHITESPACE@30..31 " "
+          EQ@31..32 "="
+          WHITESPACE@32..33 " "
+          BIN_EXPR@33..54
+            BIN_EXPR@33..46
+              LITERAL@33..34
+                INT_NUMBER@33..34 "1"
+              WHITESPACE@34..35 " "
+              PLUS@35..36 "+"
+              WHITESPACE@36..37 " "
+              BIN_EXPR@37..46
+                BIN_EXPR@37..42
+                  LITERAL@37..38
+                    INT_NUMBER@37..38 "2"
+                  WHITESPACE@38..39 " "
+                  STAR@39..40 "*"
+                  WHITESPACE@40..41 " "
+                  LITERAL@41..42
+                    INT_NUMBER@41..42 "3"
+                WHITESPACE@42..43 " "
+                PERCENT@43..44 "%"
+                WHITESPACE@44..45 " "
+                LITERAL@45..46
+                  INT_NUMBER@45..46 "4"
+            WHITESPACE@46..47 " "
+            MINUS@47..48 "-"
+            WHITESPACE@48..49 " "
+            BIN_EXPR@49..54
+              LITERAL@49..50
+                INT_NUMBER@49..50 "5"
+              WHITESPACE@50..51 " "
+              SLASH@51..52 "/"
+              WHITESPACE@52..53 " "
+              LITERAL@53..54
+                INT_NUMBER@53..54 "6"
+          SEMICOLON@54..55 ";"
+        WHITESPACE@55..60 "\n    "
+        EXPR_STMT@60..70
+          BIN_EXPR@60..69
+            LITERAL@60..61
+              INT_NUMBER@60..61 "1"
+            WHITESPACE@61..62 " "
+            PLUS@62..63 "+"
+            WHITESPACE@63..64 " "
+            BIN_EXPR@64..69
+              LITERAL@64..65
+                INT_NUMBER@64..65 "2"
+              WHITESPACE@65..66 " "
+              STAR@66..67 "*"
+              WHITESPACE@67..68 " "
+              LITERAL@68..69
+                INT_NUMBER@68..69 "3"
+          SEMICOLON@69..70 ";"
+        WHITESPACE@70..75 "\n    "
+        EXPR_STMT@75..86
+          BIN_EXPR@75..85
+            LITERAL@75..76
+              INT_NUMBER@75..76 "1"
+            WHITESPACE@76..77 " "
+            SHL@77..79 "<<"
+            WHITESPACE@79..80 " "
+            BIN_EXPR@80..85
+              LITERAL@80..81
+                INT_NUMBER@80..81 "2"
+              WHITESPACE@81..82 " "
+              PLUS@82..83 "+"
+              WHITESPACE@83..84 " "
+              LITERAL@84..85
+                INT_NUMBER@84..85 "3"
+          SEMICOLON@85..86 ";"
+        WHITESPACE@86..91 "\n    "
+        EXPR_STMT@91..102
+          BIN_EXPR@91..101
+            LITERAL@91..92
+              INT_NUMBER@91..92 "1"
+            WHITESPACE@92..93 " "
+            AMP@93..94 "&"
+            WHITESPACE@94..95 " "
+            BIN_EXPR@95..101
+              LITERAL@95..96
+                INT_NUMBER@95..96 "2"
+              WHITESPACE@96..97 " "
+              SHR@97..99 ">>"
+              WHITESPACE@99..100 " "
+              LITERAL@100..101
+                INT_NUMBER@100..101 "3"
+          SEMICOLON@101..102 ";"
+        WHITESPACE@102..107 "\n    "
+        EXPR_STMT@107..117
+          BIN_EXPR@107..116
+            LITERAL@107..108
+              INT_NUMBER@107..108 "1"
+            WHITESPACE@108..109 " "
+            CARET@109..110 "^"
+            WHITESPACE@110..111 " "
+            BIN_EXPR@111..116
+              LITERAL@111..112
+                INT_NUMBER@111..112 "2"
+              WHITESPACE@112..113 " "
+              AMP@113..114 "&"
+              WHITESPACE@114..115 " "
+              LITERAL@115..116
+                INT_NUMBER@115..116 "3"
+          SEMICOLON@116..117 ";"
+        WHITESPACE@117..122 "\n    "
+        EXPR_STMT@122..132
+          BIN_EXPR@122..131
+            LITERAL@122..123
+              INT_NUMBER@122..123 "1"
+            WHITESPACE@123..124 " "
+            PIPE@124..125 "|"
+            WHITESPACE@125..126 " "
+            BIN_EXPR@126..131
+              LITERAL@126..127
+                INT_NUMBER@126..127 "2"
+              WHITESPACE@127..128 " "
+              CARET@128..129 "^"
+              WHITESPACE@129..130 " "
+              LITERAL@130..131
+                INT_NUMBER@130..131 "3"
+          SEMICOLON@131..132 ";"
+        WHITESPACE@132..137 "\n    "
+        EXPR_STMT@137..148
+          BIN_EXPR@137..147
+            LITERAL@137..138
+              INT_NUMBER@137..138 "1"
+            WHITESPACE@138..139 " "
+            EQ2@139..141 "=="
+            WHITESPACE@141..142 " "
+            BIN_EXPR@142..147
+              LITERAL@142..143
+                INT_NUMBER@142..143 "2"
+              WHITESPACE@143..144 " "
+              PIPE@144..145 "|"
+              WHITESPACE@145..146 " "
+              LITERAL@146..147
+                INT_NUMBER@146..147 "3"
+          SEMICOLON@147..148 ";"
+        WHITESPACE@148..153 "\n    "
+        EXPR_STMT@153..165
+          BIN_EXPR@153..164
+            LITERAL@153..154
+              INT_NUMBER@153..154 "1"
+            WHITESPACE@154..155 " "
+            AMP2@155..157 "&&"
+            WHITESPACE@157..158 " "
+            BIN_EXPR@158..164
+              LITERAL@158..159
+                INT_NUMBER@158..159 "2"
+              WHITESPACE@159..160 " "
+              EQ2@160..162 "=="
+              WHITESPACE@162..163 " "
+              LITERAL@163..164
+                INT_NUMBER@163..164 "3"
+          SEMICOLON@164..165 ";"
+        WHITESPACE@165..170 "\n    "
+        COMMENT@170..184 "//1 || 2 && 2;"
+        WHITESPACE@184..189 "\n    "
+        COMMENT@189..203 "//1 .. 2 || 3;"
+        WHITESPACE@203..208 "\n    "
+        COMMENT@208..221 "//1 = 2 .. 3;"
+        WHITESPACE@221..226 "\n    "
+        COMMENT@226..245 "//---&*1 - --2 * 9;"
+        WHITESPACE@245..246 "\n"
+        R_CURLY@246..247 "}"
   WHITESPACE@247..248 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0029_range_forms.rast b/crates/syntax/test_data/parser/ok/0029_range_forms.rast
index a732f11c430..486bab8df10 100644
--- a/crates/syntax/test_data/parser/ok/0029_range_forms.rast
+++ b/crates/syntax/test_data/parser/ok/0029_range_forms.rast
@@ -9,143 +9,144 @@ SOURCE_FILE@0..153
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..152
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..23
-        RANGE_EXPR@15..22
-          DOT2@15..17 ".."
-          BIN_EXPR@17..22
-            LITERAL@17..18
-              INT_NUMBER@17..18 "1"
-            WHITESPACE@18..19 " "
-            PLUS@19..20 "+"
-            WHITESPACE@20..21 " "
-            LITERAL@21..22
-              INT_NUMBER@21..22 "1"
-        SEMICOLON@22..23 ";"
-      WHITESPACE@23..28 "\n    "
-      EXPR_STMT@28..36
-        BIN_EXPR@28..35
-          RANGE_EXPR@28..31
-            DOT2@28..30 ".."
-            PATH_EXPR@30..31
-              PATH@30..31
-                PATH_SEGMENT@30..31
-                  NAME_REF@30..31
-                    IDENT@30..31 "z"
-          WHITESPACE@31..32 " "
-          EQ@32..33 "="
-          WHITESPACE@33..34 " "
-          LITERAL@34..35
-            INT_NUMBER@34..35 "2"
-        SEMICOLON@35..36 ";"
-      WHITESPACE@36..41 "\n    "
-      EXPR_STMT@41..59
-        BIN_EXPR@41..58
-          PATH_EXPR@41..42
-            PATH@41..42
-              PATH_SEGMENT@41..42
-                NAME_REF@41..42
-                  IDENT@41..42 "x"
-          WHITESPACE@42..43 " "
-          EQ@43..44 "="
-          WHITESPACE@44..45 " "
-          RANGE_EXPR@45..58
-            LITERAL@45..50
-              FALSE_KW@45..50 "false"
-            DOT2@50..52 ".."
-            BIN_EXPR@52..58
-              LITERAL@52..53
-                INT_NUMBER@52..53 "1"
-              WHITESPACE@53..54 " "
-              EQ2@54..56 "=="
-              WHITESPACE@56..57 " "
-              LITERAL@57..58
-                INT_NUMBER@57..58 "1"
-        SEMICOLON@58..59 ";"
-      WHITESPACE@59..64 "\n    "
-      LET_STMT@64..76
-        LET_KW@64..67 "let"
-        WHITESPACE@67..68 " "
-        IDENT_PAT@68..69
-          NAME@68..69
-            IDENT@68..69 "x"
-        WHITESPACE@69..70 " "
-        EQ@70..71 "="
-        WHITESPACE@71..72 " "
-        RANGE_EXPR@72..75
-          LITERAL@72..73
-            INT_NUMBER@72..73 "1"
-          DOT2@73..75 ".."
-        SEMICOLON@75..76 ";"
-      WHITESPACE@76..86 "\n    \n    "
-      EXPR_STMT@86..95
-        RANGE_EXPR@86..94
-          DOT2EQ@86..89 "..="
-          BIN_EXPR@89..94
-            LITERAL@89..90
-              INT_NUMBER@89..90 "1"
-            WHITESPACE@90..91 " "
-            PLUS@91..92 "+"
-            WHITESPACE@92..93 " "
-            LITERAL@93..94
-              INT_NUMBER@93..94 "1"
-        SEMICOLON@94..95 ";"
-      WHITESPACE@95..100 "\n    "
-      EXPR_STMT@100..109
-        BIN_EXPR@100..108
-          RANGE_EXPR@100..104
-            DOT2EQ@100..103 "..="
-            PATH_EXPR@103..104
-              PATH@103..104
-                PATH_SEGMENT@103..104
-                  NAME_REF@103..104
-                    IDENT@103..104 "z"
-          WHITESPACE@104..105 " "
-          EQ@105..106 "="
-          WHITESPACE@106..107 " "
-          LITERAL@107..108
-            INT_NUMBER@107..108 "2"
-        SEMICOLON@108..109 ";"
-      WHITESPACE@109..114 "\n    "
-      EXPR_STMT@114..133
-        BIN_EXPR@114..132
-          PATH_EXPR@114..115
-            PATH@114..115
-              PATH_SEGMENT@114..115
-                NAME_REF@114..115
-                  IDENT@114..115 "x"
-          WHITESPACE@115..116 " "
-          EQ@116..117 "="
-          WHITESPACE@117..118 " "
-          RANGE_EXPR@118..132
-            LITERAL@118..123
-              FALSE_KW@118..123 "false"
-            DOT2EQ@123..126 "..="
-            BIN_EXPR@126..132
-              LITERAL@126..127
-                INT_NUMBER@126..127 "1"
-              WHITESPACE@127..128 " "
-              EQ2@128..130 "=="
-              WHITESPACE@130..131 " "
-              LITERAL@131..132
-                INT_NUMBER@131..132 "1"
-        SEMICOLON@132..133 ";"
-      WHITESPACE@133..138 "\n    "
-      LET_STMT@138..150
-        LET_KW@138..141 "let"
-        WHITESPACE@141..142 " "
-        IDENT_PAT@142..143
-          NAME@142..143
-            IDENT@142..143 "x"
-        WHITESPACE@143..144 " "
-        EQ@144..145 "="
-        WHITESPACE@145..146 " "
-        RANGE_EXPR@146..149
-          LITERAL@146..147
-            INT_NUMBER@146..147 "1"
-          DOT2@147..149 ".."
-        SEMICOLON@149..150 ";"
-      WHITESPACE@150..151 "\n"
-      R_CURLY@151..152 "}"
+      STMT_LIST@9..152
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..23
+          RANGE_EXPR@15..22
+            DOT2@15..17 ".."
+            BIN_EXPR@17..22
+              LITERAL@17..18
+                INT_NUMBER@17..18 "1"
+              WHITESPACE@18..19 " "
+              PLUS@19..20 "+"
+              WHITESPACE@20..21 " "
+              LITERAL@21..22
+                INT_NUMBER@21..22 "1"
+          SEMICOLON@22..23 ";"
+        WHITESPACE@23..28 "\n    "
+        EXPR_STMT@28..36
+          BIN_EXPR@28..35
+            RANGE_EXPR@28..31
+              DOT2@28..30 ".."
+              PATH_EXPR@30..31
+                PATH@30..31
+                  PATH_SEGMENT@30..31
+                    NAME_REF@30..31
+                      IDENT@30..31 "z"
+            WHITESPACE@31..32 " "
+            EQ@32..33 "="
+            WHITESPACE@33..34 " "
+            LITERAL@34..35
+              INT_NUMBER@34..35 "2"
+          SEMICOLON@35..36 ";"
+        WHITESPACE@36..41 "\n    "
+        EXPR_STMT@41..59
+          BIN_EXPR@41..58
+            PATH_EXPR@41..42
+              PATH@41..42
+                PATH_SEGMENT@41..42
+                  NAME_REF@41..42
+                    IDENT@41..42 "x"
+            WHITESPACE@42..43 " "
+            EQ@43..44 "="
+            WHITESPACE@44..45 " "
+            RANGE_EXPR@45..58
+              LITERAL@45..50
+                FALSE_KW@45..50 "false"
+              DOT2@50..52 ".."
+              BIN_EXPR@52..58
+                LITERAL@52..53
+                  INT_NUMBER@52..53 "1"
+                WHITESPACE@53..54 " "
+                EQ2@54..56 "=="
+                WHITESPACE@56..57 " "
+                LITERAL@57..58
+                  INT_NUMBER@57..58 "1"
+          SEMICOLON@58..59 ";"
+        WHITESPACE@59..64 "\n    "
+        LET_STMT@64..76
+          LET_KW@64..67 "let"
+          WHITESPACE@67..68 " "
+          IDENT_PAT@68..69
+            NAME@68..69
+              IDENT@68..69 "x"
+          WHITESPACE@69..70 " "
+          EQ@70..71 "="
+          WHITESPACE@71..72 " "
+          RANGE_EXPR@72..75
+            LITERAL@72..73
+              INT_NUMBER@72..73 "1"
+            DOT2@73..75 ".."
+          SEMICOLON@75..76 ";"
+        WHITESPACE@76..86 "\n    \n    "
+        EXPR_STMT@86..95
+          RANGE_EXPR@86..94
+            DOT2EQ@86..89 "..="
+            BIN_EXPR@89..94
+              LITERAL@89..90
+                INT_NUMBER@89..90 "1"
+              WHITESPACE@90..91 " "
+              PLUS@91..92 "+"
+              WHITESPACE@92..93 " "
+              LITERAL@93..94
+                INT_NUMBER@93..94 "1"
+          SEMICOLON@94..95 ";"
+        WHITESPACE@95..100 "\n    "
+        EXPR_STMT@100..109
+          BIN_EXPR@100..108
+            RANGE_EXPR@100..104
+              DOT2EQ@100..103 "..="
+              PATH_EXPR@103..104
+                PATH@103..104
+                  PATH_SEGMENT@103..104
+                    NAME_REF@103..104
+                      IDENT@103..104 "z"
+            WHITESPACE@104..105 " "
+            EQ@105..106 "="
+            WHITESPACE@106..107 " "
+            LITERAL@107..108
+              INT_NUMBER@107..108 "2"
+          SEMICOLON@108..109 ";"
+        WHITESPACE@109..114 "\n    "
+        EXPR_STMT@114..133
+          BIN_EXPR@114..132
+            PATH_EXPR@114..115
+              PATH@114..115
+                PATH_SEGMENT@114..115
+                  NAME_REF@114..115
+                    IDENT@114..115 "x"
+            WHITESPACE@115..116 " "
+            EQ@116..117 "="
+            WHITESPACE@117..118 " "
+            RANGE_EXPR@118..132
+              LITERAL@118..123
+                FALSE_KW@118..123 "false"
+              DOT2EQ@123..126 "..="
+              BIN_EXPR@126..132
+                LITERAL@126..127
+                  INT_NUMBER@126..127 "1"
+                WHITESPACE@127..128 " "
+                EQ2@128..130 "=="
+                WHITESPACE@130..131 " "
+                LITERAL@131..132
+                  INT_NUMBER@131..132 "1"
+          SEMICOLON@132..133 ";"
+        WHITESPACE@133..138 "\n    "
+        LET_STMT@138..150
+          LET_KW@138..141 "let"
+          WHITESPACE@141..142 " "
+          IDENT_PAT@142..143
+            NAME@142..143
+              IDENT@142..143 "x"
+          WHITESPACE@143..144 " "
+          EQ@144..145 "="
+          WHITESPACE@145..146 " "
+          RANGE_EXPR@146..149
+            LITERAL@146..147
+              INT_NUMBER@146..147 "1"
+            DOT2@147..149 ".."
+          SEMICOLON@149..150 ";"
+        WHITESPACE@150..151 "\n"
+        R_CURLY@151..152 "}"
   WHITESPACE@152..153 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0030_string_suffixes.rast b/crates/syntax/test_data/parser/ok/0030_string_suffixes.rast
index 115861585f3..9f59c0ecb69 100644
--- a/crates/syntax/test_data/parser/ok/0030_string_suffixes.rast
+++ b/crates/syntax/test_data/parser/ok/0030_string_suffixes.rast
@@ -9,55 +9,56 @@ SOURCE_FILE@0..112
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..111
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      LET_STMT@16..31
-        LET_KW@16..19 "let"
-        WHITESPACE@19..20 " "
-        WILDCARD_PAT@20..21
-          UNDERSCORE@20..21 "_"
-        WHITESPACE@21..22 " "
-        EQ@22..23 "="
-        WHITESPACE@23..24 " "
-        LITERAL@24..30
-          CHAR@24..30 "'c'u32"
-        SEMICOLON@30..31 ";"
-      WHITESPACE@31..36 "\n    "
-      LET_STMT@36..60
-        LET_KW@36..39 "let"
-        WHITESPACE@39..40 " "
-        WILDCARD_PAT@40..41
-          UNDERSCORE@40..41 "_"
-        WHITESPACE@41..42 " "
-        EQ@42..43 "="
-        WHITESPACE@43..44 " "
-        LITERAL@44..59
-          STRING@44..59 "\"string\"invalid"
-        SEMICOLON@59..60 ";"
-      WHITESPACE@60..65 "\n    "
-      LET_STMT@65..83
-        LET_KW@65..68 "let"
-        WHITESPACE@68..69 " "
-        WILDCARD_PAT@69..70
-          UNDERSCORE@69..70 "_"
-        WHITESPACE@70..71 " "
-        EQ@71..72 "="
-        WHITESPACE@72..73 " "
-        LITERAL@73..82
-          BYTE@73..82 "b'b'_suff"
-        SEMICOLON@82..83 ";"
-      WHITESPACE@83..88 "\n    "
-      LET_STMT@88..109
-        LET_KW@88..91 "let"
-        WHITESPACE@91..92 " "
-        WILDCARD_PAT@92..93
-          UNDERSCORE@92..93 "_"
-        WHITESPACE@93..94 " "
-        EQ@94..95 "="
-        WHITESPACE@95..96 " "
-        LITERAL@96..108
-          BYTE_STRING@96..108 "b\"bs\"invalid"
-        SEMICOLON@108..109 ";"
-      WHITESPACE@109..110 "\n"
-      R_CURLY@110..111 "}"
+      STMT_LIST@10..111
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        LET_STMT@16..31
+          LET_KW@16..19 "let"
+          WHITESPACE@19..20 " "
+          WILDCARD_PAT@20..21
+            UNDERSCORE@20..21 "_"
+          WHITESPACE@21..22 " "
+          EQ@22..23 "="
+          WHITESPACE@23..24 " "
+          LITERAL@24..30
+            CHAR@24..30 "'c'u32"
+          SEMICOLON@30..31 ";"
+        WHITESPACE@31..36 "\n    "
+        LET_STMT@36..60
+          LET_KW@36..39 "let"
+          WHITESPACE@39..40 " "
+          WILDCARD_PAT@40..41
+            UNDERSCORE@40..41 "_"
+          WHITESPACE@41..42 " "
+          EQ@42..43 "="
+          WHITESPACE@43..44 " "
+          LITERAL@44..59
+            STRING@44..59 "\"string\"invalid"
+          SEMICOLON@59..60 ";"
+        WHITESPACE@60..65 "\n    "
+        LET_STMT@65..83
+          LET_KW@65..68 "let"
+          WHITESPACE@68..69 " "
+          WILDCARD_PAT@69..70
+            UNDERSCORE@69..70 "_"
+          WHITESPACE@70..71 " "
+          EQ@71..72 "="
+          WHITESPACE@72..73 " "
+          LITERAL@73..82
+            BYTE@73..82 "b'b'_suff"
+          SEMICOLON@82..83 ";"
+        WHITESPACE@83..88 "\n    "
+        LET_STMT@88..109
+          LET_KW@88..91 "let"
+          WHITESPACE@91..92 " "
+          WILDCARD_PAT@92..93
+            UNDERSCORE@92..93 "_"
+          WHITESPACE@93..94 " "
+          EQ@94..95 "="
+          WHITESPACE@95..96 " "
+          LITERAL@96..108
+            BYTE_STRING@96..108 "b\"bs\"invalid"
+          SEMICOLON@108..109 ";"
+        WHITESPACE@109..110 "\n"
+        R_CURLY@110..111 "}"
   WHITESPACE@111..112 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0032_where_for.rast b/crates/syntax/test_data/parser/ok/0032_where_for.rast
index b527cc3acf2..ee66eab5300 100644
--- a/crates/syntax/test_data/parser/ok/0032_where_for.rast
+++ b/crates/syntax/test_data/parser/ok/0032_where_for.rast
@@ -87,6 +87,7 @@ SOURCE_FILE@0..116
       COMMA@111..112 ","
     WHITESPACE@112..113 "\n"
     BLOCK_EXPR@113..115
-      L_CURLY@113..114 "{"
-      R_CURLY@114..115 "}"
+      STMT_LIST@113..115
+        L_CURLY@113..114 "{"
+        R_CURLY@114..115 "}"
   WHITESPACE@115..116 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0033_label_break.rast b/crates/syntax/test_data/parser/ok/0033_label_break.rast
index 4b0f0997eba..fbda85797e1 100644
--- a/crates/syntax/test_data/parser/ok/0033_label_break.rast
+++ b/crates/syntax/test_data/parser/ok/0033_label_break.rast
@@ -11,212 +11,217 @@ SOURCE_FILE@0..506
       R_PAREN@42..43 ")"
     WHITESPACE@43..44 " "
     BLOCK_EXPR@44..505
-      L_CURLY@44..45 "{"
-      WHITESPACE@45..50 "\n    "
-      EXPR_STMT@50..66
-        EFFECT_EXPR@50..66
-          LABEL@50..63
-            LIFETIME@50..62
-              LIFETIME_IDENT@50..62 "'empty_block"
-            COLON@62..63 ":"
-          WHITESPACE@63..64 " "
-          BLOCK_EXPR@64..66
-            L_CURLY@64..65 "{"
-            R_CURLY@65..66 "}"
-      WHITESPACE@66..72 "\n\n    "
-      EXPR_STMT@72..295
-        EFFECT_EXPR@72..295
-          LABEL@72..79
-            LIFETIME@72..78
-              LIFETIME_IDENT@72..78 "'block"
-            COLON@78..79 ":"
-          WHITESPACE@79..80 " "
-          BLOCK_EXPR@80..295
-            L_CURLY@80..81 "{"
-            WHITESPACE@81..90 "\n        "
-            EXPR_STMT@90..101
-              CALL_EXPR@90..100
-                PATH_EXPR@90..98
-                  PATH@90..98
-                    PATH_SEGMENT@90..98
-                      NAME_REF@90..98
-                        IDENT@90..98 "do_thing"
-                ARG_LIST@98..100
-                  L_PAREN@98..99 "("
-                  R_PAREN@99..100 ")"
-              SEMICOLON@100..101 ";"
-            WHITESPACE@101..110 "\n        "
-            EXPR_STMT@110..170
-              IF_EXPR@110..170
-                IF_KW@110..112 "if"
-                WHITESPACE@112..113 " "
-                CONDITION@113..132
-                  CALL_EXPR@113..132
-                    PATH_EXPR@113..130
-                      PATH@113..130
-                        PATH_SEGMENT@113..130
-                          NAME_REF@113..130
-                            IDENT@113..130 "condition_not_met"
-                    ARG_LIST@130..132
-                      L_PAREN@130..131 "("
-                      R_PAREN@131..132 ")"
-                WHITESPACE@132..133 " "
-                BLOCK_EXPR@133..170
-                  L_CURLY@133..134 "{"
-                  WHITESPACE@134..147 "\n            "
-                  EXPR_STMT@147..160
-                    BREAK_EXPR@147..159
-                      BREAK_KW@147..152 "break"
-                      WHITESPACE@152..153 " "
-                      LIFETIME@153..159
-                        LIFETIME_IDENT@153..159 "'block"
-                    SEMICOLON@159..160 ";"
-                  WHITESPACE@160..169 "\n        "
-                  R_CURLY@169..170 "}"
-            WHITESPACE@170..179 "\n        "
-            EXPR_STMT@179..195
-              CALL_EXPR@179..194
-                PATH_EXPR@179..192
-                  PATH@179..192
-                    PATH_SEGMENT@179..192
-                      NAME_REF@179..192
-                        IDENT@179..192 "do_next_thing"
-                ARG_LIST@192..194
-                  L_PAREN@192..193 "("
-                  R_PAREN@193..194 ")"
-              SEMICOLON@194..195 ";"
-            WHITESPACE@195..204 "\n        "
-            EXPR_STMT@204..264
-              IF_EXPR@204..264
-                IF_KW@204..206 "if"
-                WHITESPACE@206..207 " "
-                CONDITION@207..226
-                  CALL_EXPR@207..226
-                    PATH_EXPR@207..224
-                      PATH@207..224
-                        PATH_SEGMENT@207..224
-                          NAME_REF@207..224
-                            IDENT@207..224 "condition_not_met"
-                    ARG_LIST@224..226
-                      L_PAREN@224..225 "("
-                      R_PAREN@225..226 ")"
-                WHITESPACE@226..227 " "
-                BLOCK_EXPR@227..264
-                  L_CURLY@227..228 "{"
-                  WHITESPACE@228..241 "\n            "
-                  EXPR_STMT@241..254
-                    BREAK_EXPR@241..253
-                      BREAK_KW@241..246 "break"
-                      WHITESPACE@246..247 " "
-                      LIFETIME@247..253
-                        LIFETIME_IDENT@247..253 "'block"
-                    SEMICOLON@253..254 ";"
-                  WHITESPACE@254..263 "\n        "
-                  R_CURLY@263..264 "}"
-            WHITESPACE@264..273 "\n        "
-            EXPR_STMT@273..289
-              CALL_EXPR@273..288
-                PATH_EXPR@273..286
-                  PATH@273..286
-                    PATH_SEGMENT@273..286
-                      NAME_REF@273..286
-                        IDENT@273..286 "do_last_thing"
-                ARG_LIST@286..288
-                  L_PAREN@286..287 "("
-                  R_PAREN@287..288 ")"
-              SEMICOLON@288..289 ";"
-            WHITESPACE@289..294 "\n    "
-            R_CURLY@294..295 "}"
-      WHITESPACE@295..301 "\n\n    "
-      LET_STMT@301..503
-        LET_KW@301..304 "let"
-        WHITESPACE@304..305 " "
-        IDENT_PAT@305..311
-          NAME@305..311
-            IDENT@305..311 "result"
-        WHITESPACE@311..312 " "
-        EQ@312..313 "="
-        WHITESPACE@313..314 " "
-        EFFECT_EXPR@314..502
-          LABEL@314..321
-            LIFETIME@314..320
-              LIFETIME_IDENT@314..320 "'block"
-            COLON@320..321 ":"
-          WHITESPACE@321..322 " "
-          BLOCK_EXPR@322..502
-            L_CURLY@322..323 "{"
-            WHITESPACE@323..332 "\n        "
-            EXPR_STMT@332..403
-              IF_EXPR@332..403
-                IF_KW@332..334 "if"
-                WHITESPACE@334..335 " "
-                CONDITION@335..340
-                  CALL_EXPR@335..340
-                    PATH_EXPR@335..338
-                      PATH@335..338
-                        PATH_SEGMENT@335..338
-                          NAME_REF@335..338
-                            IDENT@335..338 "foo"
-                    ARG_LIST@338..340
-                      L_PAREN@338..339 "("
-                      R_PAREN@339..340 ")"
-                WHITESPACE@340..341 " "
-                BLOCK_EXPR@341..403
-                  L_CURLY@341..342 "{"
-                  WHITESPACE@342..355 "\n            "
-                  COMMENT@355..365 "// comment"
-                  WHITESPACE@365..378 "\n            "
-                  EXPR_STMT@378..393
-                    BREAK_EXPR@378..392
-                      BREAK_KW@378..383 "break"
-                      WHITESPACE@383..384 " "
-                      LIFETIME@384..390
-                        LIFETIME_IDENT@384..390 "'block"
-                      WHITESPACE@390..391 " "
-                      LITERAL@391..392
-                        INT_NUMBER@391..392 "1"
-                    SEMICOLON@392..393 ";"
-                  WHITESPACE@393..402 "\n        "
-                  R_CURLY@402..403 "}"
-            WHITESPACE@403..412 "\n        "
-            EXPR_STMT@412..486
-              IF_EXPR@412..486
-                IF_KW@412..414 "if"
-                WHITESPACE@414..415 " "
-                CONDITION@415..420
-                  CALL_EXPR@415..420
-                    PATH_EXPR@415..418
-                      PATH@415..418
-                        PATH_SEGMENT@415..418
-                          NAME_REF@415..418
-                            IDENT@415..418 "bar"
-                    ARG_LIST@418..420
-                      L_PAREN@418..419 "("
-                      R_PAREN@419..420 ")"
-                WHITESPACE@420..421 " "
-                BLOCK_EXPR@421..486
-                  L_CURLY@421..422 "{"
-                  WHITESPACE@422..435 "\n            "
-                  COMMENT@435..448 "/* comment */"
-                  WHITESPACE@448..461 "\n            "
-                  EXPR_STMT@461..476
-                    BREAK_EXPR@461..475
-                      BREAK_KW@461..466 "break"
-                      WHITESPACE@466..467 " "
-                      LIFETIME@467..473
-                        LIFETIME_IDENT@467..473 "'block"
-                      WHITESPACE@473..474 " "
-                      LITERAL@474..475
-                        INT_NUMBER@474..475 "2"
-                    SEMICOLON@475..476 ";"
-                  WHITESPACE@476..485 "\n        "
-                  R_CURLY@485..486 "}"
-            WHITESPACE@486..495 "\n        "
-            LITERAL@495..496
-              INT_NUMBER@495..496 "3"
-            WHITESPACE@496..501 "\n    "
-            R_CURLY@501..502 "}"
-        SEMICOLON@502..503 ";"
-      WHITESPACE@503..504 "\n"
-      R_CURLY@504..505 "}"
+      STMT_LIST@44..505
+        L_CURLY@44..45 "{"
+        WHITESPACE@45..50 "\n    "
+        EXPR_STMT@50..66
+          BLOCK_EXPR@50..66
+            LABEL@50..63
+              LIFETIME@50..62
+                LIFETIME_IDENT@50..62 "'empty_block"
+              COLON@62..63 ":"
+            WHITESPACE@63..64 " "
+            STMT_LIST@64..66
+              L_CURLY@64..65 "{"
+              R_CURLY@65..66 "}"
+        WHITESPACE@66..72 "\n\n    "
+        EXPR_STMT@72..295
+          BLOCK_EXPR@72..295
+            LABEL@72..79
+              LIFETIME@72..78
+                LIFETIME_IDENT@72..78 "'block"
+              COLON@78..79 ":"
+            WHITESPACE@79..80 " "
+            STMT_LIST@80..295
+              L_CURLY@80..81 "{"
+              WHITESPACE@81..90 "\n        "
+              EXPR_STMT@90..101
+                CALL_EXPR@90..100
+                  PATH_EXPR@90..98
+                    PATH@90..98
+                      PATH_SEGMENT@90..98
+                        NAME_REF@90..98
+                          IDENT@90..98 "do_thing"
+                  ARG_LIST@98..100
+                    L_PAREN@98..99 "("
+                    R_PAREN@99..100 ")"
+                SEMICOLON@100..101 ";"
+              WHITESPACE@101..110 "\n        "
+              EXPR_STMT@110..170
+                IF_EXPR@110..170
+                  IF_KW@110..112 "if"
+                  WHITESPACE@112..113 " "
+                  CONDITION@113..132
+                    CALL_EXPR@113..132
+                      PATH_EXPR@113..130
+                        PATH@113..130
+                          PATH_SEGMENT@113..130
+                            NAME_REF@113..130
+                              IDENT@113..130 "condition_not_met"
+                      ARG_LIST@130..132
+                        L_PAREN@130..131 "("
+                        R_PAREN@131..132 ")"
+                  WHITESPACE@132..133 " "
+                  BLOCK_EXPR@133..170
+                    STMT_LIST@133..170
+                      L_CURLY@133..134 "{"
+                      WHITESPACE@134..147 "\n            "
+                      EXPR_STMT@147..160
+                        BREAK_EXPR@147..159
+                          BREAK_KW@147..152 "break"
+                          WHITESPACE@152..153 " "
+                          LIFETIME@153..159
+                            LIFETIME_IDENT@153..159 "'block"
+                        SEMICOLON@159..160 ";"
+                      WHITESPACE@160..169 "\n        "
+                      R_CURLY@169..170 "}"
+              WHITESPACE@170..179 "\n        "
+              EXPR_STMT@179..195
+                CALL_EXPR@179..194
+                  PATH_EXPR@179..192
+                    PATH@179..192
+                      PATH_SEGMENT@179..192
+                        NAME_REF@179..192
+                          IDENT@179..192 "do_next_thing"
+                  ARG_LIST@192..194
+                    L_PAREN@192..193 "("
+                    R_PAREN@193..194 ")"
+                SEMICOLON@194..195 ";"
+              WHITESPACE@195..204 "\n        "
+              EXPR_STMT@204..264
+                IF_EXPR@204..264
+                  IF_KW@204..206 "if"
+                  WHITESPACE@206..207 " "
+                  CONDITION@207..226
+                    CALL_EXPR@207..226
+                      PATH_EXPR@207..224
+                        PATH@207..224
+                          PATH_SEGMENT@207..224
+                            NAME_REF@207..224
+                              IDENT@207..224 "condition_not_met"
+                      ARG_LIST@224..226
+                        L_PAREN@224..225 "("
+                        R_PAREN@225..226 ")"
+                  WHITESPACE@226..227 " "
+                  BLOCK_EXPR@227..264
+                    STMT_LIST@227..264
+                      L_CURLY@227..228 "{"
+                      WHITESPACE@228..241 "\n            "
+                      EXPR_STMT@241..254
+                        BREAK_EXPR@241..253
+                          BREAK_KW@241..246 "break"
+                          WHITESPACE@246..247 " "
+                          LIFETIME@247..253
+                            LIFETIME_IDENT@247..253 "'block"
+                        SEMICOLON@253..254 ";"
+                      WHITESPACE@254..263 "\n        "
+                      R_CURLY@263..264 "}"
+              WHITESPACE@264..273 "\n        "
+              EXPR_STMT@273..289
+                CALL_EXPR@273..288
+                  PATH_EXPR@273..286
+                    PATH@273..286
+                      PATH_SEGMENT@273..286
+                        NAME_REF@273..286
+                          IDENT@273..286 "do_last_thing"
+                  ARG_LIST@286..288
+                    L_PAREN@286..287 "("
+                    R_PAREN@287..288 ")"
+                SEMICOLON@288..289 ";"
+              WHITESPACE@289..294 "\n    "
+              R_CURLY@294..295 "}"
+        WHITESPACE@295..301 "\n\n    "
+        LET_STMT@301..503
+          LET_KW@301..304 "let"
+          WHITESPACE@304..305 " "
+          IDENT_PAT@305..311
+            NAME@305..311
+              IDENT@305..311 "result"
+          WHITESPACE@311..312 " "
+          EQ@312..313 "="
+          WHITESPACE@313..314 " "
+          BLOCK_EXPR@314..502
+            LABEL@314..321
+              LIFETIME@314..320
+                LIFETIME_IDENT@314..320 "'block"
+              COLON@320..321 ":"
+            WHITESPACE@321..322 " "
+            STMT_LIST@322..502
+              L_CURLY@322..323 "{"
+              WHITESPACE@323..332 "\n        "
+              EXPR_STMT@332..403
+                IF_EXPR@332..403
+                  IF_KW@332..334 "if"
+                  WHITESPACE@334..335 " "
+                  CONDITION@335..340
+                    CALL_EXPR@335..340
+                      PATH_EXPR@335..338
+                        PATH@335..338
+                          PATH_SEGMENT@335..338
+                            NAME_REF@335..338
+                              IDENT@335..338 "foo"
+                      ARG_LIST@338..340
+                        L_PAREN@338..339 "("
+                        R_PAREN@339..340 ")"
+                  WHITESPACE@340..341 " "
+                  BLOCK_EXPR@341..403
+                    STMT_LIST@341..403
+                      L_CURLY@341..342 "{"
+                      WHITESPACE@342..355 "\n            "
+                      COMMENT@355..365 "// comment"
+                      WHITESPACE@365..378 "\n            "
+                      EXPR_STMT@378..393
+                        BREAK_EXPR@378..392
+                          BREAK_KW@378..383 "break"
+                          WHITESPACE@383..384 " "
+                          LIFETIME@384..390
+                            LIFETIME_IDENT@384..390 "'block"
+                          WHITESPACE@390..391 " "
+                          LITERAL@391..392
+                            INT_NUMBER@391..392 "1"
+                        SEMICOLON@392..393 ";"
+                      WHITESPACE@393..402 "\n        "
+                      R_CURLY@402..403 "}"
+              WHITESPACE@403..412 "\n        "
+              EXPR_STMT@412..486
+                IF_EXPR@412..486
+                  IF_KW@412..414 "if"
+                  WHITESPACE@414..415 " "
+                  CONDITION@415..420
+                    CALL_EXPR@415..420
+                      PATH_EXPR@415..418
+                        PATH@415..418
+                          PATH_SEGMENT@415..418
+                            NAME_REF@415..418
+                              IDENT@415..418 "bar"
+                      ARG_LIST@418..420
+                        L_PAREN@418..419 "("
+                        R_PAREN@419..420 ")"
+                  WHITESPACE@420..421 " "
+                  BLOCK_EXPR@421..486
+                    STMT_LIST@421..486
+                      L_CURLY@421..422 "{"
+                      WHITESPACE@422..435 "\n            "
+                      COMMENT@435..448 "/* comment */"
+                      WHITESPACE@448..461 "\n            "
+                      EXPR_STMT@461..476
+                        BREAK_EXPR@461..475
+                          BREAK_KW@461..466 "break"
+                          WHITESPACE@466..467 " "
+                          LIFETIME@467..473
+                            LIFETIME_IDENT@467..473 "'block"
+                          WHITESPACE@473..474 " "
+                          LITERAL@474..475
+                            INT_NUMBER@474..475 "2"
+                        SEMICOLON@475..476 ";"
+                      WHITESPACE@476..485 "\n        "
+                      R_CURLY@485..486 "}"
+              WHITESPACE@486..495 "\n        "
+              LITERAL@495..496
+                INT_NUMBER@495..496 "3"
+              WHITESPACE@496..501 "\n    "
+              R_CURLY@501..502 "}"
+          SEMICOLON@502..503 ";"
+        WHITESPACE@503..504 "\n"
+        R_CURLY@504..505 "}"
   WHITESPACE@505..506 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0034_crate_path_in_call.rast b/crates/syntax/test_data/parser/ok/0034_crate_path_in_call.rast
index a0a5ca7f5b1..9a6010d3622 100644
--- a/crates/syntax/test_data/parser/ok/0034_crate_path_in_call.rast
+++ b/crates/syntax/test_data/parser/ok/0034_crate_path_in_call.rast
@@ -9,34 +9,35 @@ SOURCE_FILE@0..62
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..61
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      EXPR_STMT@16..59
-        CALL_EXPR@16..58
-          PATH_EXPR@16..26
-            PATH@16..26
-              PATH_SEGMENT@16..26
-                NAME_REF@16..26
-                  IDENT@16..26 "make_query"
-          ARG_LIST@26..58
-            L_PAREN@26..27 "("
-            PATH_EXPR@27..57
-              PATH@27..57
-                PATH@27..44
-                  PATH@27..32
-                    PATH_SEGMENT@27..32
-                      NAME_REF@27..32
-                        CRATE_KW@27..32 "crate"
-                  COLON2@32..34 "::"
-                  PATH_SEGMENT@34..44
-                    NAME_REF@34..44
-                      IDENT@34..44 "module_map"
-                COLON2@44..46 "::"
-                PATH_SEGMENT@46..57
-                  NAME_REF@46..57
-                    IDENT@46..57 "module_tree"
-            R_PAREN@57..58 ")"
-        SEMICOLON@58..59 ";"
-      WHITESPACE@59..60 "\n"
-      R_CURLY@60..61 "}"
+      STMT_LIST@10..61
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        EXPR_STMT@16..59
+          CALL_EXPR@16..58
+            PATH_EXPR@16..26
+              PATH@16..26
+                PATH_SEGMENT@16..26
+                  NAME_REF@16..26
+                    IDENT@16..26 "make_query"
+            ARG_LIST@26..58
+              L_PAREN@26..27 "("
+              PATH_EXPR@27..57
+                PATH@27..57
+                  PATH@27..44
+                    PATH@27..32
+                      PATH_SEGMENT@27..32
+                        NAME_REF@27..32
+                          CRATE_KW@27..32 "crate"
+                    COLON2@32..34 "::"
+                    PATH_SEGMENT@34..44
+                      NAME_REF@34..44
+                        IDENT@34..44 "module_map"
+                  COLON2@44..46 "::"
+                  PATH_SEGMENT@46..57
+                    NAME_REF@46..57
+                      IDENT@46..57 "module_tree"
+              R_PAREN@57..58 ")"
+          SEMICOLON@58..59 ";"
+        WHITESPACE@59..60 "\n"
+        R_CURLY@60..61 "}"
   WHITESPACE@61..62 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0035_weird_exprs.rast b/crates/syntax/test_data/parser/ok/0035_weird_exprs.rast
index 5b114df8014..672a12d0878 100644
--- a/crates/syntax/test_data/parser/ok/0035_weird_exprs.rast
+++ b/crates/syntax/test_data/parser/ok/0035_weird_exprs.rast
@@ -144,32 +144,33 @@ SOURCE_FILE@0..3813
               IDENT@536..540 "bool"
     WHITESPACE@540..541 " "
     BLOCK_EXPR@541..572
-      L_CURLY@541..542 "{"
-      WHITESPACE@542..543 " "
-      LET_STMT@543..570
-        LET_KW@543..546 "let"
-        WHITESPACE@546..547 " "
-        IDENT_PAT@547..549
-          NAME@547..549
-            IDENT@547..549 "_x"
-        COLON@549..550 ":"
-        WHITESPACE@550..551 " "
-        PATH_TYPE@551..555
-          PATH@551..555
-            PATH_SEGMENT@551..555
-              NAME_REF@551..555
-                IDENT@551..555 "bool"
-        WHITESPACE@555..556 " "
-        EQ@556..557 "="
-        WHITESPACE@557..558 " "
-        RETURN_EXPR@558..569
-          RETURN_KW@558..564 "return"
-          WHITESPACE@564..565 " "
-          LITERAL@565..569
-            TRUE_KW@565..569 "true"
-        SEMICOLON@569..570 ";"
-      WHITESPACE@570..571 " "
-      R_CURLY@571..572 "}"
+      STMT_LIST@541..572
+        L_CURLY@541..542 "{"
+        WHITESPACE@542..543 " "
+        LET_STMT@543..570
+          LET_KW@543..546 "let"
+          WHITESPACE@546..547 " "
+          IDENT_PAT@547..549
+            NAME@547..549
+              IDENT@547..549 "_x"
+          COLON@549..550 ":"
+          WHITESPACE@550..551 " "
+          PATH_TYPE@551..555
+            PATH@551..555
+              PATH_SEGMENT@551..555
+                NAME_REF@551..555
+                  IDENT@551..555 "bool"
+          WHITESPACE@555..556 " "
+          EQ@556..557 "="
+          WHITESPACE@557..558 " "
+          RETURN_EXPR@558..569
+            RETURN_KW@558..564 "return"
+            WHITESPACE@564..565 " "
+            LITERAL@565..569
+              TRUE_KW@565..569 "true"
+          SEMICOLON@569..570 ";"
+        WHITESPACE@570..571 " "
+        R_CURLY@571..572 "}"
   WHITESPACE@572..574 "\n\n"
   FN@574..624
     FN_KW@574..576 "fn"
@@ -181,46 +182,48 @@ SOURCE_FILE@0..3813
       R_PAREN@583..584 ")"
     WHITESPACE@584..585 " "
     BLOCK_EXPR@585..624
-      L_CURLY@585..586 "{"
-      WHITESPACE@586..591 "\n    "
-      FN@591..607
-        FN_KW@591..593 "fn"
-        WHITESPACE@593..594 " "
-        NAME@594..595
-          IDENT@594..595 "f"
-        PARAM_LIST@595..603
-          L_PAREN@595..596 "("
-          PARAM@596..602
-            IDENT_PAT@596..598
-              NAME@596..598
-                IDENT@596..598 "_x"
-            COLON@598..599 ":"
-            WHITESPACE@599..600 " "
-            TUPLE_TYPE@600..602
-              L_PAREN@600..601 "("
-              R_PAREN@601..602 ")"
-          R_PAREN@602..603 ")"
-        WHITESPACE@603..604 " "
-        BLOCK_EXPR@604..607
-          L_CURLY@604..605 "{"
-          WHITESPACE@605..606 " "
-          R_CURLY@606..607 "}"
-      WHITESPACE@607..612 "\n    "
-      EXPR_STMT@612..622
-        CALL_EXPR@612..621
-          PATH_EXPR@612..613
-            PATH@612..613
-              PATH_SEGMENT@612..613
-                NAME_REF@612..613
-                  IDENT@612..613 "f"
-          ARG_LIST@613..621
-            L_PAREN@613..614 "("
-            RETURN_EXPR@614..620
-              RETURN_KW@614..620 "return"
-            R_PAREN@620..621 ")"
-        SEMICOLON@621..622 ";"
-      WHITESPACE@622..623 "\n"
-      R_CURLY@623..624 "}"
+      STMT_LIST@585..624
+        L_CURLY@585..586 "{"
+        WHITESPACE@586..591 "\n    "
+        FN@591..607
+          FN_KW@591..593 "fn"
+          WHITESPACE@593..594 " "
+          NAME@594..595
+            IDENT@594..595 "f"
+          PARAM_LIST@595..603
+            L_PAREN@595..596 "("
+            PARAM@596..602
+              IDENT_PAT@596..598
+                NAME@596..598
+                  IDENT@596..598 "_x"
+              COLON@598..599 ":"
+              WHITESPACE@599..600 " "
+              TUPLE_TYPE@600..602
+                L_PAREN@600..601 "("
+                R_PAREN@601..602 ")"
+            R_PAREN@602..603 ")"
+          WHITESPACE@603..604 " "
+          BLOCK_EXPR@604..607
+            STMT_LIST@604..607
+              L_CURLY@604..605 "{"
+              WHITESPACE@605..606 " "
+              R_CURLY@606..607 "}"
+        WHITESPACE@607..612 "\n    "
+        EXPR_STMT@612..622
+          CALL_EXPR@612..621
+            PATH_EXPR@612..613
+              PATH@612..613
+                PATH_SEGMENT@612..613
+                  NAME_REF@612..613
+                    IDENT@612..613 "f"
+            ARG_LIST@613..621
+              L_PAREN@613..614 "("
+              RETURN_EXPR@614..620
+                RETURN_KW@614..620 "return"
+              R_PAREN@620..621 ")"
+          SEMICOLON@621..622 ";"
+        WHITESPACE@622..623 "\n"
+        R_CURLY@623..624 "}"
   WHITESPACE@624..626 "\n\n"
   FN@626..816
     FN_KW@626..628 "fn"
@@ -232,185 +235,189 @@ SOURCE_FILE@0..3813
       R_PAREN@634..635 ")"
     WHITESPACE@635..636 " "
     BLOCK_EXPR@636..816
-      L_CURLY@636..637 "{"
-      WHITESPACE@637..642 "\n    "
-      FN@642..720
-        FN_KW@642..644 "fn"
-        WHITESPACE@644..645 " "
-        NAME@645..648
-          IDENT@645..648 "the"
-        PARAM_LIST@648..664
-          L_PAREN@648..649 "("
-          PARAM@649..663
-            IDENT_PAT@649..650
-              NAME@649..650
-                IDENT@649..650 "x"
-            COLON@650..651 ":"
-            WHITESPACE@651..652 " "
-            REF_TYPE@652..663
-              AMP@652..653 "&"
-              PATH_TYPE@653..663
-                PATH@653..663
-                  PATH_SEGMENT@653..663
-                    NAME_REF@653..657
-                      IDENT@653..657 "Cell"
-                    GENERIC_ARG_LIST@657..663
-                      L_ANGLE@657..658 "<"
-                      TYPE_ARG@658..662
-                        PATH_TYPE@658..662
-                          PATH@658..662
-                            PATH_SEGMENT@658..662
-                              NAME_REF@658..662
-                                IDENT@658..662 "bool"
-                      R_ANGLE@662..663 ">"
-          R_PAREN@663..664 ")"
-        WHITESPACE@664..665 " "
-        BLOCK_EXPR@665..720
-          L_CURLY@665..666 "{"
-          WHITESPACE@666..675 "\n        "
-          EXPR_STMT@675..714
-            RETURN_EXPR@675..713
-              RETURN_KW@675..681 "return"
-              WHITESPACE@681..682 " "
-              WHILE_EXPR@682..713
-                WHILE_KW@682..687 "while"
-                WHITESPACE@687..688 " "
-                CONDITION@688..696
-                  PREFIX_EXPR@688..696
-                    BANG@688..689 "!"
-                    METHOD_CALL_EXPR@689..696
-                      PATH_EXPR@689..690
-                        PATH@689..690
-                          PATH_SEGMENT@689..690
-                            NAME_REF@689..690
-                              IDENT@689..690 "x"
-                      DOT@690..691 "."
-                      NAME_REF@691..694
-                        IDENT@691..694 "get"
-                      ARG_LIST@694..696
-                        L_PAREN@694..695 "("
-                        R_PAREN@695..696 ")"
-                WHITESPACE@696..697 " "
-                BLOCK_EXPR@697..713
-                  L_CURLY@697..698 "{"
-                  WHITESPACE@698..699 " "
-                  EXPR_STMT@699..711
-                    METHOD_CALL_EXPR@699..710
-                      PATH_EXPR@699..700
-                        PATH@699..700
-                          PATH_SEGMENT@699..700
-                            NAME_REF@699..700
-                              IDENT@699..700 "x"
-                      DOT@700..701 "."
-                      NAME_REF@701..704
-                        IDENT@701..704 "set"
-                      ARG_LIST@704..710
-                        L_PAREN@704..705 "("
-                        LITERAL@705..709
-                          TRUE_KW@705..709 "true"
-                        R_PAREN@709..710 ")"
-                    SEMICOLON@710..711 ";"
-                  WHITESPACE@711..712 " "
-                  R_CURLY@712..713 "}"
-            SEMICOLON@713..714 ";"
-          WHITESPACE@714..719 "\n    "
-          R_CURLY@719..720 "}"
-      WHITESPACE@720..725 "\n    "
-      LET_STMT@725..751
-        LET_KW@725..728 "let"
-        WHITESPACE@728..729 " "
-        IDENT_PAT@729..730
-          NAME@729..730
-            IDENT@729..730 "i"
-        WHITESPACE@730..731 " "
-        EQ@731..732 "="
-        WHITESPACE@732..733 " "
-        REF_EXPR@733..750
-          AMP@733..734 "&"
-          CALL_EXPR@734..750
-            PATH_EXPR@734..743
-              PATH@734..743
-                PATH@734..738
-                  PATH_SEGMENT@734..738
-                    NAME_REF@734..738
-                      IDENT@734..738 "Cell"
-                COLON2@738..740 "::"
-                PATH_SEGMENT@740..743
-                  NAME_REF@740..743
-                    IDENT@740..743 "new"
-            ARG_LIST@743..750
-              L_PAREN@743..744 "("
-              LITERAL@744..749
-                FALSE_KW@744..749 "false"
-              R_PAREN@749..750 ")"
-        SEMICOLON@750..751 ";"
-      WHITESPACE@751..756 "\n    "
-      LET_STMT@756..778
-        LET_KW@756..759 "let"
-        WHITESPACE@759..760 " "
-        IDENT_PAT@760..764
-          NAME@760..764
-            IDENT@760..764 "dont"
-        WHITESPACE@764..765 " "
-        EQ@765..766 "="
-        WHITESPACE@766..767 " "
-        BLOCK_EXPR@767..777
-          L_CURLY@767..768 "{"
-          CLOSURE_EXPR@768..776
-            PARAM_LIST@768..770
-              PIPE@768..769 "|"
-              PIPE@769..770 "|"
-            CALL_EXPR@770..776
-              PATH_EXPR@770..773
-                PATH@770..773
-                  PATH_SEGMENT@770..773
-                    NAME_REF@770..773
-                      IDENT@770..773 "the"
-              ARG_LIST@773..776
-                L_PAREN@773..774 "("
-                PATH_EXPR@774..775
-                  PATH@774..775
-                    PATH_SEGMENT@774..775
-                      NAME_REF@774..775
-                        IDENT@774..775 "i"
-                R_PAREN@775..776 ")"
-          R_CURLY@776..777 "}"
-        SEMICOLON@777..778 ";"
-      WHITESPACE@778..783 "\n    "
-      EXPR_STMT@783..790
-        CALL_EXPR@783..789
-          PATH_EXPR@783..787
-            PATH@783..787
-              PATH_SEGMENT@783..787
-                NAME_REF@783..787
-                  IDENT@783..787 "dont"
-          ARG_LIST@787..789
-            L_PAREN@787..788 "("
-            R_PAREN@788..789 ")"
-        SEMICOLON@789..790 ";"
-      WHITESPACE@790..795 "\n    "
-      EXPR_STMT@795..814
-        MACRO_CALL@795..813
-          PATH@795..801
-            PATH_SEGMENT@795..801
-              NAME_REF@795..801
-                IDENT@795..801 "assert"
-          BANG@801..802 "!"
-          TOKEN_TREE@802..813
-            L_PAREN@802..803 "("
-            TOKEN_TREE@803..812
-              L_PAREN@803..804 "("
-              IDENT@804..805 "i"
-              DOT@805..806 "."
-              IDENT@806..809 "get"
-              TOKEN_TREE@809..811
-                L_PAREN@809..810 "("
-                R_PAREN@810..811 ")"
-              R_PAREN@811..812 ")"
-            R_PAREN@812..813 ")"
-        SEMICOLON@813..814 ";"
-      WHITESPACE@814..815 "\n"
-      R_CURLY@815..816 "}"
+      STMT_LIST@636..816
+        L_CURLY@636..637 "{"
+        WHITESPACE@637..642 "\n    "
+        FN@642..720
+          FN_KW@642..644 "fn"
+          WHITESPACE@644..645 " "
+          NAME@645..648
+            IDENT@645..648 "the"
+          PARAM_LIST@648..664
+            L_PAREN@648..649 "("
+            PARAM@649..663
+              IDENT_PAT@649..650
+                NAME@649..650
+                  IDENT@649..650 "x"
+              COLON@650..651 ":"
+              WHITESPACE@651..652 " "
+              REF_TYPE@652..663
+                AMP@652..653 "&"
+                PATH_TYPE@653..663
+                  PATH@653..663
+                    PATH_SEGMENT@653..663
+                      NAME_REF@653..657
+                        IDENT@653..657 "Cell"
+                      GENERIC_ARG_LIST@657..663
+                        L_ANGLE@657..658 "<"
+                        TYPE_ARG@658..662
+                          PATH_TYPE@658..662
+                            PATH@658..662
+                              PATH_SEGMENT@658..662
+                                NAME_REF@658..662
+                                  IDENT@658..662 "bool"
+                        R_ANGLE@662..663 ">"
+            R_PAREN@663..664 ")"
+          WHITESPACE@664..665 " "
+          BLOCK_EXPR@665..720
+            STMT_LIST@665..720
+              L_CURLY@665..666 "{"
+              WHITESPACE@666..675 "\n        "
+              EXPR_STMT@675..714
+                RETURN_EXPR@675..713
+                  RETURN_KW@675..681 "return"
+                  WHITESPACE@681..682 " "
+                  WHILE_EXPR@682..713
+                    WHILE_KW@682..687 "while"
+                    WHITESPACE@687..688 " "
+                    CONDITION@688..696
+                      PREFIX_EXPR@688..696
+                        BANG@688..689 "!"
+                        METHOD_CALL_EXPR@689..696
+                          PATH_EXPR@689..690
+                            PATH@689..690
+                              PATH_SEGMENT@689..690
+                                NAME_REF@689..690
+                                  IDENT@689..690 "x"
+                          DOT@690..691 "."
+                          NAME_REF@691..694
+                            IDENT@691..694 "get"
+                          ARG_LIST@694..696
+                            L_PAREN@694..695 "("
+                            R_PAREN@695..696 ")"
+                    WHITESPACE@696..697 " "
+                    BLOCK_EXPR@697..713
+                      STMT_LIST@697..713
+                        L_CURLY@697..698 "{"
+                        WHITESPACE@698..699 " "
+                        EXPR_STMT@699..711
+                          METHOD_CALL_EXPR@699..710
+                            PATH_EXPR@699..700
+                              PATH@699..700
+                                PATH_SEGMENT@699..700
+                                  NAME_REF@699..700
+                                    IDENT@699..700 "x"
+                            DOT@700..701 "."
+                            NAME_REF@701..704
+                              IDENT@701..704 "set"
+                            ARG_LIST@704..710
+                              L_PAREN@704..705 "("
+                              LITERAL@705..709
+                                TRUE_KW@705..709 "true"
+                              R_PAREN@709..710 ")"
+                          SEMICOLON@710..711 ";"
+                        WHITESPACE@711..712 " "
+                        R_CURLY@712..713 "}"
+                SEMICOLON@713..714 ";"
+              WHITESPACE@714..719 "\n    "
+              R_CURLY@719..720 "}"
+        WHITESPACE@720..725 "\n    "
+        LET_STMT@725..751
+          LET_KW@725..728 "let"
+          WHITESPACE@728..729 " "
+          IDENT_PAT@729..730
+            NAME@729..730
+              IDENT@729..730 "i"
+          WHITESPACE@730..731 " "
+          EQ@731..732 "="
+          WHITESPACE@732..733 " "
+          REF_EXPR@733..750
+            AMP@733..734 "&"
+            CALL_EXPR@734..750
+              PATH_EXPR@734..743
+                PATH@734..743
+                  PATH@734..738
+                    PATH_SEGMENT@734..738
+                      NAME_REF@734..738
+                        IDENT@734..738 "Cell"
+                  COLON2@738..740 "::"
+                  PATH_SEGMENT@740..743
+                    NAME_REF@740..743
+                      IDENT@740..743 "new"
+              ARG_LIST@743..750
+                L_PAREN@743..744 "("
+                LITERAL@744..749
+                  FALSE_KW@744..749 "false"
+                R_PAREN@749..750 ")"
+          SEMICOLON@750..751 ";"
+        WHITESPACE@751..756 "\n    "
+        LET_STMT@756..778
+          LET_KW@756..759 "let"
+          WHITESPACE@759..760 " "
+          IDENT_PAT@760..764
+            NAME@760..764
+              IDENT@760..764 "dont"
+          WHITESPACE@764..765 " "
+          EQ@765..766 "="
+          WHITESPACE@766..767 " "
+          BLOCK_EXPR@767..777
+            STMT_LIST@767..777
+              L_CURLY@767..768 "{"
+              CLOSURE_EXPR@768..776
+                PARAM_LIST@768..770
+                  PIPE@768..769 "|"
+                  PIPE@769..770 "|"
+                CALL_EXPR@770..776
+                  PATH_EXPR@770..773
+                    PATH@770..773
+                      PATH_SEGMENT@770..773
+                        NAME_REF@770..773
+                          IDENT@770..773 "the"
+                  ARG_LIST@773..776
+                    L_PAREN@773..774 "("
+                    PATH_EXPR@774..775
+                      PATH@774..775
+                        PATH_SEGMENT@774..775
+                          NAME_REF@774..775
+                            IDENT@774..775 "i"
+                    R_PAREN@775..776 ")"
+              R_CURLY@776..777 "}"
+          SEMICOLON@777..778 ";"
+        WHITESPACE@778..783 "\n    "
+        EXPR_STMT@783..790
+          CALL_EXPR@783..789
+            PATH_EXPR@783..787
+              PATH@783..787
+                PATH_SEGMENT@783..787
+                  NAME_REF@783..787
+                    IDENT@783..787 "dont"
+            ARG_LIST@787..789
+              L_PAREN@787..788 "("
+              R_PAREN@788..789 ")"
+          SEMICOLON@789..790 ";"
+        WHITESPACE@790..795 "\n    "
+        EXPR_STMT@795..814
+          MACRO_CALL@795..813
+            PATH@795..801
+              PATH_SEGMENT@795..801
+                NAME_REF@795..801
+                  IDENT@795..801 "assert"
+            BANG@801..802 "!"
+            TOKEN_TREE@802..813
+              L_PAREN@802..803 "("
+              TOKEN_TREE@803..812
+                L_PAREN@803..804 "("
+                IDENT@804..805 "i"
+                DOT@805..806 "."
+                IDENT@806..809 "get"
+                TOKEN_TREE@809..811
+                  L_PAREN@809..810 "("
+                  R_PAREN@810..811 ")"
+                R_PAREN@811..812 ")"
+              R_PAREN@812..813 ")"
+          SEMICOLON@813..814 ";"
+        WHITESPACE@814..815 "\n"
+        R_CURLY@815..816 "}"
   WHITESPACE@816..818 "\n\n"
   FN@818..1322
     FN_KW@818..820 "fn"
@@ -422,160 +429,170 @@ SOURCE_FILE@0..3813
       R_PAREN@833..834 ")"
     WHITESPACE@834..835 " "
     BLOCK_EXPR@835..1322
-      L_CURLY@835..836 "{"
-      WHITESPACE@836..841 "\n    "
-      LOOP_EXPR@841..1320
-        LOOP_KW@841..845 "loop"
-        WHITESPACE@845..846 " "
-        BLOCK_EXPR@846..1320
-          L_CURLY@846..847 "{"
-          WHITESPACE@847..856 "\n        "
-          EXPR_STMT@856..1283
-            WHILE_EXPR@856..1283
-              WHILE_KW@856..861 "while"
-              WHITESPACE@861..862 " "
-              CONDITION@862..870
-                PAREN_EXPR@862..870
-                  L_PAREN@862..863 "("
-                  RETURN_EXPR@863..869
-                    RETURN_KW@863..869 "return"
-                  R_PAREN@869..870 ")"
-              WHITESPACE@870..871 " "
-              BLOCK_EXPR@871..1283
-                L_CURLY@871..872 "{"
-                WHITESPACE@872..885 "\n            "
-                IF_EXPR@885..1273
-                  IF_KW@885..887 "if"
-                  WHITESPACE@887..888 " "
-                  CONDITION@888..896
-                    PAREN_EXPR@888..896
-                      L_PAREN@888..889 "("
-                      RETURN_EXPR@889..895
-                        RETURN_KW@889..895 "return"
-                      R_PAREN@895..896 ")"
-                  WHITESPACE@896..897 " "
-                  BLOCK_EXPR@897..1216
-                    L_CURLY@897..898 "{"
-                    WHITESPACE@898..915 "\n                "
-                    EXPR_STMT@915..1202
-                      MATCH_EXPR@915..1201
-                        MATCH_KW@915..920 "match"
-                        WHITESPACE@920..921 " "
-                        PAREN_EXPR@921..929
-                          L_PAREN@921..922 "("
-                          RETURN_EXPR@922..928
-                            RETURN_KW@922..928 "return"
-                          R_PAREN@928..929 ")"
-                        WHITESPACE@929..930 " "
-                        MATCH_ARM_LIST@930..1201
-                          L_CURLY@930..931 "{"
-                          WHITESPACE@931..952 "\n                    "
-                          MATCH_ARM@952..1147
-                            LITERAL_PAT@952..953
-                              LITERAL@952..953
-                                INT_NUMBER@952..953 "1"
-                            WHITESPACE@953..954 " "
-                            FAT_ARROW@954..956 "=>"
-                            WHITESPACE@956..957 " "
-                            BLOCK_EXPR@957..1147
-                              L_CURLY@957..958 "{"
-                              WHITESPACE@958..983 "\n                     ..."
-                              IF_EXPR@983..1125
-                                IF_KW@983..985 "if"
-                                WHITESPACE@985..986 " "
-                                CONDITION@986..994
-                                  PAREN_EXPR@986..994
-                                    L_PAREN@986..987 "("
-                                    RETURN_EXPR@987..993
-                                      RETURN_KW@987..993 "return"
-                                    R_PAREN@993..994 ")"
-                                WHITESPACE@994..995 " "
-                                BLOCK_EXPR@995..1057
-                                  L_CURLY@995..996 "{"
-                                  WHITESPACE@996..1025 "\n                     ..."
-                                  RETURN_EXPR@1025..1031
-                                    RETURN_KW@1025..1031 "return"
-                                  WHITESPACE@1031..1056 "\n                     ..."
-                                  R_CURLY@1056..1057 "}"
-                                WHITESPACE@1057..1058 " "
-                                ELSE_KW@1058..1062 "else"
-                                WHITESPACE@1062..1063 " "
-                                BLOCK_EXPR@1063..1125
-                                  L_CURLY@1063..1064 "{"
-                                  WHITESPACE@1064..1093 "\n                     ..."
-                                  RETURN_EXPR@1093..1099
-                                    RETURN_KW@1093..1099 "return"
-                                  WHITESPACE@1099..1124 "\n                     ..."
-                                  R_CURLY@1124..1125 "}"
-                              WHITESPACE@1125..1146 "\n                    "
-                              R_CURLY@1146..1147 "}"
-                          WHITESPACE@1147..1168 "\n                    "
-                          MATCH_ARM@1168..1183
-                            WILDCARD_PAT@1168..1169
-                              UNDERSCORE@1168..1169 "_"
-                            WHITESPACE@1169..1170 " "
-                            FAT_ARROW@1170..1172 "=>"
-                            WHITESPACE@1172..1173 " "
-                            BLOCK_EXPR@1173..1183
-                              L_CURLY@1173..1174 "{"
-                              WHITESPACE@1174..1175 " "
-                              RETURN_EXPR@1175..1181
-                                RETURN_KW@1175..1181 "return"
-                              WHITESPACE@1181..1182 " "
-                              R_CURLY@1182..1183 "}"
-                          WHITESPACE@1183..1200 "\n                "
-                          R_CURLY@1200..1201 "}"
-                      SEMICOLON@1201..1202 ";"
-                    WHITESPACE@1202..1215 "\n            "
-                    R_CURLY@1215..1216 "}"
-                  WHITESPACE@1216..1217 " "
-                  ELSE_KW@1217..1221 "else"
-                  WHITESPACE@1221..1222 " "
-                  IF_EXPR@1222..1273
-                    IF_KW@1222..1224 "if"
-                    WHITESPACE@1224..1225 " "
-                    CONDITION@1225..1233
-                      PAREN_EXPR@1225..1233
-                        L_PAREN@1225..1226 "("
-                        RETURN_EXPR@1226..1232
-                          RETURN_KW@1226..1232 "return"
-                        R_PAREN@1232..1233 ")"
-                    WHITESPACE@1233..1234 " "
-                    BLOCK_EXPR@1234..1273
-                      L_CURLY@1234..1235 "{"
-                      WHITESPACE@1235..1252 "\n                "
-                      EXPR_STMT@1252..1259
-                        RETURN_EXPR@1252..1258
-                          RETURN_KW@1252..1258 "return"
-                        SEMICOLON@1258..1259 ";"
-                      WHITESPACE@1259..1272 "\n            "
-                      R_CURLY@1272..1273 "}"
-                WHITESPACE@1273..1282 "\n        "
-                R_CURLY@1282..1283 "}"
-          WHITESPACE@1283..1292 "\n        "
-          IF_EXPR@1292..1314
-            IF_KW@1292..1294 "if"
-            WHITESPACE@1294..1295 " "
-            CONDITION@1295..1303
-              PAREN_EXPR@1295..1303
-                L_PAREN@1295..1296 "("
-                RETURN_EXPR@1296..1302
-                  RETURN_KW@1296..1302 "return"
-                R_PAREN@1302..1303 ")"
-            WHITESPACE@1303..1304 " "
-            BLOCK_EXPR@1304..1314
-              L_CURLY@1304..1305 "{"
-              WHITESPACE@1305..1306 " "
-              EXPR_STMT@1306..1312
-                BREAK_EXPR@1306..1311
-                  BREAK_KW@1306..1311 "break"
-                SEMICOLON@1311..1312 ";"
-              WHITESPACE@1312..1313 " "
-              R_CURLY@1313..1314 "}"
-          WHITESPACE@1314..1319 "\n    "
-          R_CURLY@1319..1320 "}"
-      WHITESPACE@1320..1321 "\n"
-      R_CURLY@1321..1322 "}"
+      STMT_LIST@835..1322
+        L_CURLY@835..836 "{"
+        WHITESPACE@836..841 "\n    "
+        LOOP_EXPR@841..1320
+          LOOP_KW@841..845 "loop"
+          WHITESPACE@845..846 " "
+          BLOCK_EXPR@846..1320
+            STMT_LIST@846..1320
+              L_CURLY@846..847 "{"
+              WHITESPACE@847..856 "\n        "
+              EXPR_STMT@856..1283
+                WHILE_EXPR@856..1283
+                  WHILE_KW@856..861 "while"
+                  WHITESPACE@861..862 " "
+                  CONDITION@862..870
+                    PAREN_EXPR@862..870
+                      L_PAREN@862..863 "("
+                      RETURN_EXPR@863..869
+                        RETURN_KW@863..869 "return"
+                      R_PAREN@869..870 ")"
+                  WHITESPACE@870..871 " "
+                  BLOCK_EXPR@871..1283
+                    STMT_LIST@871..1283
+                      L_CURLY@871..872 "{"
+                      WHITESPACE@872..885 "\n            "
+                      IF_EXPR@885..1273
+                        IF_KW@885..887 "if"
+                        WHITESPACE@887..888 " "
+                        CONDITION@888..896
+                          PAREN_EXPR@888..896
+                            L_PAREN@888..889 "("
+                            RETURN_EXPR@889..895
+                              RETURN_KW@889..895 "return"
+                            R_PAREN@895..896 ")"
+                        WHITESPACE@896..897 " "
+                        BLOCK_EXPR@897..1216
+                          STMT_LIST@897..1216
+                            L_CURLY@897..898 "{"
+                            WHITESPACE@898..915 "\n                "
+                            EXPR_STMT@915..1202
+                              MATCH_EXPR@915..1201
+                                MATCH_KW@915..920 "match"
+                                WHITESPACE@920..921 " "
+                                PAREN_EXPR@921..929
+                                  L_PAREN@921..922 "("
+                                  RETURN_EXPR@922..928
+                                    RETURN_KW@922..928 "return"
+                                  R_PAREN@928..929 ")"
+                                WHITESPACE@929..930 " "
+                                MATCH_ARM_LIST@930..1201
+                                  L_CURLY@930..931 "{"
+                                  WHITESPACE@931..952 "\n                    "
+                                  MATCH_ARM@952..1147
+                                    LITERAL_PAT@952..953
+                                      LITERAL@952..953
+                                        INT_NUMBER@952..953 "1"
+                                    WHITESPACE@953..954 " "
+                                    FAT_ARROW@954..956 "=>"
+                                    WHITESPACE@956..957 " "
+                                    BLOCK_EXPR@957..1147
+                                      STMT_LIST@957..1147
+                                        L_CURLY@957..958 "{"
+                                        WHITESPACE@958..983 "\n                     ..."
+                                        IF_EXPR@983..1125
+                                          IF_KW@983..985 "if"
+                                          WHITESPACE@985..986 " "
+                                          CONDITION@986..994
+                                            PAREN_EXPR@986..994
+                                              L_PAREN@986..987 "("
+                                              RETURN_EXPR@987..993
+                                                RETURN_KW@987..993 "return"
+                                              R_PAREN@993..994 ")"
+                                          WHITESPACE@994..995 " "
+                                          BLOCK_EXPR@995..1057
+                                            STMT_LIST@995..1057
+                                              L_CURLY@995..996 "{"
+                                              WHITESPACE@996..1025 "\n                     ..."
+                                              RETURN_EXPR@1025..1031
+                                                RETURN_KW@1025..1031 "return"
+                                              WHITESPACE@1031..1056 "\n                     ..."
+                                              R_CURLY@1056..1057 "}"
+                                          WHITESPACE@1057..1058 " "
+                                          ELSE_KW@1058..1062 "else"
+                                          WHITESPACE@1062..1063 " "
+                                          BLOCK_EXPR@1063..1125
+                                            STMT_LIST@1063..1125
+                                              L_CURLY@1063..1064 "{"
+                                              WHITESPACE@1064..1093 "\n                     ..."
+                                              RETURN_EXPR@1093..1099
+                                                RETURN_KW@1093..1099 "return"
+                                              WHITESPACE@1099..1124 "\n                     ..."
+                                              R_CURLY@1124..1125 "}"
+                                        WHITESPACE@1125..1146 "\n                    "
+                                        R_CURLY@1146..1147 "}"
+                                  WHITESPACE@1147..1168 "\n                    "
+                                  MATCH_ARM@1168..1183
+                                    WILDCARD_PAT@1168..1169
+                                      UNDERSCORE@1168..1169 "_"
+                                    WHITESPACE@1169..1170 " "
+                                    FAT_ARROW@1170..1172 "=>"
+                                    WHITESPACE@1172..1173 " "
+                                    BLOCK_EXPR@1173..1183
+                                      STMT_LIST@1173..1183
+                                        L_CURLY@1173..1174 "{"
+                                        WHITESPACE@1174..1175 " "
+                                        RETURN_EXPR@1175..1181
+                                          RETURN_KW@1175..1181 "return"
+                                        WHITESPACE@1181..1182 " "
+                                        R_CURLY@1182..1183 "}"
+                                  WHITESPACE@1183..1200 "\n                "
+                                  R_CURLY@1200..1201 "}"
+                              SEMICOLON@1201..1202 ";"
+                            WHITESPACE@1202..1215 "\n            "
+                            R_CURLY@1215..1216 "}"
+                        WHITESPACE@1216..1217 " "
+                        ELSE_KW@1217..1221 "else"
+                        WHITESPACE@1221..1222 " "
+                        IF_EXPR@1222..1273
+                          IF_KW@1222..1224 "if"
+                          WHITESPACE@1224..1225 " "
+                          CONDITION@1225..1233
+                            PAREN_EXPR@1225..1233
+                              L_PAREN@1225..1226 "("
+                              RETURN_EXPR@1226..1232
+                                RETURN_KW@1226..1232 "return"
+                              R_PAREN@1232..1233 ")"
+                          WHITESPACE@1233..1234 " "
+                          BLOCK_EXPR@1234..1273
+                            STMT_LIST@1234..1273
+                              L_CURLY@1234..1235 "{"
+                              WHITESPACE@1235..1252 "\n                "
+                              EXPR_STMT@1252..1259
+                                RETURN_EXPR@1252..1258
+                                  RETURN_KW@1252..1258 "return"
+                                SEMICOLON@1258..1259 ";"
+                              WHITESPACE@1259..1272 "\n            "
+                              R_CURLY@1272..1273 "}"
+                      WHITESPACE@1273..1282 "\n        "
+                      R_CURLY@1282..1283 "}"
+              WHITESPACE@1283..1292 "\n        "
+              IF_EXPR@1292..1314
+                IF_KW@1292..1294 "if"
+                WHITESPACE@1294..1295 " "
+                CONDITION@1295..1303
+                  PAREN_EXPR@1295..1303
+                    L_PAREN@1295..1296 "("
+                    RETURN_EXPR@1296..1302
+                      RETURN_KW@1296..1302 "return"
+                    R_PAREN@1302..1303 ")"
+                WHITESPACE@1303..1304 " "
+                BLOCK_EXPR@1304..1314
+                  STMT_LIST@1304..1314
+                    L_CURLY@1304..1305 "{"
+                    WHITESPACE@1305..1306 " "
+                    EXPR_STMT@1306..1312
+                      BREAK_EXPR@1306..1311
+                        BREAK_KW@1306..1311 "break"
+                      SEMICOLON@1311..1312 ";"
+                    WHITESPACE@1312..1313 " "
+                    R_CURLY@1313..1314 "}"
+              WHITESPACE@1314..1319 "\n    "
+              R_CURLY@1319..1320 "}"
+        WHITESPACE@1320..1321 "\n"
+        R_CURLY@1321..1322 "}"
   WHITESPACE@1322..1324 "\n\n"
   FN@1324..1539
     FN_KW@1324..1326 "fn"
@@ -587,232 +604,233 @@ SOURCE_FILE@0..3813
       R_PAREN@1335..1336 ")"
     WHITESPACE@1336..1337 " "
     BLOCK_EXPR@1337..1539
-      L_CURLY@1337..1338 "{"
-      WHITESPACE@1338..1343 "\n    "
-      LET_STMT@1343..1361
-        LET_KW@1343..1346 "let"
-        WHITESPACE@1346..1347 " "
-        IDENT_PAT@1347..1353
-          MUT_KW@1347..1350 "mut"
-          WHITESPACE@1350..1351 " "
-          NAME@1351..1353
-            IDENT@1351..1353 "_x"
-        COLON@1353..1354 ":"
-        WHITESPACE@1354..1355 " "
-        PATH_TYPE@1355..1360
-          PATH@1355..1360
-            PATH_SEGMENT@1355..1360
-              NAME_REF@1355..1360
-                IDENT@1355..1360 "isize"
-        SEMICOLON@1360..1361 ";"
-      WHITESPACE@1361..1366 "\n    "
-      LET_STMT@1366..1400
-        LET_KW@1366..1369 "let"
-        WHITESPACE@1369..1370 " "
-        IDENT_PAT@1370..1376
-          MUT_KW@1370..1373 "mut"
-          WHITESPACE@1373..1374 " "
-          NAME@1374..1376
-            IDENT@1374..1376 "_y"
-        WHITESPACE@1376..1377 " "
-        EQ@1377..1378 "="
-        WHITESPACE@1378..1379 " "
-        BIN_EXPR@1379..1399
-          PAREN_EXPR@1379..1387
-            L_PAREN@1379..1380 "("
-            BIN_EXPR@1380..1386
-              PATH_EXPR@1380..1382
-                PATH@1380..1382
-                  PATH_SEGMENT@1380..1382
-                    NAME_REF@1380..1382
-                      IDENT@1380..1382 "_x"
-              WHITESPACE@1382..1383 " "
-              EQ@1383..1384 "="
-              WHITESPACE@1384..1385 " "
-              LITERAL@1385..1386
-                INT_NUMBER@1385..1386 "0"
-            R_PAREN@1386..1387 ")"
-          WHITESPACE@1387..1388 " "
-          EQ2@1388..1390 "=="
-          WHITESPACE@1390..1391 " "
-          PAREN_EXPR@1391..1399
-            L_PAREN@1391..1392 "("
-            BIN_EXPR@1392..1398
-              PATH_EXPR@1392..1394
-                PATH@1392..1394
-                  PATH_SEGMENT@1392..1394
-                    NAME_REF@1392..1394
-                      IDENT@1392..1394 "_x"
-              WHITESPACE@1394..1395 " "
-              EQ@1395..1396 "="
-              WHITESPACE@1396..1397 " "
-              LITERAL@1397..1398
-                INT_NUMBER@1397..1398 "0"
-            R_PAREN@1398..1399 ")"
-        SEMICOLON@1399..1400 ";"
-      WHITESPACE@1400..1405 "\n    "
-      LET_STMT@1405..1438
-        LET_KW@1405..1408 "let"
-        WHITESPACE@1408..1409 " "
-        IDENT_PAT@1409..1415
-          MUT_KW@1409..1412 "mut"
-          WHITESPACE@1412..1413 " "
-          NAME@1413..1415
-            IDENT@1413..1415 "_z"
-        WHITESPACE@1415..1416 " "
-        EQ@1416..1417 "="
-        WHITESPACE@1417..1418 " "
-        BIN_EXPR@1418..1437
-          PAREN_EXPR@1418..1426
-            L_PAREN@1418..1419 "("
-            BIN_EXPR@1419..1425
-              PATH_EXPR@1419..1421
-                PATH@1419..1421
-                  PATH_SEGMENT@1419..1421
-                    NAME_REF@1419..1421
-                      IDENT@1419..1421 "_x"
-              WHITESPACE@1421..1422 " "
-              EQ@1422..1423 "="
-              WHITESPACE@1423..1424 " "
-              LITERAL@1424..1425
-                INT_NUMBER@1424..1425 "0"
-            R_PAREN@1425..1426 ")"
-          WHITESPACE@1426..1427 " "
-          L_ANGLE@1427..1428 "<"
-          WHITESPACE@1428..1429 " "
-          PAREN_EXPR@1429..1437
-            L_PAREN@1429..1430 "("
-            BIN_EXPR@1430..1436
-              PATH_EXPR@1430..1432
-                PATH@1430..1432
-                  PATH_SEGMENT@1430..1432
-                    NAME_REF@1430..1432
-                      IDENT@1430..1432 "_x"
-              WHITESPACE@1432..1433 " "
-              EQ@1433..1434 "="
-              WHITESPACE@1434..1435 " "
-              LITERAL@1435..1436
-                INT_NUMBER@1435..1436 "0"
-            R_PAREN@1436..1437 ")"
-        SEMICOLON@1437..1438 ";"
-      WHITESPACE@1438..1443 "\n    "
-      LET_STMT@1443..1474
-        LET_KW@1443..1446 "let"
-        WHITESPACE@1446..1447 " "
-        IDENT_PAT@1447..1449
-          NAME@1447..1449
-            IDENT@1447..1449 "_a"
-        WHITESPACE@1449..1450 " "
-        EQ@1450..1451 "="
-        WHITESPACE@1451..1452 " "
-        BIN_EXPR@1452..1473
-          PAREN_EXPR@1452..1461
-            L_PAREN@1452..1453 "("
-            BIN_EXPR@1453..1460
-              PATH_EXPR@1453..1455
-                PATH@1453..1455
-                  PATH_SEGMENT@1453..1455
-                    NAME_REF@1453..1455
-                      IDENT@1453..1455 "_x"
-              WHITESPACE@1455..1456 " "
-              PLUSEQ@1456..1458 "+="
-              WHITESPACE@1458..1459 " "
-              LITERAL@1459..1460
-                INT_NUMBER@1459..1460 "0"
-            R_PAREN@1460..1461 ")"
-          WHITESPACE@1461..1462 " "
-          EQ2@1462..1464 "=="
-          WHITESPACE@1464..1465 " "
-          PAREN_EXPR@1465..1473
-            L_PAREN@1465..1466 "("
-            BIN_EXPR@1466..1472
-              PATH_EXPR@1466..1468
-                PATH@1466..1468
-                  PATH_SEGMENT@1466..1468
-                    NAME_REF@1466..1468
-                      IDENT@1466..1468 "_x"
-              WHITESPACE@1468..1469 " "
-              EQ@1469..1470 "="
-              WHITESPACE@1470..1471 " "
-              LITERAL@1471..1472
-                INT_NUMBER@1471..1472 "0"
-            R_PAREN@1472..1473 ")"
-        SEMICOLON@1473..1474 ";"
-      WHITESPACE@1474..1479 "\n    "
-      LET_STMT@1479..1537
-        LET_KW@1479..1482 "let"
-        WHITESPACE@1482..1483 " "
-        IDENT_PAT@1483..1485
-          NAME@1483..1485
-            IDENT@1483..1485 "_b"
-        WHITESPACE@1485..1486 " "
-        EQ@1486..1487 "="
-        WHITESPACE@1487..1488 " "
-        BIN_EXPR@1488..1536
-          CALL_EXPR@1488..1510
-            PATH_EXPR@1488..1492
-              PATH@1488..1492
-                PATH_SEGMENT@1488..1492
-                  NAME_REF@1488..1492
-                    IDENT@1488..1492 "swap"
-            ARG_LIST@1492..1510
-              L_PAREN@1492..1493 "("
-              REF_EXPR@1493..1500
-                AMP@1493..1494 "&"
-                MUT_KW@1494..1497 "mut"
-                WHITESPACE@1497..1498 " "
-                PATH_EXPR@1498..1500
-                  PATH@1498..1500
-                    PATH_SEGMENT@1498..1500
-                      NAME_REF@1498..1500
-                        IDENT@1498..1500 "_y"
-              COMMA@1500..1501 ","
-              WHITESPACE@1501..1502 " "
-              REF_EXPR@1502..1509
-                AMP@1502..1503 "&"
-                MUT_KW@1503..1506 "mut"
-                WHITESPACE@1506..1507 " "
-                PATH_EXPR@1507..1509
-                  PATH@1507..1509
-                    PATH_SEGMENT@1507..1509
-                      NAME_REF@1507..1509
-                        IDENT@1507..1509 "_z"
-              R_PAREN@1509..1510 ")"
-          WHITESPACE@1510..1511 " "
-          EQ2@1511..1513 "=="
-          WHITESPACE@1513..1514 " "
-          CALL_EXPR@1514..1536
-            PATH_EXPR@1514..1518
-              PATH@1514..1518
-                PATH_SEGMENT@1514..1518
-                  NAME_REF@1514..1518
-                    IDENT@1514..1518 "swap"
-            ARG_LIST@1518..1536
-              L_PAREN@1518..1519 "("
-              REF_EXPR@1519..1526
-                AMP@1519..1520 "&"
-                MUT_KW@1520..1523 "mut"
-                WHITESPACE@1523..1524 " "
-                PATH_EXPR@1524..1526
-                  PATH@1524..1526
-                    PATH_SEGMENT@1524..1526
-                      NAME_REF@1524..1526
-                        IDENT@1524..1526 "_y"
-              COMMA@1526..1527 ","
-              WHITESPACE@1527..1528 " "
-              REF_EXPR@1528..1535
-                AMP@1528..1529 "&"
-                MUT_KW@1529..1532 "mut"
-                WHITESPACE@1532..1533 " "
-                PATH_EXPR@1533..1535
-                  PATH@1533..1535
-                    PATH_SEGMENT@1533..1535
-                      NAME_REF@1533..1535
-                        IDENT@1533..1535 "_z"
-              R_PAREN@1535..1536 ")"
-        SEMICOLON@1536..1537 ";"
-      WHITESPACE@1537..1538 "\n"
-      R_CURLY@1538..1539 "}"
+      STMT_LIST@1337..1539
+        L_CURLY@1337..1338 "{"
+        WHITESPACE@1338..1343 "\n    "
+        LET_STMT@1343..1361
+          LET_KW@1343..1346 "let"
+          WHITESPACE@1346..1347 " "
+          IDENT_PAT@1347..1353
+            MUT_KW@1347..1350 "mut"
+            WHITESPACE@1350..1351 " "
+            NAME@1351..1353
+              IDENT@1351..1353 "_x"
+          COLON@1353..1354 ":"
+          WHITESPACE@1354..1355 " "
+          PATH_TYPE@1355..1360
+            PATH@1355..1360
+              PATH_SEGMENT@1355..1360
+                NAME_REF@1355..1360
+                  IDENT@1355..1360 "isize"
+          SEMICOLON@1360..1361 ";"
+        WHITESPACE@1361..1366 "\n    "
+        LET_STMT@1366..1400
+          LET_KW@1366..1369 "let"
+          WHITESPACE@1369..1370 " "
+          IDENT_PAT@1370..1376
+            MUT_KW@1370..1373 "mut"
+            WHITESPACE@1373..1374 " "
+            NAME@1374..1376
+              IDENT@1374..1376 "_y"
+          WHITESPACE@1376..1377 " "
+          EQ@1377..1378 "="
+          WHITESPACE@1378..1379 " "
+          BIN_EXPR@1379..1399
+            PAREN_EXPR@1379..1387
+              L_PAREN@1379..1380 "("
+              BIN_EXPR@1380..1386
+                PATH_EXPR@1380..1382
+                  PATH@1380..1382
+                    PATH_SEGMENT@1380..1382
+                      NAME_REF@1380..1382
+                        IDENT@1380..1382 "_x"
+                WHITESPACE@1382..1383 " "
+                EQ@1383..1384 "="
+                WHITESPACE@1384..1385 " "
+                LITERAL@1385..1386
+                  INT_NUMBER@1385..1386 "0"
+              R_PAREN@1386..1387 ")"
+            WHITESPACE@1387..1388 " "
+            EQ2@1388..1390 "=="
+            WHITESPACE@1390..1391 " "
+            PAREN_EXPR@1391..1399
+              L_PAREN@1391..1392 "("
+              BIN_EXPR@1392..1398
+                PATH_EXPR@1392..1394
+                  PATH@1392..1394
+                    PATH_SEGMENT@1392..1394
+                      NAME_REF@1392..1394
+                        IDENT@1392..1394 "_x"
+                WHITESPACE@1394..1395 " "
+                EQ@1395..1396 "="
+                WHITESPACE@1396..1397 " "
+                LITERAL@1397..1398
+                  INT_NUMBER@1397..1398 "0"
+              R_PAREN@1398..1399 ")"
+          SEMICOLON@1399..1400 ";"
+        WHITESPACE@1400..1405 "\n    "
+        LET_STMT@1405..1438
+          LET_KW@1405..1408 "let"
+          WHITESPACE@1408..1409 " "
+          IDENT_PAT@1409..1415
+            MUT_KW@1409..1412 "mut"
+            WHITESPACE@1412..1413 " "
+            NAME@1413..1415
+              IDENT@1413..1415 "_z"
+          WHITESPACE@1415..1416 " "
+          EQ@1416..1417 "="
+          WHITESPACE@1417..1418 " "
+          BIN_EXPR@1418..1437
+            PAREN_EXPR@1418..1426
+              L_PAREN@1418..1419 "("
+              BIN_EXPR@1419..1425
+                PATH_EXPR@1419..1421
+                  PATH@1419..1421
+                    PATH_SEGMENT@1419..1421
+                      NAME_REF@1419..1421
+                        IDENT@1419..1421 "_x"
+                WHITESPACE@1421..1422 " "
+                EQ@1422..1423 "="
+                WHITESPACE@1423..1424 " "
+                LITERAL@1424..1425
+                  INT_NUMBER@1424..1425 "0"
+              R_PAREN@1425..1426 ")"
+            WHITESPACE@1426..1427 " "
+            L_ANGLE@1427..1428 "<"
+            WHITESPACE@1428..1429 " "
+            PAREN_EXPR@1429..1437
+              L_PAREN@1429..1430 "("
+              BIN_EXPR@1430..1436
+                PATH_EXPR@1430..1432
+                  PATH@1430..1432
+                    PATH_SEGMENT@1430..1432
+                      NAME_REF@1430..1432
+                        IDENT@1430..1432 "_x"
+                WHITESPACE@1432..1433 " "
+                EQ@1433..1434 "="
+                WHITESPACE@1434..1435 " "
+                LITERAL@1435..1436
+                  INT_NUMBER@1435..1436 "0"
+              R_PAREN@1436..1437 ")"
+          SEMICOLON@1437..1438 ";"
+        WHITESPACE@1438..1443 "\n    "
+        LET_STMT@1443..1474
+          LET_KW@1443..1446 "let"
+          WHITESPACE@1446..1447 " "
+          IDENT_PAT@1447..1449
+            NAME@1447..1449
+              IDENT@1447..1449 "_a"
+          WHITESPACE@1449..1450 " "
+          EQ@1450..1451 "="
+          WHITESPACE@1451..1452 " "
+          BIN_EXPR@1452..1473
+            PAREN_EXPR@1452..1461
+              L_PAREN@1452..1453 "("
+              BIN_EXPR@1453..1460
+                PATH_EXPR@1453..1455
+                  PATH@1453..1455
+                    PATH_SEGMENT@1453..1455
+                      NAME_REF@1453..1455
+                        IDENT@1453..1455 "_x"
+                WHITESPACE@1455..1456 " "
+                PLUSEQ@1456..1458 "+="
+                WHITESPACE@1458..1459 " "
+                LITERAL@1459..1460
+                  INT_NUMBER@1459..1460 "0"
+              R_PAREN@1460..1461 ")"
+            WHITESPACE@1461..1462 " "
+            EQ2@1462..1464 "=="
+            WHITESPACE@1464..1465 " "
+            PAREN_EXPR@1465..1473
+              L_PAREN@1465..1466 "("
+              BIN_EXPR@1466..1472
+                PATH_EXPR@1466..1468
+                  PATH@1466..1468
+                    PATH_SEGMENT@1466..1468
+                      NAME_REF@1466..1468
+                        IDENT@1466..1468 "_x"
+                WHITESPACE@1468..1469 " "
+                EQ@1469..1470 "="
+                WHITESPACE@1470..1471 " "
+                LITERAL@1471..1472
+                  INT_NUMBER@1471..1472 "0"
+              R_PAREN@1472..1473 ")"
+          SEMICOLON@1473..1474 ";"
+        WHITESPACE@1474..1479 "\n    "
+        LET_STMT@1479..1537
+          LET_KW@1479..1482 "let"
+          WHITESPACE@1482..1483 " "
+          IDENT_PAT@1483..1485
+            NAME@1483..1485
+              IDENT@1483..1485 "_b"
+          WHITESPACE@1485..1486 " "
+          EQ@1486..1487 "="
+          WHITESPACE@1487..1488 " "
+          BIN_EXPR@1488..1536
+            CALL_EXPR@1488..1510
+              PATH_EXPR@1488..1492
+                PATH@1488..1492
+                  PATH_SEGMENT@1488..1492
+                    NAME_REF@1488..1492
+                      IDENT@1488..1492 "swap"
+              ARG_LIST@1492..1510
+                L_PAREN@1492..1493 "("
+                REF_EXPR@1493..1500
+                  AMP@1493..1494 "&"
+                  MUT_KW@1494..1497 "mut"
+                  WHITESPACE@1497..1498 " "
+                  PATH_EXPR@1498..1500
+                    PATH@1498..1500
+                      PATH_SEGMENT@1498..1500
+                        NAME_REF@1498..1500
+                          IDENT@1498..1500 "_y"
+                COMMA@1500..1501 ","
+                WHITESPACE@1501..1502 " "
+                REF_EXPR@1502..1509
+                  AMP@1502..1503 "&"
+                  MUT_KW@1503..1506 "mut"
+                  WHITESPACE@1506..1507 " "
+                  PATH_EXPR@1507..1509
+                    PATH@1507..1509
+                      PATH_SEGMENT@1507..1509
+                        NAME_REF@1507..1509
+                          IDENT@1507..1509 "_z"
+                R_PAREN@1509..1510 ")"
+            WHITESPACE@1510..1511 " "
+            EQ2@1511..1513 "=="
+            WHITESPACE@1513..1514 " "
+            CALL_EXPR@1514..1536
+              PATH_EXPR@1514..1518
+                PATH@1514..1518
+                  PATH_SEGMENT@1514..1518
+                    NAME_REF@1514..1518
+                      IDENT@1514..1518 "swap"
+              ARG_LIST@1518..1536
+                L_PAREN@1518..1519 "("
+                REF_EXPR@1519..1526
+                  AMP@1519..1520 "&"
+                  MUT_KW@1520..1523 "mut"
+                  WHITESPACE@1523..1524 " "
+                  PATH_EXPR@1524..1526
+                    PATH@1524..1526
+                      PATH_SEGMENT@1524..1526
+                        NAME_REF@1524..1526
+                          IDENT@1524..1526 "_y"
+                COMMA@1526..1527 ","
+                WHITESPACE@1527..1528 " "
+                REF_EXPR@1528..1535
+                  AMP@1528..1529 "&"
+                  MUT_KW@1529..1532 "mut"
+                  WHITESPACE@1532..1533 " "
+                  PATH_EXPR@1533..1535
+                    PATH@1533..1535
+                      PATH_SEGMENT@1533..1535
+                        NAME_REF@1533..1535
+                          IDENT@1533..1535 "_z"
+                R_PAREN@1535..1536 ")"
+          SEMICOLON@1536..1537 ";"
+        WHITESPACE@1537..1538 "\n"
+        R_CURLY@1538..1539 "}"
   WHITESPACE@1539..1541 "\n\n"
   FN@1541..1741
     FN_KW@1541..1543 "fn"
@@ -833,165 +851,167 @@ SOURCE_FILE@0..3813
               IDENT@1563..1568 "usize"
     WHITESPACE@1568..1569 " "
     BLOCK_EXPR@1569..1741
-      L_CURLY@1569..1570 "{"
-      WHITESPACE@1570..1575 "\n    "
-      FN@1575..1598
-        FN_KW@1575..1577 "fn"
-        WHITESPACE@1577..1578 " "
-        NAME@1578..1579
-          IDENT@1578..1579 "p"
-        PARAM_LIST@1579..1581
-          L_PAREN@1579..1580 "("
-          R_PAREN@1580..1581 ")"
-        WHITESPACE@1581..1582 " "
-        RET_TYPE@1582..1589
-          THIN_ARROW@1582..1584 "->"
-          WHITESPACE@1584..1585 " "
-          PATH_TYPE@1585..1589
-            PATH@1585..1589
-              PATH_SEGMENT@1585..1589
-                NAME_REF@1585..1589
-                  IDENT@1585..1589 "bool"
-        WHITESPACE@1589..1590 " "
-        BLOCK_EXPR@1590..1598
-          L_CURLY@1590..1591 "{"
-          WHITESPACE@1591..1592 " "
-          LITERAL@1592..1596
-            TRUE_KW@1592..1596 "true"
-          WHITESPACE@1596..1597 " "
-          R_CURLY@1597..1598 "}"
-      WHITESPACE@1598..1603 "\n    "
-      LET_STMT@1603..1648
-        LET_KW@1603..1606 "let"
-        WHITESPACE@1606..1607 " "
-        IDENT_PAT@1607..1609
-          NAME@1607..1609
-            IDENT@1607..1609 "_a"
-        WHITESPACE@1609..1610 " "
-        EQ@1610..1611 "="
-        WHITESPACE@1611..1612 " "
-        PAREN_EXPR@1612..1647
-          L_PAREN@1612..1613 "("
-          BIN_EXPR@1613..1646
-            MACRO_CALL@1613..1628
-              PATH@1613..1619
-                PATH_SEGMENT@1613..1619
-                  NAME_REF@1613..1619
-                    IDENT@1613..1619 "assert"
-              BANG@1619..1620 "!"
-              TOKEN_TREE@1620..1628
-                L_PAREN@1620..1621 "("
-                TOKEN_TREE@1621..1627
-                  L_PAREN@1621..1622 "("
-                  TRUE_KW@1622..1626 "true"
-                  R_PAREN@1626..1627 ")"
-                R_PAREN@1627..1628 ")"
-            WHITESPACE@1628..1629 " "
-            EQ2@1629..1631 "=="
-            WHITESPACE@1631..1632 " "
-            PAREN_EXPR@1632..1646
-              L_PAREN@1632..1633 "("
-              MACRO_CALL@1633..1645
-                PATH@1633..1639
-                  PATH_SEGMENT@1633..1639
-                    NAME_REF@1633..1639
-                      IDENT@1633..1639 "assert"
-                BANG@1639..1640 "!"
-                TOKEN_TREE@1640..1645
-                  L_PAREN@1640..1641 "("
-                  IDENT@1641..1642 "p"
-                  TOKEN_TREE@1642..1644
-                    L_PAREN@1642..1643 "("
-                    R_PAREN@1643..1644 ")"
-                  R_PAREN@1644..1645 ")"
-              R_PAREN@1645..1646 ")"
-          R_PAREN@1646..1647 ")"
-        SEMICOLON@1647..1648 ";"
-      WHITESPACE@1648..1653 "\n    "
-      LET_STMT@1653..1685
-        LET_KW@1653..1656 "let"
-        WHITESPACE@1656..1657 " "
-        IDENT_PAT@1657..1659
-          NAME@1657..1659
-            IDENT@1657..1659 "_c"
-        WHITESPACE@1659..1660 " "
-        EQ@1660..1661 "="
-        WHITESPACE@1661..1662 " "
-        PAREN_EXPR@1662..1684
-          L_PAREN@1662..1663 "("
-          BIN_EXPR@1663..1683
-            MACRO_CALL@1663..1677
-              PATH@1663..1669
-                PATH_SEGMENT@1663..1669
-                  NAME_REF@1663..1669
-                    IDENT@1663..1669 "assert"
-              BANG@1669..1670 "!"
-              TOKEN_TREE@1670..1677
-                L_PAREN@1670..1671 "("
-                TOKEN_TREE@1671..1676
-                  L_PAREN@1671..1672 "("
-                  IDENT@1672..1673 "p"
-                  TOKEN_TREE@1673..1675
-                    L_PAREN@1673..1674 "("
-                    R_PAREN@1674..1675 ")"
-                  R_PAREN@1675..1676 ")"
-                R_PAREN@1676..1677 ")"
-            WHITESPACE@1677..1678 " "
-            EQ2@1678..1680 "=="
-            WHITESPACE@1680..1681 " "
-            TUPLE_EXPR@1681..1683
-              L_PAREN@1681..1682 "("
-              R_PAREN@1682..1683 ")"
-          R_PAREN@1683..1684 ")"
-        SEMICOLON@1684..1685 ";"
-      WHITESPACE@1685..1690 "\n    "
-      LET_STMT@1690..1739
-        LET_KW@1690..1693 "let"
-        WHITESPACE@1693..1694 " "
-        IDENT_PAT@1694..1696
-          NAME@1694..1696
-            IDENT@1694..1696 "_b"
-        COLON@1696..1697 ":"
-        WHITESPACE@1697..1698 " "
-        PATH_TYPE@1698..1702
-          PATH@1698..1702
-            PATH_SEGMENT@1698..1702
-              NAME_REF@1698..1702
-                IDENT@1698..1702 "bool"
-        WHITESPACE@1702..1703 " "
-        EQ@1703..1704 "="
-        WHITESPACE@1704..1705 " "
-        PAREN_EXPR@1705..1738
-          L_PAREN@1705..1706 "("
-          BIN_EXPR@1706..1737
-            MACRO_CALL@1706..1723
-              PATH@1706..1713
-                PATH_SEGMENT@1706..1713
-                  NAME_REF@1706..1713
-                    IDENT@1706..1713 "println"
-              BANG@1713..1714 "!"
-              TOKEN_TREE@1714..1723
-                L_PAREN@1714..1715 "("
-                STRING@1715..1719 "\"{}\""
-                COMMA@1719..1720 ","
-                WHITESPACE@1720..1721 " "
-                INT_NUMBER@1721..1722 "0"
-                R_PAREN@1722..1723 ")"
-            WHITESPACE@1723..1724 " "
-            EQ2@1724..1726 "=="
-            WHITESPACE@1726..1727 " "
-            PAREN_EXPR@1727..1737
-              L_PAREN@1727..1728 "("
-              RETURN_EXPR@1728..1736
-                RETURN_KW@1728..1734 "return"
-                WHITESPACE@1734..1735 " "
-                LITERAL@1735..1736
-                  INT_NUMBER@1735..1736 "0"
-              R_PAREN@1736..1737 ")"
-          R_PAREN@1737..1738 ")"
-        SEMICOLON@1738..1739 ";"
-      WHITESPACE@1739..1740 "\n"
-      R_CURLY@1740..1741 "}"
+      STMT_LIST@1569..1741
+        L_CURLY@1569..1570 "{"
+        WHITESPACE@1570..1575 "\n    "
+        FN@1575..1598
+          FN_KW@1575..1577 "fn"
+          WHITESPACE@1577..1578 " "
+          NAME@1578..1579
+            IDENT@1578..1579 "p"
+          PARAM_LIST@1579..1581
+            L_PAREN@1579..1580 "("
+            R_PAREN@1580..1581 ")"
+          WHITESPACE@1581..1582 " "
+          RET_TYPE@1582..1589
+            THIN_ARROW@1582..1584 "->"
+            WHITESPACE@1584..1585 " "
+            PATH_TYPE@1585..1589
+              PATH@1585..1589
+                PATH_SEGMENT@1585..1589
+                  NAME_REF@1585..1589
+                    IDENT@1585..1589 "bool"
+          WHITESPACE@1589..1590 " "
+          BLOCK_EXPR@1590..1598
+            STMT_LIST@1590..1598
+              L_CURLY@1590..1591 "{"
+              WHITESPACE@1591..1592 " "
+              LITERAL@1592..1596
+                TRUE_KW@1592..1596 "true"
+              WHITESPACE@1596..1597 " "
+              R_CURLY@1597..1598 "}"
+        WHITESPACE@1598..1603 "\n    "
+        LET_STMT@1603..1648
+          LET_KW@1603..1606 "let"
+          WHITESPACE@1606..1607 " "
+          IDENT_PAT@1607..1609
+            NAME@1607..1609
+              IDENT@1607..1609 "_a"
+          WHITESPACE@1609..1610 " "
+          EQ@1610..1611 "="
+          WHITESPACE@1611..1612 " "
+          PAREN_EXPR@1612..1647
+            L_PAREN@1612..1613 "("
+            BIN_EXPR@1613..1646
+              MACRO_CALL@1613..1628
+                PATH@1613..1619
+                  PATH_SEGMENT@1613..1619
+                    NAME_REF@1613..1619
+                      IDENT@1613..1619 "assert"
+                BANG@1619..1620 "!"
+                TOKEN_TREE@1620..1628
+                  L_PAREN@1620..1621 "("
+                  TOKEN_TREE@1621..1627
+                    L_PAREN@1621..1622 "("
+                    TRUE_KW@1622..1626 "true"
+                    R_PAREN@1626..1627 ")"
+                  R_PAREN@1627..1628 ")"
+              WHITESPACE@1628..1629 " "
+              EQ2@1629..1631 "=="
+              WHITESPACE@1631..1632 " "
+              PAREN_EXPR@1632..1646
+                L_PAREN@1632..1633 "("
+                MACRO_CALL@1633..1645
+                  PATH@1633..1639
+                    PATH_SEGMENT@1633..1639
+                      NAME_REF@1633..1639
+                        IDENT@1633..1639 "assert"
+                  BANG@1639..1640 "!"
+                  TOKEN_TREE@1640..1645
+                    L_PAREN@1640..1641 "("
+                    IDENT@1641..1642 "p"
+                    TOKEN_TREE@1642..1644
+                      L_PAREN@1642..1643 "("
+                      R_PAREN@1643..1644 ")"
+                    R_PAREN@1644..1645 ")"
+                R_PAREN@1645..1646 ")"
+            R_PAREN@1646..1647 ")"
+          SEMICOLON@1647..1648 ";"
+        WHITESPACE@1648..1653 "\n    "
+        LET_STMT@1653..1685
+          LET_KW@1653..1656 "let"
+          WHITESPACE@1656..1657 " "
+          IDENT_PAT@1657..1659
+            NAME@1657..1659
+              IDENT@1657..1659 "_c"
+          WHITESPACE@1659..1660 " "
+          EQ@1660..1661 "="
+          WHITESPACE@1661..1662 " "
+          PAREN_EXPR@1662..1684
+            L_PAREN@1662..1663 "("
+            BIN_EXPR@1663..1683
+              MACRO_CALL@1663..1677
+                PATH@1663..1669
+                  PATH_SEGMENT@1663..1669
+                    NAME_REF@1663..1669
+                      IDENT@1663..1669 "assert"
+                BANG@1669..1670 "!"
+                TOKEN_TREE@1670..1677
+                  L_PAREN@1670..1671 "("
+                  TOKEN_TREE@1671..1676
+                    L_PAREN@1671..1672 "("
+                    IDENT@1672..1673 "p"
+                    TOKEN_TREE@1673..1675
+                      L_PAREN@1673..1674 "("
+                      R_PAREN@1674..1675 ")"
+                    R_PAREN@1675..1676 ")"
+                  R_PAREN@1676..1677 ")"
+              WHITESPACE@1677..1678 " "
+              EQ2@1678..1680 "=="
+              WHITESPACE@1680..1681 " "
+              TUPLE_EXPR@1681..1683
+                L_PAREN@1681..1682 "("
+                R_PAREN@1682..1683 ")"
+            R_PAREN@1683..1684 ")"
+          SEMICOLON@1684..1685 ";"
+        WHITESPACE@1685..1690 "\n    "
+        LET_STMT@1690..1739
+          LET_KW@1690..1693 "let"
+          WHITESPACE@1693..1694 " "
+          IDENT_PAT@1694..1696
+            NAME@1694..1696
+              IDENT@1694..1696 "_b"
+          COLON@1696..1697 ":"
+          WHITESPACE@1697..1698 " "
+          PATH_TYPE@1698..1702
+            PATH@1698..1702
+              PATH_SEGMENT@1698..1702
+                NAME_REF@1698..1702
+                  IDENT@1698..1702 "bool"
+          WHITESPACE@1702..1703 " "
+          EQ@1703..1704 "="
+          WHITESPACE@1704..1705 " "
+          PAREN_EXPR@1705..1738
+            L_PAREN@1705..1706 "("
+            BIN_EXPR@1706..1737
+              MACRO_CALL@1706..1723
+                PATH@1706..1713
+                  PATH_SEGMENT@1706..1713
+                    NAME_REF@1706..1713
+                      IDENT@1706..1713 "println"
+                BANG@1713..1714 "!"
+                TOKEN_TREE@1714..1723
+                  L_PAREN@1714..1715 "("
+                  STRING@1715..1719 "\"{}\""
+                  COMMA@1719..1720 ","
+                  WHITESPACE@1720..1721 " "
+                  INT_NUMBER@1721..1722 "0"
+                  R_PAREN@1722..1723 ")"
+              WHITESPACE@1723..1724 " "
+              EQ2@1724..1726 "=="
+              WHITESPACE@1726..1727 " "
+              PAREN_EXPR@1727..1737
+                L_PAREN@1727..1728 "("
+                RETURN_EXPR@1728..1736
+                  RETURN_KW@1728..1734 "return"
+                  WHITESPACE@1734..1735 " "
+                  LITERAL@1735..1736
+                    INT_NUMBER@1735..1736 "0"
+                R_PAREN@1736..1737 ")"
+            R_PAREN@1737..1738 ")"
+          SEMICOLON@1738..1739 ";"
+        WHITESPACE@1739..1740 "\n"
+        R_CURLY@1740..1741 "}"
   WHITESPACE@1741..1743 "\n\n"
   FN@1743..1904
     FN_KW@1743..1745 "fn"
@@ -1003,138 +1023,144 @@ SOURCE_FILE@0..3813
       R_PAREN@1756..1757 ")"
     WHITESPACE@1757..1758 " "
     BLOCK_EXPR@1758..1904
-      L_CURLY@1758..1759 "{"
-      WHITESPACE@1759..1764 "\n    "
-      EXPR_STMT@1764..1785
-        LOOP_EXPR@1764..1785
-          LOOP_KW@1764..1768 "loop"
-          WHITESPACE@1768..1769 " "
-          BLOCK_EXPR@1769..1785
-            L_CURLY@1769..1770 "{"
-            WHITESPACE@1770..1771 " "
-            IF_EXPR@1771..1783
-              IF_KW@1771..1773 "if"
-              WHITESPACE@1773..1774 " "
-              CONDITION@1774..1779
-                BREAK_EXPR@1774..1779
-                  BREAK_KW@1774..1779 "break"
-              WHITESPACE@1779..1780 " "
-              BLOCK_EXPR@1780..1783
-                L_CURLY@1780..1781 "{"
-                WHITESPACE@1781..1782 " "
-                R_CURLY@1782..1783 "}"
-            WHITESPACE@1783..1784 " "
-            R_CURLY@1784..1785 "}"
-      WHITESPACE@1785..1790 "\n    "
-      LET_STMT@1790..1804
-        LET_KW@1790..1793 "let"
-        WHITESPACE@1793..1794 " "
-        IDENT_PAT@1794..1799
-          MUT_KW@1794..1797 "mut"
-          WHITESPACE@1797..1798 " "
-          NAME@1798..1799
-            IDENT@1798..1799 "i"
-        WHITESPACE@1799..1800 " "
-        EQ@1800..1801 "="
-        WHITESPACE@1801..1802 " "
-        LITERAL@1802..1803
-          INT_NUMBER@1802..1803 "0"
-        SEMICOLON@1803..1804 ";"
-      WHITESPACE@1804..1809 "\n    "
-      LOOP_EXPR@1809..1902
-        LOOP_KW@1809..1813 "loop"
-        WHITESPACE@1813..1814 " "
-        BLOCK_EXPR@1814..1902
-          L_CURLY@1814..1815 "{"
-          WHITESPACE@1815..1816 " "
-          EXPR_STMT@1816..1823
-            BIN_EXPR@1816..1822
-              PATH_EXPR@1816..1817
-                PATH@1816..1817
-                  PATH_SEGMENT@1816..1817
-                    NAME_REF@1816..1817
-                      IDENT@1816..1817 "i"
-              WHITESPACE@1817..1818 " "
-              PLUSEQ@1818..1820 "+="
-              WHITESPACE@1820..1821 " "
-              LITERAL@1821..1822
-                INT_NUMBER@1821..1822 "1"
-            SEMICOLON@1822..1823 ";"
-          WHITESPACE@1823..1824 " "
-          EXPR_STMT@1824..1887
-            IF_EXPR@1824..1887
-              IF_KW@1824..1826 "if"
-              WHITESPACE@1826..1827 " "
-              CONDITION@1827..1833
-                BIN_EXPR@1827..1833
-                  PATH_EXPR@1827..1828
-                    PATH@1827..1828
-                      PATH_SEGMENT@1827..1828
-                        NAME_REF@1827..1828
-                          IDENT@1827..1828 "i"
-                  WHITESPACE@1828..1829 " "
-                  EQ2@1829..1831 "=="
-                  WHITESPACE@1831..1832 " "
-                  LITERAL@1832..1833
-                    INT_NUMBER@1832..1833 "1"
-              WHITESPACE@1833..1834 " "
-              BLOCK_EXPR@1834..1887
-                L_CURLY@1834..1835 "{"
-                WHITESPACE@1835..1836 " "
-                MATCH_EXPR@1836..1885
-                  MATCH_KW@1836..1841 "match"
-                  WHITESPACE@1841..1842 " "
-                  PAREN_EXPR@1842..1852
-                    L_PAREN@1842..1843 "("
-                    CONTINUE_EXPR@1843..1851
-                      CONTINUE_KW@1843..1851 "continue"
-                    R_PAREN@1851..1852 ")"
-                  WHITESPACE@1852..1853 " "
-                  MATCH_ARM_LIST@1853..1885
-                    L_CURLY@1853..1854 "{"
-                    WHITESPACE@1854..1855 " "
-                    MATCH_ARM@1855..1864
-                      LITERAL_PAT@1855..1856
-                        LITERAL@1855..1856
-                          INT_NUMBER@1855..1856 "1"
-                      WHITESPACE@1856..1857 " "
-                      FAT_ARROW@1857..1859 "=>"
-                      WHITESPACE@1859..1860 " "
-                      BLOCK_EXPR@1860..1863
-                        L_CURLY@1860..1861 "{"
-                        WHITESPACE@1861..1862 " "
-                        R_CURLY@1862..1863 "}"
-                      COMMA@1863..1864 ","
-                    WHITESPACE@1864..1865 " "
-                    MATCH_ARM@1865..1883
-                      WILDCARD_PAT@1865..1866
-                        UNDERSCORE@1865..1866 "_"
-                      WHITESPACE@1866..1867 " "
-                      FAT_ARROW@1867..1869 "=>"
-                      WHITESPACE@1869..1870 " "
-                      MACRO_CALL@1870..1883
-                        PATH@1870..1875
-                          PATH_SEGMENT@1870..1875
-                            NAME_REF@1870..1875
-                              IDENT@1870..1875 "panic"
-                        BANG@1875..1876 "!"
-                        TOKEN_TREE@1876..1883
-                          L_PAREN@1876..1877 "("
-                          STRING@1877..1882 "\"wat\""
-                          R_PAREN@1882..1883 ")"
-                    WHITESPACE@1883..1884 " "
-                    R_CURLY@1884..1885 "}"
-                WHITESPACE@1885..1886 " "
-                R_CURLY@1886..1887 "}"
-          WHITESPACE@1887..1894 "\n      "
-          EXPR_STMT@1894..1900
-            BREAK_EXPR@1894..1899
-              BREAK_KW@1894..1899 "break"
-            SEMICOLON@1899..1900 ";"
-          WHITESPACE@1900..1901 " "
-          R_CURLY@1901..1902 "}"
-      WHITESPACE@1902..1903 "\n"
-      R_CURLY@1903..1904 "}"
+      STMT_LIST@1758..1904
+        L_CURLY@1758..1759 "{"
+        WHITESPACE@1759..1764 "\n    "
+        EXPR_STMT@1764..1785
+          LOOP_EXPR@1764..1785
+            LOOP_KW@1764..1768 "loop"
+            WHITESPACE@1768..1769 " "
+            BLOCK_EXPR@1769..1785
+              STMT_LIST@1769..1785
+                L_CURLY@1769..1770 "{"
+                WHITESPACE@1770..1771 " "
+                IF_EXPR@1771..1783
+                  IF_KW@1771..1773 "if"
+                  WHITESPACE@1773..1774 " "
+                  CONDITION@1774..1779
+                    BREAK_EXPR@1774..1779
+                      BREAK_KW@1774..1779 "break"
+                  WHITESPACE@1779..1780 " "
+                  BLOCK_EXPR@1780..1783
+                    STMT_LIST@1780..1783
+                      L_CURLY@1780..1781 "{"
+                      WHITESPACE@1781..1782 " "
+                      R_CURLY@1782..1783 "}"
+                WHITESPACE@1783..1784 " "
+                R_CURLY@1784..1785 "}"
+        WHITESPACE@1785..1790 "\n    "
+        LET_STMT@1790..1804
+          LET_KW@1790..1793 "let"
+          WHITESPACE@1793..1794 " "
+          IDENT_PAT@1794..1799
+            MUT_KW@1794..1797 "mut"
+            WHITESPACE@1797..1798 " "
+            NAME@1798..1799
+              IDENT@1798..1799 "i"
+          WHITESPACE@1799..1800 " "
+          EQ@1800..1801 "="
+          WHITESPACE@1801..1802 " "
+          LITERAL@1802..1803
+            INT_NUMBER@1802..1803 "0"
+          SEMICOLON@1803..1804 ";"
+        WHITESPACE@1804..1809 "\n    "
+        LOOP_EXPR@1809..1902
+          LOOP_KW@1809..1813 "loop"
+          WHITESPACE@1813..1814 " "
+          BLOCK_EXPR@1814..1902
+            STMT_LIST@1814..1902
+              L_CURLY@1814..1815 "{"
+              WHITESPACE@1815..1816 " "
+              EXPR_STMT@1816..1823
+                BIN_EXPR@1816..1822
+                  PATH_EXPR@1816..1817
+                    PATH@1816..1817
+                      PATH_SEGMENT@1816..1817
+                        NAME_REF@1816..1817
+                          IDENT@1816..1817 "i"
+                  WHITESPACE@1817..1818 " "
+                  PLUSEQ@1818..1820 "+="
+                  WHITESPACE@1820..1821 " "
+                  LITERAL@1821..1822
+                    INT_NUMBER@1821..1822 "1"
+                SEMICOLON@1822..1823 ";"
+              WHITESPACE@1823..1824 " "
+              EXPR_STMT@1824..1887
+                IF_EXPR@1824..1887
+                  IF_KW@1824..1826 "if"
+                  WHITESPACE@1826..1827 " "
+                  CONDITION@1827..1833
+                    BIN_EXPR@1827..1833
+                      PATH_EXPR@1827..1828
+                        PATH@1827..1828
+                          PATH_SEGMENT@1827..1828
+                            NAME_REF@1827..1828
+                              IDENT@1827..1828 "i"
+                      WHITESPACE@1828..1829 " "
+                      EQ2@1829..1831 "=="
+                      WHITESPACE@1831..1832 " "
+                      LITERAL@1832..1833
+                        INT_NUMBER@1832..1833 "1"
+                  WHITESPACE@1833..1834 " "
+                  BLOCK_EXPR@1834..1887
+                    STMT_LIST@1834..1887
+                      L_CURLY@1834..1835 "{"
+                      WHITESPACE@1835..1836 " "
+                      MATCH_EXPR@1836..1885
+                        MATCH_KW@1836..1841 "match"
+                        WHITESPACE@1841..1842 " "
+                        PAREN_EXPR@1842..1852
+                          L_PAREN@1842..1843 "("
+                          CONTINUE_EXPR@1843..1851
+                            CONTINUE_KW@1843..1851 "continue"
+                          R_PAREN@1851..1852 ")"
+                        WHITESPACE@1852..1853 " "
+                        MATCH_ARM_LIST@1853..1885
+                          L_CURLY@1853..1854 "{"
+                          WHITESPACE@1854..1855 " "
+                          MATCH_ARM@1855..1864
+                            LITERAL_PAT@1855..1856
+                              LITERAL@1855..1856
+                                INT_NUMBER@1855..1856 "1"
+                            WHITESPACE@1856..1857 " "
+                            FAT_ARROW@1857..1859 "=>"
+                            WHITESPACE@1859..1860 " "
+                            BLOCK_EXPR@1860..1863
+                              STMT_LIST@1860..1863
+                                L_CURLY@1860..1861 "{"
+                                WHITESPACE@1861..1862 " "
+                                R_CURLY@1862..1863 "}"
+                            COMMA@1863..1864 ","
+                          WHITESPACE@1864..1865 " "
+                          MATCH_ARM@1865..1883
+                            WILDCARD_PAT@1865..1866
+                              UNDERSCORE@1865..1866 "_"
+                            WHITESPACE@1866..1867 " "
+                            FAT_ARROW@1867..1869 "=>"
+                            WHITESPACE@1869..1870 " "
+                            MACRO_CALL@1870..1883
+                              PATH@1870..1875
+                                PATH_SEGMENT@1870..1875
+                                  NAME_REF@1870..1875
+                                    IDENT@1870..1875 "panic"
+                              BANG@1875..1876 "!"
+                              TOKEN_TREE@1876..1883
+                                L_PAREN@1876..1877 "("
+                                STRING@1877..1882 "\"wat\""
+                                R_PAREN@1882..1883 ")"
+                          WHITESPACE@1883..1884 " "
+                          R_CURLY@1884..1885 "}"
+                      WHITESPACE@1885..1886 " "
+                      R_CURLY@1886..1887 "}"
+              WHITESPACE@1887..1894 "\n      "
+              EXPR_STMT@1894..1900
+                BREAK_EXPR@1894..1899
+                  BREAK_KW@1894..1899 "break"
+                SEMICOLON@1899..1900 ";"
+              WHITESPACE@1900..1901 " "
+              R_CURLY@1901..1902 "}"
+        WHITESPACE@1902..1903 "\n"
+        R_CURLY@1903..1904 "}"
   WHITESPACE@1904..1906 "\n\n"
   FN@1906..1960
     FN_KW@1906..1908 "fn"
@@ -1146,30 +1172,31 @@ SOURCE_FILE@0..3813
       R_PAREN@1922..1923 ")"
     WHITESPACE@1923..1924 " "
     BLOCK_EXPR@1924..1960
-      L_CURLY@1924..1925 "{"
-      WHITESPACE@1925..1926 " "
-      LET_STMT@1926..1958
-        LET_KW@1926..1929 "let"
-        WHITESPACE@1929..1930 " "
-        IDENT_PAT@1930..1935
-          NAME@1930..1935
-            IDENT@1930..1935 "_evil"
-        WHITESPACE@1935..1936 " "
-        EQ@1936..1937 "="
-        WHITESPACE@1937..1938 " "
-        MACRO_CALL@1938..1957
-          PATH@1938..1945
-            PATH_SEGMENT@1938..1945
-              NAME_REF@1938..1945
-                IDENT@1938..1945 "println"
-          BANG@1945..1946 "!"
-          TOKEN_TREE@1946..1957
-            L_PAREN@1946..1947 "("
-            STRING@1947..1956 "\"lincoln\""
-            R_PAREN@1956..1957 ")"
-        SEMICOLON@1957..1958 ";"
-      WHITESPACE@1958..1959 " "
-      R_CURLY@1959..1960 "}"
+      STMT_LIST@1924..1960
+        L_CURLY@1924..1925 "{"
+        WHITESPACE@1925..1926 " "
+        LET_STMT@1926..1958
+          LET_KW@1926..1929 "let"
+          WHITESPACE@1929..1930 " "
+          IDENT_PAT@1930..1935
+            NAME@1930..1935
+              IDENT@1930..1935 "_evil"
+          WHITESPACE@1935..1936 " "
+          EQ@1936..1937 "="
+          WHITESPACE@1937..1938 " "
+          MACRO_CALL@1938..1957
+            PATH@1938..1945
+              PATH_SEGMENT@1938..1945
+                NAME_REF@1938..1945
+                  IDENT@1938..1945 "println"
+            BANG@1945..1946 "!"
+            TOKEN_TREE@1946..1957
+              L_PAREN@1946..1947 "("
+              STRING@1947..1956 "\"lincoln\""
+              R_PAREN@1956..1957 ")"
+          SEMICOLON@1957..1958 ";"
+        WHITESPACE@1958..1959 " "
+        R_CURLY@1959..1960 "}"
   WHITESPACE@1960..1962 "\n\n"
   FN@1962..2198
     FN_KW@1962..1964 "fn"
@@ -1181,113 +1208,114 @@ SOURCE_FILE@0..3813
       R_PAREN@1970..1971 ")"
     WHITESPACE@1971..1972 " "
     BLOCK_EXPR@1972..2198
-      L_CURLY@1972..1973 "{"
-      WHITESPACE@1973..1978 "\n    "
-      EXPR_STMT@1978..2196
-        MACRO_CALL@1978..2195
-          PATH@1978..1987
-            PATH_SEGMENT@1978..1987
-              NAME_REF@1978..1987
-                IDENT@1978..1987 "assert_eq"
-          BANG@1987..1988 "!"
-          TOKEN_TREE@1988..2195
-            L_PAREN@1988..1989 "("
-            IDENT@1989..1995 "String"
-            COLON@1995..1996 ":"
-            COLON@1996..1997 ":"
-            IDENT@1997..2001 "from"
-            TOKEN_TREE@2001..2055
-              L_PAREN@2001..2002 "("
-              STRING@2002..2054 "\".................... ..."
-              R_PAREN@2054..2055 ")"
-            COMMA@2055..2056 ","
-            WHITESPACE@2056..2072 "\n               "
-            IDENT@2072..2078 "format"
-            BANG@2078..2079 "!"
-            TOKEN_TREE@2079..2194
-              L_PAREN@2079..2080 "("
-              STRING@2080..2086 "\"{:?}\""
-              COMMA@2086..2087 ","
-              WHITESPACE@2087..2088 " "
-              DOT@2088..2089 "."
-              DOT@2089..2090 "."
-              WHITESPACE@2090..2091 " "
-              DOT@2091..2092 "."
-              DOT@2092..2093 "."
-              WHITESPACE@2093..2094 " "
-              DOT@2094..2095 "."
-              DOT@2095..2096 "."
-              WHITESPACE@2096..2097 " "
-              DOT@2097..2098 "."
-              DOT@2098..2099 "."
-              WHITESPACE@2099..2100 " "
-              DOT@2100..2101 "."
-              DOT@2101..2102 "."
-              WHITESPACE@2102..2103 " "
-              DOT@2103..2104 "."
-              DOT@2104..2105 "."
-              WHITESPACE@2105..2106 " "
-              DOT@2106..2107 "."
-              DOT@2107..2108 "."
-              WHITESPACE@2108..2109 " "
-              DOT@2109..2110 "."
-              DOT@2110..2111 "."
-              WHITESPACE@2111..2112 " "
-              DOT@2112..2113 "."
-              DOT@2113..2114 "."
-              WHITESPACE@2114..2115 " "
-              DOT@2115..2116 "."
-              DOT@2116..2117 "."
-              WHITESPACE@2117..2118 " "
-              DOT@2118..2119 "."
-              DOT@2119..2120 "."
-              WHITESPACE@2120..2121 " "
-              DOT@2121..2122 "."
-              DOT@2122..2123 "."
-              WHITESPACE@2123..2124 " "
-              DOT@2124..2125 "."
-              DOT@2125..2126 "."
-              WHITESPACE@2126..2158 "\n                     ..."
-              DOT@2158..2159 "."
-              DOT@2159..2160 "."
-              WHITESPACE@2160..2161 " "
-              DOT@2161..2162 "."
-              DOT@2162..2163 "."
-              WHITESPACE@2163..2164 " "
-              DOT@2164..2165 "."
-              DOT@2165..2166 "."
-              WHITESPACE@2166..2167 " "
-              DOT@2167..2168 "."
-              DOT@2168..2169 "."
-              WHITESPACE@2169..2170 " "
-              DOT@2170..2171 "."
-              DOT@2171..2172 "."
-              WHITESPACE@2172..2173 " "
-              DOT@2173..2174 "."
-              DOT@2174..2175 "."
-              WHITESPACE@2175..2176 " "
-              DOT@2176..2177 "."
-              DOT@2177..2178 "."
-              WHITESPACE@2178..2179 " "
-              DOT@2179..2180 "."
-              DOT@2180..2181 "."
-              WHITESPACE@2181..2182 " "
-              DOT@2182..2183 "."
-              DOT@2183..2184 "."
-              WHITESPACE@2184..2185 " "
-              DOT@2185..2186 "."
-              DOT@2186..2187 "."
-              WHITESPACE@2187..2188 " "
-              DOT@2188..2189 "."
-              DOT@2189..2190 "."
-              WHITESPACE@2190..2191 " "
-              DOT@2191..2192 "."
-              DOT@2192..2193 "."
-              R_PAREN@2193..2194 ")"
-            R_PAREN@2194..2195 ")"
-        SEMICOLON@2195..2196 ";"
-      WHITESPACE@2196..2197 "\n"
-      R_CURLY@2197..2198 "}"
+      STMT_LIST@1972..2198
+        L_CURLY@1972..1973 "{"
+        WHITESPACE@1973..1978 "\n    "
+        EXPR_STMT@1978..2196
+          MACRO_CALL@1978..2195
+            PATH@1978..1987
+              PATH_SEGMENT@1978..1987
+                NAME_REF@1978..1987
+                  IDENT@1978..1987 "assert_eq"
+            BANG@1987..1988 "!"
+            TOKEN_TREE@1988..2195
+              L_PAREN@1988..1989 "("
+              IDENT@1989..1995 "String"
+              COLON@1995..1996 ":"
+              COLON@1996..1997 ":"
+              IDENT@1997..2001 "from"
+              TOKEN_TREE@2001..2055
+                L_PAREN@2001..2002 "("
+                STRING@2002..2054 "\".................... ..."
+                R_PAREN@2054..2055 ")"
+              COMMA@2055..2056 ","
+              WHITESPACE@2056..2072 "\n               "
+              IDENT@2072..2078 "format"
+              BANG@2078..2079 "!"
+              TOKEN_TREE@2079..2194
+                L_PAREN@2079..2080 "("
+                STRING@2080..2086 "\"{:?}\""
+                COMMA@2086..2087 ","
+                WHITESPACE@2087..2088 " "
+                DOT@2088..2089 "."
+                DOT@2089..2090 "."
+                WHITESPACE@2090..2091 " "
+                DOT@2091..2092 "."
+                DOT@2092..2093 "."
+                WHITESPACE@2093..2094 " "
+                DOT@2094..2095 "."
+                DOT@2095..2096 "."
+                WHITESPACE@2096..2097 " "
+                DOT@2097..2098 "."
+                DOT@2098..2099 "."
+                WHITESPACE@2099..2100 " "
+                DOT@2100..2101 "."
+                DOT@2101..2102 "."
+                WHITESPACE@2102..2103 " "
+                DOT@2103..2104 "."
+                DOT@2104..2105 "."
+                WHITESPACE@2105..2106 " "
+                DOT@2106..2107 "."
+                DOT@2107..2108 "."
+                WHITESPACE@2108..2109 " "
+                DOT@2109..2110 "."
+                DOT@2110..2111 "."
+                WHITESPACE@2111..2112 " "
+                DOT@2112..2113 "."
+                DOT@2113..2114 "."
+                WHITESPACE@2114..2115 " "
+                DOT@2115..2116 "."
+                DOT@2116..2117 "."
+                WHITESPACE@2117..2118 " "
+                DOT@2118..2119 "."
+                DOT@2119..2120 "."
+                WHITESPACE@2120..2121 " "
+                DOT@2121..2122 "."
+                DOT@2122..2123 "."
+                WHITESPACE@2123..2124 " "
+                DOT@2124..2125 "."
+                DOT@2125..2126 "."
+                WHITESPACE@2126..2158 "\n                     ..."
+                DOT@2158..2159 "."
+                DOT@2159..2160 "."
+                WHITESPACE@2160..2161 " "
+                DOT@2161..2162 "."
+                DOT@2162..2163 "."
+                WHITESPACE@2163..2164 " "
+                DOT@2164..2165 "."
+                DOT@2165..2166 "."
+                WHITESPACE@2166..2167 " "
+                DOT@2167..2168 "."
+                DOT@2168..2169 "."
+                WHITESPACE@2169..2170 " "
+                DOT@2170..2171 "."
+                DOT@2171..2172 "."
+                WHITESPACE@2172..2173 " "
+                DOT@2173..2174 "."
+                DOT@2174..2175 "."
+                WHITESPACE@2175..2176 " "
+                DOT@2176..2177 "."
+                DOT@2177..2178 "."
+                WHITESPACE@2178..2179 " "
+                DOT@2179..2180 "."
+                DOT@2180..2181 "."
+                WHITESPACE@2181..2182 " "
+                DOT@2182..2183 "."
+                DOT@2183..2184 "."
+                WHITESPACE@2184..2185 " "
+                DOT@2185..2186 "."
+                DOT@2186..2187 "."
+                WHITESPACE@2187..2188 " "
+                DOT@2188..2189 "."
+                DOT@2189..2190 "."
+                WHITESPACE@2190..2191 " "
+                DOT@2191..2192 "."
+                DOT@2192..2193 "."
+                R_PAREN@2193..2194 ")"
+              R_PAREN@2194..2195 ")"
+          SEMICOLON@2195..2196 ";"
+        WHITESPACE@2196..2197 "\n"
+        R_CURLY@2197..2198 "}"
   WHITESPACE@2198..2200 "\n\n"
   FN@2200..2693
     FN_KW@2200..2202 "fn"
@@ -1310,168 +1338,170 @@ SOURCE_FILE@0..3813
       R_PAREN@2212..2213 ")"
     WHITESPACE@2213..2214 " "
     BLOCK_EXPR@2214..2693
-      L_CURLY@2214..2215 "{"
-      WHITESPACE@2215..2220 "\n    "
-      IF_EXPR@2220..2691
-        IF_KW@2220..2222 "if"
-        WHITESPACE@2222..2223 " "
-        CONDITION@2223..2232
-          BIN_EXPR@2223..2232
-            PATH_EXPR@2223..2225
-              PATH@2223..2225
-                PATH_SEGMENT@2223..2225
-                  NAME_REF@2223..2225
-                    IDENT@2223..2225 "u8"
-            WHITESPACE@2225..2226 " "
-            NEQ@2226..2228 "!="
-            WHITESPACE@2228..2229 " "
-            LITERAL@2229..2232
-              INT_NUMBER@2229..2232 "0u8"
-        WHITESPACE@2232..2233 " "
-        BLOCK_EXPR@2233..2691
-          L_CURLY@2233..2234 "{"
-          WHITESPACE@2234..2243 "\n        "
-          EXPR_STMT@2243..2685
-            MACRO_CALL@2243..2684
-              PATH@2243..2252
-                PATH_SEGMENT@2243..2252
-                  NAME_REF@2243..2252
-                    IDENT@2243..2252 "assert_eq"
-              BANG@2252..2253 "!"
-              TOKEN_TREE@2253..2684
-                L_PAREN@2253..2254 "("
-                INT_NUMBER@2254..2257 "8u8"
-                COMMA@2257..2258 ","
-                WHITESPACE@2258..2259 " "
-                TOKEN_TREE@2259..2683
-                  L_CURLY@2259..2260 "{"
-                  WHITESPACE@2260..2273 "\n            "
-                  IDENT@2273..2284 "macro_rules"
-                  BANG@2284..2285 "!"
-                  WHITESPACE@2285..2286 " "
-                  IDENT@2286..2288 "u8"
-                  WHITESPACE@2288..2289 " "
-                  TOKEN_TREE@2289..2567
-                    L_CURLY@2289..2290 "{"
-                    WHITESPACE@2290..2307 "\n                "
-                    TOKEN_TREE@2307..2311
-                      L_PAREN@2307..2308 "("
-                      IDENT@2308..2310 "u8"
-                      R_PAREN@2310..2311 ")"
-                    WHITESPACE@2311..2312 " "
-                    EQ@2312..2313 "="
-                    R_ANGLE@2313..2314 ">"
-                    WHITESPACE@2314..2315 " "
-                    TOKEN_TREE@2315..2552
-                      L_CURLY@2315..2316 "{"
-                      WHITESPACE@2316..2337 "\n                    "
-                      MOD_KW@2337..2340 "mod"
-                      WHITESPACE@2340..2341 " "
-                      IDENT@2341..2343 "u8"
-                      WHITESPACE@2343..2344 " "
-                      TOKEN_TREE@2344..2534
-                        L_CURLY@2344..2345 "{"
-                        WHITESPACE@2345..2370 "\n                     ..."
-                        PUB_KW@2370..2373 "pub"
-                        WHITESPACE@2373..2374 " "
-                        FN_KW@2374..2376 "fn"
-                        WHITESPACE@2376..2377 " "
-                        IDENT@2377..2379 "u8"
-                        L_ANGLE@2379..2380 "<"
-                        LIFETIME_IDENT@2380..2383 "'u8"
-                        COLON@2383..2384 ":"
-                        WHITESPACE@2384..2385 " "
-                        LIFETIME_IDENT@2385..2388 "'u8"
-                        WHITESPACE@2388..2389 " "
-                        PLUS@2389..2390 "+"
-                        WHITESPACE@2390..2391 " "
-                        LIFETIME_IDENT@2391..2394 "'u8"
-                        R_ANGLE@2394..2395 ">"
-                        TOKEN_TREE@2395..2408
-                          L_PAREN@2395..2396 "("
-                          IDENT@2396..2398 "u8"
-                          COLON@2398..2399 ":"
-                          WHITESPACE@2399..2400 " "
-                          AMP@2400..2401 "&"
-                          LIFETIME_IDENT@2401..2404 "'u8"
-                          WHITESPACE@2404..2405 " "
-                          IDENT@2405..2407 "u8"
-                          R_PAREN@2407..2408 ")"
-                        WHITESPACE@2408..2409 " "
-                        MINUS@2409..2410 "-"
-                        R_ANGLE@2410..2411 ">"
-                        WHITESPACE@2411..2412 " "
-                        AMP@2412..2413 "&"
-                        LIFETIME_IDENT@2413..2416 "'u8"
-                        WHITESPACE@2416..2417 " "
-                        IDENT@2417..2419 "u8"
-                        WHITESPACE@2419..2420 " "
-                        TOKEN_TREE@2420..2512
-                          L_CURLY@2420..2421 "{"
-                          WHITESPACE@2421..2450 "\n                     ..."
-                          STRING@2450..2454 "\"u8\""
-                          SEMICOLON@2454..2455 ";"
-                          WHITESPACE@2455..2484 "\n                     ..."
-                          IDENT@2484..2486 "u8"
-                          WHITESPACE@2486..2511 "\n                     ..."
-                          R_CURLY@2511..2512 "}"
-                        WHITESPACE@2512..2533 "\n                    "
-                        R_CURLY@2533..2534 "}"
-                      WHITESPACE@2534..2551 "\n                "
-                      R_CURLY@2551..2552 "}"
-                    SEMICOLON@2552..2553 ";"
-                    WHITESPACE@2553..2566 "\n            "
-                    R_CURLY@2566..2567 "}"
-                  WHITESPACE@2567..2581 "\n\n            "
-                  IDENT@2581..2583 "u8"
-                  BANG@2583..2584 "!"
-                  TOKEN_TREE@2584..2588
-                    L_PAREN@2584..2585 "("
-                    IDENT@2585..2587 "u8"
-                    R_PAREN@2587..2588 ")"
-                  SEMICOLON@2588..2589 ";"
-                  WHITESPACE@2589..2602 "\n            "
-                  LET_KW@2602..2605 "let"
-                  WHITESPACE@2605..2606 " "
-                  AMP@2606..2607 "&"
-                  IDENT@2607..2609 "u8"
-                  COLON@2609..2610 ":"
-                  WHITESPACE@2610..2611 " "
-                  AMP@2611..2612 "&"
-                  IDENT@2612..2614 "u8"
-                  WHITESPACE@2614..2615 " "
-                  EQ@2615..2616 "="
-                  WHITESPACE@2616..2617 " "
-                  IDENT@2617..2619 "u8"
-                  COLON@2619..2620 ":"
-                  COLON@2620..2621 ":"
-                  IDENT@2621..2623 "u8"
-                  TOKEN_TREE@2623..2629
-                    L_PAREN@2623..2624 "("
-                    AMP@2624..2625 "&"
-                    INT_NUMBER@2625..2628 "8u8"
-                    R_PAREN@2628..2629 ")"
-                  SEMICOLON@2629..2630 ";"
-                  WHITESPACE@2630..2643 "\n            "
-                  CRATE_KW@2643..2648 "crate"
-                  COLON@2648..2649 ":"
-                  COLON@2649..2650 ":"
-                  IDENT@2650..2652 "u8"
-                  TOKEN_TREE@2652..2657
-                    L_PAREN@2652..2653 "("
-                    INT_NUMBER@2653..2656 "0u8"
-                    R_PAREN@2656..2657 ")"
-                  SEMICOLON@2657..2658 ";"
-                  WHITESPACE@2658..2671 "\n            "
-                  IDENT@2671..2673 "u8"
-                  WHITESPACE@2673..2682 "\n        "
-                  R_CURLY@2682..2683 "}"
-                R_PAREN@2683..2684 ")"
-            SEMICOLON@2684..2685 ";"
-          WHITESPACE@2685..2690 "\n    "
-          R_CURLY@2690..2691 "}"
-      WHITESPACE@2691..2692 "\n"
-      R_CURLY@2692..2693 "}"
+      STMT_LIST@2214..2693
+        L_CURLY@2214..2215 "{"
+        WHITESPACE@2215..2220 "\n    "
+        IF_EXPR@2220..2691
+          IF_KW@2220..2222 "if"
+          WHITESPACE@2222..2223 " "
+          CONDITION@2223..2232
+            BIN_EXPR@2223..2232
+              PATH_EXPR@2223..2225
+                PATH@2223..2225
+                  PATH_SEGMENT@2223..2225
+                    NAME_REF@2223..2225
+                      IDENT@2223..2225 "u8"
+              WHITESPACE@2225..2226 " "
+              NEQ@2226..2228 "!="
+              WHITESPACE@2228..2229 " "
+              LITERAL@2229..2232
+                INT_NUMBER@2229..2232 "0u8"
+          WHITESPACE@2232..2233 " "
+          BLOCK_EXPR@2233..2691
+            STMT_LIST@2233..2691
+              L_CURLY@2233..2234 "{"
+              WHITESPACE@2234..2243 "\n        "
+              EXPR_STMT@2243..2685
+                MACRO_CALL@2243..2684
+                  PATH@2243..2252
+                    PATH_SEGMENT@2243..2252
+                      NAME_REF@2243..2252
+                        IDENT@2243..2252 "assert_eq"
+                  BANG@2252..2253 "!"
+                  TOKEN_TREE@2253..2684
+                    L_PAREN@2253..2254 "("
+                    INT_NUMBER@2254..2257 "8u8"
+                    COMMA@2257..2258 ","
+                    WHITESPACE@2258..2259 " "
+                    TOKEN_TREE@2259..2683
+                      L_CURLY@2259..2260 "{"
+                      WHITESPACE@2260..2273 "\n            "
+                      IDENT@2273..2284 "macro_rules"
+                      BANG@2284..2285 "!"
+                      WHITESPACE@2285..2286 " "
+                      IDENT@2286..2288 "u8"
+                      WHITESPACE@2288..2289 " "
+                      TOKEN_TREE@2289..2567
+                        L_CURLY@2289..2290 "{"
+                        WHITESPACE@2290..2307 "\n                "
+                        TOKEN_TREE@2307..2311
+                          L_PAREN@2307..2308 "("
+                          IDENT@2308..2310 "u8"
+                          R_PAREN@2310..2311 ")"
+                        WHITESPACE@2311..2312 " "
+                        EQ@2312..2313 "="
+                        R_ANGLE@2313..2314 ">"
+                        WHITESPACE@2314..2315 " "
+                        TOKEN_TREE@2315..2552
+                          L_CURLY@2315..2316 "{"
+                          WHITESPACE@2316..2337 "\n                    "
+                          MOD_KW@2337..2340 "mod"
+                          WHITESPACE@2340..2341 " "
+                          IDENT@2341..2343 "u8"
+                          WHITESPACE@2343..2344 " "
+                          TOKEN_TREE@2344..2534
+                            L_CURLY@2344..2345 "{"
+                            WHITESPACE@2345..2370 "\n                     ..."
+                            PUB_KW@2370..2373 "pub"
+                            WHITESPACE@2373..2374 " "
+                            FN_KW@2374..2376 "fn"
+                            WHITESPACE@2376..2377 " "
+                            IDENT@2377..2379 "u8"
+                            L_ANGLE@2379..2380 "<"
+                            LIFETIME_IDENT@2380..2383 "'u8"
+                            COLON@2383..2384 ":"
+                            WHITESPACE@2384..2385 " "
+                            LIFETIME_IDENT@2385..2388 "'u8"
+                            WHITESPACE@2388..2389 " "
+                            PLUS@2389..2390 "+"
+                            WHITESPACE@2390..2391 " "
+                            LIFETIME_IDENT@2391..2394 "'u8"
+                            R_ANGLE@2394..2395 ">"
+                            TOKEN_TREE@2395..2408
+                              L_PAREN@2395..2396 "("
+                              IDENT@2396..2398 "u8"
+                              COLON@2398..2399 ":"
+                              WHITESPACE@2399..2400 " "
+                              AMP@2400..2401 "&"
+                              LIFETIME_IDENT@2401..2404 "'u8"
+                              WHITESPACE@2404..2405 " "
+                              IDENT@2405..2407 "u8"
+                              R_PAREN@2407..2408 ")"
+                            WHITESPACE@2408..2409 " "
+                            MINUS@2409..2410 "-"
+                            R_ANGLE@2410..2411 ">"
+                            WHITESPACE@2411..2412 " "
+                            AMP@2412..2413 "&"
+                            LIFETIME_IDENT@2413..2416 "'u8"
+                            WHITESPACE@2416..2417 " "
+                            IDENT@2417..2419 "u8"
+                            WHITESPACE@2419..2420 " "
+                            TOKEN_TREE@2420..2512
+                              L_CURLY@2420..2421 "{"
+                              WHITESPACE@2421..2450 "\n                     ..."
+                              STRING@2450..2454 "\"u8\""
+                              SEMICOLON@2454..2455 ";"
+                              WHITESPACE@2455..2484 "\n                     ..."
+                              IDENT@2484..2486 "u8"
+                              WHITESPACE@2486..2511 "\n                     ..."
+                              R_CURLY@2511..2512 "}"
+                            WHITESPACE@2512..2533 "\n                    "
+                            R_CURLY@2533..2534 "}"
+                          WHITESPACE@2534..2551 "\n                "
+                          R_CURLY@2551..2552 "}"
+                        SEMICOLON@2552..2553 ";"
+                        WHITESPACE@2553..2566 "\n            "
+                        R_CURLY@2566..2567 "}"
+                      WHITESPACE@2567..2581 "\n\n            "
+                      IDENT@2581..2583 "u8"
+                      BANG@2583..2584 "!"
+                      TOKEN_TREE@2584..2588
+                        L_PAREN@2584..2585 "("
+                        IDENT@2585..2587 "u8"
+                        R_PAREN@2587..2588 ")"
+                      SEMICOLON@2588..2589 ";"
+                      WHITESPACE@2589..2602 "\n            "
+                      LET_KW@2602..2605 "let"
+                      WHITESPACE@2605..2606 " "
+                      AMP@2606..2607 "&"
+                      IDENT@2607..2609 "u8"
+                      COLON@2609..2610 ":"
+                      WHITESPACE@2610..2611 " "
+                      AMP@2611..2612 "&"
+                      IDENT@2612..2614 "u8"
+                      WHITESPACE@2614..2615 " "
+                      EQ@2615..2616 "="
+                      WHITESPACE@2616..2617 " "
+                      IDENT@2617..2619 "u8"
+                      COLON@2619..2620 ":"
+                      COLON@2620..2621 ":"
+                      IDENT@2621..2623 "u8"
+                      TOKEN_TREE@2623..2629
+                        L_PAREN@2623..2624 "("
+                        AMP@2624..2625 "&"
+                        INT_NUMBER@2625..2628 "8u8"
+                        R_PAREN@2628..2629 ")"
+                      SEMICOLON@2629..2630 ";"
+                      WHITESPACE@2630..2643 "\n            "
+                      CRATE_KW@2643..2648 "crate"
+                      COLON@2648..2649 ":"
+                      COLON@2649..2650 ":"
+                      IDENT@2650..2652 "u8"
+                      TOKEN_TREE@2652..2657
+                        L_PAREN@2652..2653 "("
+                        INT_NUMBER@2653..2656 "0u8"
+                        R_PAREN@2656..2657 ")"
+                      SEMICOLON@2657..2658 ";"
+                      WHITESPACE@2658..2671 "\n            "
+                      IDENT@2671..2673 "u8"
+                      WHITESPACE@2673..2682 "\n        "
+                      R_CURLY@2682..2683 "}"
+                    R_PAREN@2683..2684 ")"
+                SEMICOLON@2684..2685 ";"
+              WHITESPACE@2685..2690 "\n    "
+              R_CURLY@2690..2691 "}"
+        WHITESPACE@2691..2692 "\n"
+        R_CURLY@2692..2693 "}"
   WHITESPACE@2693..2695 "\n\n"
   FN@2695..2832
     FN_KW@2695..2697 "fn"
@@ -1483,75 +1513,76 @@ SOURCE_FILE@0..3813
       R_PAREN@2704..2705 ")"
     WHITESPACE@2705..2706 " "
     BLOCK_EXPR@2706..2832
-      L_CURLY@2706..2707 "{"
-      WHITESPACE@2707..2712 "\n    "
-      EXPR_STMT@2712..2830
-        MACRO_CALL@2712..2829
-          PATH@2712..2721
-            PATH_SEGMENT@2712..2721
-              NAME_REF@2712..2721
-                IDENT@2712..2721 "assert_eq"
-          BANG@2721..2722 "!"
-          TOKEN_TREE@2722..2829
-            L_PAREN@2722..2723 "("
-            IDENT@2723..2729 "String"
-            COLON@2729..2730 ":"
-            COLON@2730..2731 ":"
-            IDENT@2731..2735 "from"
-            TOKEN_TREE@2735..2742
-              L_PAREN@2735..2736 "("
-              STRING@2736..2741 "\"><>\""
-              R_PAREN@2741..2742 ")"
-            COMMA@2742..2743 ","
-            WHITESPACE@2743..2759 "\n               "
-            IDENT@2759..2765 "String"
-            COLON@2765..2766 ":"
-            COLON@2766..2767 ":"
-            L_ANGLE@2767..2768 "<"
-            R_ANGLE@2768..2769 ">"
-            COLON@2769..2770 ":"
-            COLON@2770..2771 ":"
-            IDENT@2771..2775 "from"
-            COLON@2775..2776 ":"
-            COLON@2776..2777 ":"
-            L_ANGLE@2777..2778 "<"
-            R_ANGLE@2778..2779 ">"
-            TOKEN_TREE@2779..2786
-              L_PAREN@2779..2780 "("
-              STRING@2780..2785 "\"><>\""
-              R_PAREN@2785..2786 ")"
-            DOT@2786..2787 "."
-            IDENT@2787..2792 "chars"
-            COLON@2792..2793 ":"
-            COLON@2793..2794 ":"
-            L_ANGLE@2794..2795 "<"
-            R_ANGLE@2795..2796 ">"
-            TOKEN_TREE@2796..2798
-              L_PAREN@2796..2797 "("
-              R_PAREN@2797..2798 ")"
-            DOT@2798..2799 "."
-            IDENT@2799..2802 "rev"
-            COLON@2802..2803 ":"
-            COLON@2803..2804 ":"
-            L_ANGLE@2804..2805 "<"
-            R_ANGLE@2805..2806 ">"
-            TOKEN_TREE@2806..2808
-              L_PAREN@2806..2807 "("
-              R_PAREN@2807..2808 ")"
-            DOT@2808..2809 "."
-            IDENT@2809..2816 "collect"
-            COLON@2816..2817 ":"
-            COLON@2817..2818 ":"
-            L_ANGLE@2818..2819 "<"
-            IDENT@2819..2825 "String"
-            R_ANGLE@2825..2826 ">"
-            TOKEN_TREE@2826..2828
-              L_PAREN@2826..2827 "("
-              R_PAREN@2827..2828 ")"
-            R_PAREN@2828..2829 ")"
-        SEMICOLON@2829..2830 ";"
-      WHITESPACE@2830..2831 "\n"
-      R_CURLY@2831..2832 "}"
+      STMT_LIST@2706..2832
+        L_CURLY@2706..2707 "{"
+        WHITESPACE@2707..2712 "\n    "
+        EXPR_STMT@2712..2830
+          MACRO_CALL@2712..2829
+            PATH@2712..2721
+              PATH_SEGMENT@2712..2721
+                NAME_REF@2712..2721
+                  IDENT@2712..2721 "assert_eq"
+            BANG@2721..2722 "!"
+            TOKEN_TREE@2722..2829
+              L_PAREN@2722..2723 "("
+              IDENT@2723..2729 "String"
+              COLON@2729..2730 ":"
+              COLON@2730..2731 ":"
+              IDENT@2731..2735 "from"
+              TOKEN_TREE@2735..2742
+                L_PAREN@2735..2736 "("
+                STRING@2736..2741 "\"><>\""
+                R_PAREN@2741..2742 ")"
+              COMMA@2742..2743 ","
+              WHITESPACE@2743..2759 "\n               "
+              IDENT@2759..2765 "String"
+              COLON@2765..2766 ":"
+              COLON@2766..2767 ":"
+              L_ANGLE@2767..2768 "<"
+              R_ANGLE@2768..2769 ">"
+              COLON@2769..2770 ":"
+              COLON@2770..2771 ":"
+              IDENT@2771..2775 "from"
+              COLON@2775..2776 ":"
+              COLON@2776..2777 ":"
+              L_ANGLE@2777..2778 "<"
+              R_ANGLE@2778..2779 ">"
+              TOKEN_TREE@2779..2786
+                L_PAREN@2779..2780 "("
+                STRING@2780..2785 "\"><>\""
+                R_PAREN@2785..2786 ")"
+              DOT@2786..2787 "."
+              IDENT@2787..2792 "chars"
+              COLON@2792..2793 ":"
+              COLON@2793..2794 ":"
+              L_ANGLE@2794..2795 "<"
+              R_ANGLE@2795..2796 ">"
+              TOKEN_TREE@2796..2798
+                L_PAREN@2796..2797 "("
+                R_PAREN@2797..2798 ")"
+              DOT@2798..2799 "."
+              IDENT@2799..2802 "rev"
+              COLON@2802..2803 ":"
+              COLON@2803..2804 ":"
+              L_ANGLE@2804..2805 "<"
+              R_ANGLE@2805..2806 ">"
+              TOKEN_TREE@2806..2808
+                L_PAREN@2806..2807 "("
+                R_PAREN@2807..2808 ")"
+              DOT@2808..2809 "."
+              IDENT@2809..2816 "collect"
+              COLON@2816..2817 ":"
+              COLON@2817..2818 ":"
+              L_ANGLE@2818..2819 "<"
+              IDENT@2819..2825 "String"
+              R_ANGLE@2825..2826 ">"
+              TOKEN_TREE@2826..2828
+                L_PAREN@2826..2827 "("
+                R_PAREN@2827..2828 ")"
+              R_PAREN@2828..2829 ")"
+          SEMICOLON@2829..2830 ";"
+        WHITESPACE@2830..2831 "\n"
+        R_CURLY@2831..2832 "}"
   WHITESPACE@2832..2834 "\n\n"
   FN@2834..2906
     FN_KW@2834..2836 "fn"
@@ -1563,49 +1594,50 @@ SOURCE_FILE@0..3813
       R_PAREN@2843..2844 ")"
     WHITESPACE@2844..2845 " "
     BLOCK_EXPR@2845..2906
-      L_CURLY@2845..2846 "{"
-      WHITESPACE@2846..2851 "\n    "
-      UNION@2851..2904
-        UNION_KW@2851..2856 "union"
-        WHITESPACE@2856..2857 " "
-        NAME@2857..2862
-          IDENT@2857..2862 "union"
-        GENERIC_PARAM_LIST@2862..2870
-          L_ANGLE@2862..2863 "<"
-          LIFETIME_PARAM@2863..2869
-            LIFETIME@2863..2869
-              LIFETIME_IDENT@2863..2869 "'union"
-          R_ANGLE@2869..2870 ">"
-        WHITESPACE@2870..2871 " "
-        RECORD_FIELD_LIST@2871..2904
-          L_CURLY@2871..2872 "{"
-          WHITESPACE@2872..2873 " "
-          RECORD_FIELD@2873..2901
-            NAME@2873..2878
-              IDENT@2873..2878 "union"
-            COLON@2878..2879 ":"
-            WHITESPACE@2879..2880 " "
-            REF_TYPE@2880..2901
-              AMP@2880..2881 "&"
-              LIFETIME@2881..2887
-                LIFETIME_IDENT@2881..2887 "'union"
-              WHITESPACE@2887..2888 " "
-              PATH_TYPE@2888..2901
-                PATH@2888..2901
-                  PATH_SEGMENT@2888..2901
-                    NAME_REF@2888..2893
-                      IDENT@2888..2893 "union"
-                    GENERIC_ARG_LIST@2893..2901
-                      L_ANGLE@2893..2894 "<"
-                      LIFETIME_ARG@2894..2900
-                        LIFETIME@2894..2900
-                          LIFETIME_IDENT@2894..2900 "'union"
-                      R_ANGLE@2900..2901 ">"
-          COMMA@2901..2902 ","
-          WHITESPACE@2902..2903 " "
-          R_CURLY@2903..2904 "}"
-      WHITESPACE@2904..2905 "\n"
-      R_CURLY@2905..2906 "}"
+      STMT_LIST@2845..2906
+        L_CURLY@2845..2846 "{"
+        WHITESPACE@2846..2851 "\n    "
+        UNION@2851..2904
+          UNION_KW@2851..2856 "union"
+          WHITESPACE@2856..2857 " "
+          NAME@2857..2862
+            IDENT@2857..2862 "union"
+          GENERIC_PARAM_LIST@2862..2870
+            L_ANGLE@2862..2863 "<"
+            LIFETIME_PARAM@2863..2869
+              LIFETIME@2863..2869
+                LIFETIME_IDENT@2863..2869 "'union"
+            R_ANGLE@2869..2870 ">"
+          WHITESPACE@2870..2871 " "
+          RECORD_FIELD_LIST@2871..2904
+            L_CURLY@2871..2872 "{"
+            WHITESPACE@2872..2873 " "
+            RECORD_FIELD@2873..2901
+              NAME@2873..2878
+                IDENT@2873..2878 "union"
+              COLON@2878..2879 ":"
+              WHITESPACE@2879..2880 " "
+              REF_TYPE@2880..2901
+                AMP@2880..2881 "&"
+                LIFETIME@2881..2887
+                  LIFETIME_IDENT@2881..2887 "'union"
+                WHITESPACE@2887..2888 " "
+                PATH_TYPE@2888..2901
+                  PATH@2888..2901
+                    PATH_SEGMENT@2888..2901
+                      NAME_REF@2888..2893
+                        IDENT@2888..2893 "union"
+                      GENERIC_ARG_LIST@2893..2901
+                        L_ANGLE@2893..2894 "<"
+                        LIFETIME_ARG@2894..2900
+                          LIFETIME@2894..2900
+                            LIFETIME_IDENT@2894..2900 "'union"
+                        R_ANGLE@2900..2901 ">"
+            COMMA@2901..2902 ","
+            WHITESPACE@2902..2903 " "
+            R_CURLY@2903..2904 "}"
+        WHITESPACE@2904..2905 "\n"
+        R_CURLY@2905..2906 "}"
   WHITESPACE@2906..2908 "\n\n"
   FN@2908..3042
     FN_KW@2908..2910 "fn"
@@ -1617,118 +1649,121 @@ SOURCE_FILE@0..3813
       R_PAREN@2930..2931 ")"
     WHITESPACE@2931..2932 " "
     BLOCK_EXPR@2932..3042
-      L_CURLY@2932..2933 "{"
-      WHITESPACE@2933..2938 "\n    "
-      LET_STMT@2938..3021
-        LET_KW@2938..2941 "let"
-        WHITESPACE@2941..2942 " "
-        IDENT_PAT@2942..2945
-          NAME@2942..2945
-            IDENT@2942..2945 "val"
-        WHITESPACE@2945..2946 " "
-        EQ@2946..2947 "="
-        WHITESPACE@2947..2948 " "
-        PREFIX_EXPR@2948..3013
-          BANG@2948..2949 "!"
-          PAREN_EXPR@2949..3013
-            L_PAREN@2949..2950 "("
-            BIN_EXPR@2950..3012
-              CALL_EXPR@2950..2995
-                PAREN_EXPR@2950..2971
-                  L_PAREN@2950..2951 "("
-                  CLOSURE_EXPR@2951..2970
-                    PARAM_LIST@2951..2968
-                      PIPE@2951..2952 "|"
-                      PARAM@2952..2962
-                        TUPLE_PAT@2952..2956
-                          L_PAREN@2952..2953 "("
-                          REST_PAT@2953..2955
-                            DOT2@2953..2955 ".."
-                          R_PAREN@2955..2956 ")"
-                        COLON@2956..2957 ":"
-                        TUPLE_TYPE@2957..2962
-                          L_PAREN@2957..2958 "("
-                          INFER_TYPE@2958..2959
-                            UNDERSCORE@2958..2959 "_"
-                          COMMA@2959..2960 ","
-                          INFER_TYPE@2960..2961
-                            UNDERSCORE@2960..2961 "_"
-                          R_PAREN@2961..2962 ")"
-                      COMMA@2962..2963 ","
-                      PARAM@2963..2967
-                        IDENT_PAT@2963..2967
-                          NAME@2963..2965
-                            IDENT@2963..2965 "__"
-                          AT@2965..2966 "@"
-                          WILDCARD_PAT@2966..2967
-                            UNDERSCORE@2966..2967 "_"
-                      PIPE@2967..2968 "|"
-                    PATH_EXPR@2968..2970
-                      PATH@2968..2970
-                        PATH_SEGMENT@2968..2970
-                          NAME_REF@2968..2970
-                            IDENT@2968..2970 "__"
-                  R_PAREN@2970..2971 ")"
-                ARG_LIST@2971..2995
-                  L_PAREN@2971..2972 "("
-                  TUPLE_EXPR@2972..2987
-                    L_PAREN@2972..2973 "("
-                    REF_EXPR@2973..2979
-                      AMP@2973..2974 "&"
-                      PREFIX_EXPR@2974..2979
-                        STAR@2974..2975 "*"
-                        LITERAL@2975..2979
-                          STRING@2975..2979 "\"\\\\\""
-                    COMMA@2979..2980 ","
-                    LITERAL@2980..2986
-                      CHAR@2980..2986 "'🤔'"
-                    R_PAREN@2986..2987 ")"
-                  COMMENT@2987..2991 "/**/"
-                  COMMA@2991..2992 ","
-                  BLOCK_EXPR@2992..2994
-                    L_CURLY@2992..2993 "{"
-                    R_CURLY@2993..2994 "}"
-                  R_PAREN@2994..2995 ")"
-              EQ2@2995..2997 "=="
-              BLOCK_EXPR@2997..3012
-                L_CURLY@2997..2998 "{"
-                EXPR_STMT@2998..3011
-                  REF_EXPR@2998..3010
-                    AMP@2998..2999 "&"
-                    INDEX_EXPR@2999..3010
-                      ARRAY_EXPR@2999..3006
-                        L_BRACK@2999..3000 "["
-                        RANGE_EXPR@3000..3005
-                          DOT2EQ@3000..3003 "..="
-                          RANGE_EXPR@3003..3005
-                            DOT2@3003..3005 ".."
-                        R_BRACK@3005..3006 "]"
-                      L_BRACK@3006..3007 "["
-                      RANGE_EXPR@3007..3009
-                        DOT2@3007..3009 ".."
-                      R_BRACK@3009..3010 "]"
-                  SEMICOLON@3010..3011 ";"
-                R_CURLY@3011..3012 "}"
-            R_PAREN@3012..3013 ")"
-        COMMENT@3013..3015 "//"
-        WHITESPACE@3015..3020 "\n    "
-        SEMICOLON@3020..3021 ";"
-      WHITESPACE@3021..3026 "\n    "
-      EXPR_STMT@3026..3040
-        MACRO_CALL@3026..3039
-          PATH@3026..3032
-            PATH_SEGMENT@3026..3032
-              NAME_REF@3026..3032
-                IDENT@3026..3032 "assert"
-          BANG@3032..3033 "!"
-          TOKEN_TREE@3033..3039
-            L_PAREN@3033..3034 "("
-            BANG@3034..3035 "!"
-            IDENT@3035..3038 "val"
-            R_PAREN@3038..3039 ")"
-        SEMICOLON@3039..3040 ";"
-      WHITESPACE@3040..3041 "\n"
-      R_CURLY@3041..3042 "}"
+      STMT_LIST@2932..3042
+        L_CURLY@2932..2933 "{"
+        WHITESPACE@2933..2938 "\n    "
+        LET_STMT@2938..3021
+          LET_KW@2938..2941 "let"
+          WHITESPACE@2941..2942 " "
+          IDENT_PAT@2942..2945
+            NAME@2942..2945
+              IDENT@2942..2945 "val"
+          WHITESPACE@2945..2946 " "
+          EQ@2946..2947 "="
+          WHITESPACE@2947..2948 " "
+          PREFIX_EXPR@2948..3013
+            BANG@2948..2949 "!"
+            PAREN_EXPR@2949..3013
+              L_PAREN@2949..2950 "("
+              BIN_EXPR@2950..3012
+                CALL_EXPR@2950..2995
+                  PAREN_EXPR@2950..2971
+                    L_PAREN@2950..2951 "("
+                    CLOSURE_EXPR@2951..2970
+                      PARAM_LIST@2951..2968
+                        PIPE@2951..2952 "|"
+                        PARAM@2952..2962
+                          TUPLE_PAT@2952..2956
+                            L_PAREN@2952..2953 "("
+                            REST_PAT@2953..2955
+                              DOT2@2953..2955 ".."
+                            R_PAREN@2955..2956 ")"
+                          COLON@2956..2957 ":"
+                          TUPLE_TYPE@2957..2962
+                            L_PAREN@2957..2958 "("
+                            INFER_TYPE@2958..2959
+                              UNDERSCORE@2958..2959 "_"
+                            COMMA@2959..2960 ","
+                            INFER_TYPE@2960..2961
+                              UNDERSCORE@2960..2961 "_"
+                            R_PAREN@2961..2962 ")"
+                        COMMA@2962..2963 ","
+                        PARAM@2963..2967
+                          IDENT_PAT@2963..2967
+                            NAME@2963..2965
+                              IDENT@2963..2965 "__"
+                            AT@2965..2966 "@"
+                            WILDCARD_PAT@2966..2967
+                              UNDERSCORE@2966..2967 "_"
+                        PIPE@2967..2968 "|"
+                      PATH_EXPR@2968..2970
+                        PATH@2968..2970
+                          PATH_SEGMENT@2968..2970
+                            NAME_REF@2968..2970
+                              IDENT@2968..2970 "__"
+                    R_PAREN@2970..2971 ")"
+                  ARG_LIST@2971..2995
+                    L_PAREN@2971..2972 "("
+                    TUPLE_EXPR@2972..2987
+                      L_PAREN@2972..2973 "("
+                      REF_EXPR@2973..2979
+                        AMP@2973..2974 "&"
+                        PREFIX_EXPR@2974..2979
+                          STAR@2974..2975 "*"
+                          LITERAL@2975..2979
+                            STRING@2975..2979 "\"\\\\\""
+                      COMMA@2979..2980 ","
+                      LITERAL@2980..2986
+                        CHAR@2980..2986 "'🤔'"
+                      R_PAREN@2986..2987 ")"
+                    COMMENT@2987..2991 "/**/"
+                    COMMA@2991..2992 ","
+                    BLOCK_EXPR@2992..2994
+                      STMT_LIST@2992..2994
+                        L_CURLY@2992..2993 "{"
+                        R_CURLY@2993..2994 "}"
+                    R_PAREN@2994..2995 ")"
+                EQ2@2995..2997 "=="
+                BLOCK_EXPR@2997..3012
+                  STMT_LIST@2997..3012
+                    L_CURLY@2997..2998 "{"
+                    EXPR_STMT@2998..3011
+                      REF_EXPR@2998..3010
+                        AMP@2998..2999 "&"
+                        INDEX_EXPR@2999..3010
+                          ARRAY_EXPR@2999..3006
+                            L_BRACK@2999..3000 "["
+                            RANGE_EXPR@3000..3005
+                              DOT2EQ@3000..3003 "..="
+                              RANGE_EXPR@3003..3005
+                                DOT2@3003..3005 ".."
+                            R_BRACK@3005..3006 "]"
+                          L_BRACK@3006..3007 "["
+                          RANGE_EXPR@3007..3009
+                            DOT2@3007..3009 ".."
+                          R_BRACK@3009..3010 "]"
+                      SEMICOLON@3010..3011 ";"
+                    R_CURLY@3011..3012 "}"
+              R_PAREN@3012..3013 ")"
+          COMMENT@3013..3015 "//"
+          WHITESPACE@3015..3020 "\n    "
+          SEMICOLON@3020..3021 ";"
+        WHITESPACE@3021..3026 "\n    "
+        EXPR_STMT@3026..3040
+          MACRO_CALL@3026..3039
+            PATH@3026..3032
+              PATH_SEGMENT@3026..3032
+                NAME_REF@3026..3032
+                  IDENT@3026..3032 "assert"
+            BANG@3032..3033 "!"
+            TOKEN_TREE@3033..3039
+              L_PAREN@3033..3034 "("
+              BANG@3034..3035 "!"
+              IDENT@3035..3038 "val"
+              R_PAREN@3038..3039 ")"
+          SEMICOLON@3039..3040 ";"
+        WHITESPACE@3040..3041 "\n"
+        R_CURLY@3041..3042 "}"
   WHITESPACE@3042..3044 "\n\n"
   FN@3044..3514
     FN_KW@3044..3046 "fn"
@@ -1764,305 +1799,306 @@ SOURCE_FILE@0..3813
                     IDENT@3078..3083 "Debug"
     WHITESPACE@3083..3084 " "
     BLOCK_EXPR@3084..3514
-      L_CURLY@3084..3085 "{"
-      WHITESPACE@3085..3090 "\n    "
-      RANGE_EXPR@3090..3512
-        DOT2EQ@3090..3093 "..="
-        RANGE_EXPR@3093..3512
-          DOT2EQ@3093..3096 "..="
-          RANGE_EXPR@3096..3512
-            DOT2@3096..3098 ".."
-            WHITESPACE@3098..3099 " "
-            RANGE_EXPR@3099..3512
-              DOT2@3099..3101 ".."
-              WHITESPACE@3101..3105 "    "
-              RANGE_EXPR@3105..3512
-                DOT2@3105..3107 ".."
-                WHITESPACE@3107..3108 " "
-                RANGE_EXPR@3108..3512
-                  DOT2@3108..3110 ".."
-                  WHITESPACE@3110..3111 " "
-                  RANGE_EXPR@3111..3512
-                    DOT2@3111..3113 ".."
-                    WHITESPACE@3113..3114 " "
-                    RANGE_EXPR@3114..3512
-                      DOT2@3114..3116 ".."
-                      WHITESPACE@3116..3120 "    "
-                      RANGE_EXPR@3120..3512
-                        DOT2@3120..3122 ".."
-                        WHITESPACE@3122..3123 " "
-                        RANGE_EXPR@3123..3512
-                          DOT2@3123..3125 ".."
-                          WHITESPACE@3125..3126 " "
-                          RANGE_EXPR@3126..3512
-                            DOT2@3126..3128 ".."
-                            WHITESPACE@3128..3129 " "
-                            RANGE_EXPR@3129..3512
-                              DOT2@3129..3131 ".."
-                              WHITESPACE@3131..3135 "    "
-                              RANGE_EXPR@3135..3512
-                                DOT2@3135..3137 ".."
-                                WHITESPACE@3137..3138 " "
-                                RANGE_EXPR@3138..3512
-                                  DOT2EQ@3138..3141 "..="
-                                  RANGE_EXPR@3141..3512
-                                    DOT2@3141..3143 ".."
-                                    WHITESPACE@3143..3144 " "
-                                    RANGE_EXPR@3144..3512
-                                      DOT2@3144..3146 ".."
-                                      WHITESPACE@3146..3151 "\n    "
-                                      RANGE_EXPR@3151..3512
-                                        DOT2EQ@3151..3154 "..="
-                                        RANGE_EXPR@3154..3512
-                                          DOT2@3154..3156 ".."
-                                          WHITESPACE@3156..3157 " "
-                                          RANGE_EXPR@3157..3512
-                                            DOT2EQ@3157..3160 "..="
-                                            RANGE_EXPR@3160..3512
-                                              DOT2@3160..3162 ".."
-                                              WHITESPACE@3162..3166 "    "
-                                              RANGE_EXPR@3166..3512
-                                                DOT2@3166..3168 ".."
-                                                WHITESPACE@3168..3169 " "
-                                                RANGE_EXPR@3169..3512
-                                                  DOT2@3169..3171 ".."
-                                                  WHITESPACE@3171..3172 " "
-                                                  RANGE_EXPR@3172..3512
-                                                    DOT2@3172..3174 ".."
-                                                    WHITESPACE@3174..3175 " "
-                                                    RANGE_EXPR@3175..3512
-                                                      DOT2@3175..3177 ".."
-                                                      WHITESPACE@3177..3181 "    "
-                                                      RANGE_EXPR@3181..3512
-                                                        DOT2@3181..3183 ".."
-                                                        WHITESPACE@3183..3184 " "
-                                                        RANGE_EXPR@3184..3512
-                                                          DOT2@3184..3186 ".."
-                                                          WHITESPACE@3186..3187 " "
-                                                          RANGE_EXPR@3187..3512
-                                                            DOT2@3187..3189 ".."
-                                                            WHITESPACE@3189..3190 " "
-                                                            RANGE_EXPR@3190..3512
-                                                              DOT2@3190..3192 ".."
-                                                              WHITESPACE@3192..3196 "    "
-                                                              RANGE_EXPR@3196..3512
-                                                                DOT2EQ@3196..3199 "..="
-                                                                RANGE_EXPR@3199..3512
-                                                                  DOT2EQ@3199..3202 "..="
-                                                                  RANGE_EXPR@3202..3512
-                                                                    DOT2EQ@3202..3205 "..="
-                                                                    RANGE_EXPR@3205..3512
-                                                                      DOT2@3205..3207 ".."
-                                                                      WHITESPACE@3207..3212 "\n    "
-                                                                      RANGE_EXPR@3212..3512
-                                                                        DOT2EQ@3212..3215 "..="
-                                                                        RANGE_EXPR@3215..3512
-                                                                          DOT2@3215..3217 ".."
-                                                                          WHITESPACE@3217..3218 " "
-                                                                          RANGE_EXPR@3218..3512
-                                                                            DOT2EQ@3218..3221 "..="
-                                                                            RANGE_EXPR@3221..3512
-                                                                              DOT2@3221..3223 ".."
-                                                                              WHITESPACE@3223..3227 "    "
-                                                                              RANGE_EXPR@3227..3512
-                                                                                DOT2EQ@3227..3230 "..="
-                                                                                RANGE_EXPR@3230..3512
-                                                                                  DOT2@3230..3232 ".."
-                                                                                  WHITESPACE@3232..3233 " "
-                                                                                  RANGE_EXPR@3233..3512
-                                                                                    DOT2EQ@3233..3236 "..="
-                                                                                    RANGE_EXPR@3236..3512
-                                                                                      DOT2@3236..3238 ".."
-                                                                                      WHITESPACE@3238..3242 "    "
-                                                                                      RANGE_EXPR@3242..3512
-                                                                                        DOT2@3242..3244 ".."
-                                                                                        WHITESPACE@3244..3245 " "
-                                                                                        RANGE_EXPR@3245..3512
-                                                                                          DOT2EQ@3245..3248 "..="
-                                                                                          RANGE_EXPR@3248..3512
-                                                                                            DOT2EQ@3248..3251 "..="
-                                                                                            RANGE_EXPR@3251..3512
-                                                                                              DOT2@3251..3253 ".."
-                                                                                              WHITESPACE@3253..3257 "    "
-                                                                                              RANGE_EXPR@3257..3512
-                                                                                                DOT2@3257..3259 ".."
-                                                                                                WHITESPACE@3259..3260 " "
-                                                                                                RANGE_EXPR@3260..3512
-                                                                                                  DOT2EQ@3260..3263 "..="
-                                                                                                  RANGE_EXPR@3263..3512
-                                                                                                    DOT2@3263..3265 ".."
-                                                                                                    WHITESPACE@3265..3266 " "
-                                                                                                    RANGE_EXPR@3266..3512
-                                                                                                      DOT2@3266..3268 ".."
-                                                                                                      WHITESPACE@3268..3273 "\n    "
-                                                                                                      RANGE_EXPR@3273..3512
-                                                                                                        DOT2EQ@3273..3276 "..="
-                                                                                                        RANGE_EXPR@3276..3512
-                                                                                                          DOT2EQ@3276..3279 "..="
-                                                                                                          RANGE_EXPR@3279..3512
-                                                                                                            DOT2@3279..3281 ".."
-                                                                                                            WHITESPACE@3281..3282 " "
-                                                                                                            RANGE_EXPR@3282..3512
-                                                                                                              DOT2@3282..3284 ".."
-                                                                                                              WHITESPACE@3284..3288 "    "
-                                                                                                              RANGE_EXPR@3288..3512
-                                                                                                                DOT2EQ@3288..3291 "..="
-                                                                                                                RANGE_EXPR@3291..3512
-                                                                                                                  DOT2@3291..3293 ".."
-                                                                                                                  WHITESPACE@3293..3294 " "
-                                                                                                                  RANGE_EXPR@3294..3512
-                                                                                                                    DOT2EQ@3294..3297 "..="
-                                                                                                                    RANGE_EXPR@3297..3512
-                                                                                                                      DOT2@3297..3299 ".."
-                                                                                                                      WHITESPACE@3299..3303 "    "
-                                                                                                                      RANGE_EXPR@3303..3512
-                                                                                                                        DOT2EQ@3303..3306 "..="
-                                                                                                                        RANGE_EXPR@3306..3512
-                                                                                                                          DOT2@3306..3308 ".."
-                                                                                                                          WHITESPACE@3308..3309 " "
-                                                                                                                          RANGE_EXPR@3309..3512
-                                                                                                                            DOT2@3309..3311 ".."
-                                                                                                                            WHITESPACE@3311..3312 " "
-                                                                                                                            RANGE_EXPR@3312..3512
-                                                                                                                              DOT2@3312..3314 ".."
-                                                                                                                              WHITESPACE@3314..3318 "    "
-                                                                                                                              RANGE_EXPR@3318..3512
-                                                                                                                                DOT2@3318..3320 ".."
-                                                                                                                                WHITESPACE@3320..3321 " "
-                                                                                                                                RANGE_EXPR@3321..3512
-                                                                                                                                  DOT2EQ@3321..3324 "..="
-                                                                                                                                  RANGE_EXPR@3324..3512
-                                                                                                                                    DOT2@3324..3326 ".."
-                                                                                                                                    WHITESPACE@3326..3327 " "
-                                                                                                                                    RANGE_EXPR@3327..3512
-                                                                                                                                      DOT2@3327..3329 ".."
-                                                                                                                                      WHITESPACE@3329..3334 "\n    "
-                                                                                                                                      RANGE_EXPR@3334..3512
-                                                                                                                                        DOT2EQ@3334..3337 "..="
-                                                                                                                                        RANGE_EXPR@3337..3512
-                                                                                                                                          DOT2@3337..3339 ".."
-                                                                                                                                          WHITESPACE@3339..3340 " "
-                                                                                                                                          RANGE_EXPR@3340..3512
-                                                                                                                                            DOT2EQ@3340..3343 "..="
-                                                                                                                                            RANGE_EXPR@3343..3512
-                                                                                                                                              DOT2@3343..3345 ".."
-                                                                                                                                              WHITESPACE@3345..3349 "    "
-                                                                                                                                              RANGE_EXPR@3349..3512
-                                                                                                                                                DOT2EQ@3349..3352 "..="
-                                                                                                                                                RANGE_EXPR@3352..3512
-                                                                                                                                                  DOT2@3352..3354 ".."
-                                                                                                                                                  WHITESPACE@3354..3355 " "
-                                                                                                                                                  RANGE_EXPR@3355..3512
-                                                                                                                                                    DOT2EQ@3355..3358 "..="
-                                                                                                                                                    RANGE_EXPR@3358..3512
-                                                                                                                                                      DOT2@3358..3360 ".."
-                                                                                                                                                      WHITESPACE@3360..3364 "    "
-                                                                                                                                                      RANGE_EXPR@3364..3512
-                                                                                                                                                        DOT2@3364..3366 ".."
-                                                                                                                                                        WHITESPACE@3366..3367 " "
-                                                                                                                                                        RANGE_EXPR@3367..3512
-                                                                                                                                                          DOT2EQ@3367..3370 "..="
-                                                                                                                                                          RANGE_EXPR@3370..3512
-                                                                                                                                                            DOT2@3370..3372 ".."
-                                                                                                                                                            WHITESPACE@3372..3373 " "
-                                                                                                                                                            RANGE_EXPR@3373..3512
-                                                                                                                                                              DOT2@3373..3375 ".."
-                                                                                                                                                              WHITESPACE@3375..3379 "    "
-                                                                                                                                                              RANGE_EXPR@3379..3512
-                                                                                                                                                                DOT2@3379..3381 ".."
-                                                                                                                                                                WHITESPACE@3381..3382 " "
-                                                                                                                                                                RANGE_EXPR@3382..3512
-                                                                                                                                                                  DOT2EQ@3382..3385 "..="
-                                                                                                                                                                  RANGE_EXPR@3385..3512
-                                                                                                                                                                    DOT2@3385..3387 ".."
-                                                                                                                                                                    WHITESPACE@3387..3388 " "
-                                                                                                                                                                    RANGE_EXPR@3388..3512
-                                                                                                                                                                      DOT2@3388..3390 ".."
-                                                                                                                                                                      WHITESPACE@3390..3395 "\n    "
-                                                                                                                                                                      RANGE_EXPR@3395..3512
-                                                                                                                                                                        DOT2EQ@3395..3398 "..="
-                                                                                                                                                                        RANGE_EXPR@3398..3512
-                                                                                                                                                                          DOT2@3398..3400 ".."
-                                                                                                                                                                          WHITESPACE@3400..3401 " "
-                                                                                                                                                                          RANGE_EXPR@3401..3512
-                                                                                                                                                                            DOT2EQ@3401..3404 "..="
-                                                                                                                                                                            RANGE_EXPR@3404..3512
-                                                                                                                                                                              DOT2@3404..3406 ".."
-                                                                                                                                                                              WHITESPACE@3406..3410 "    "
-                                                                                                                                                                              RANGE_EXPR@3410..3512
-                                                                                                                                                                                DOT2EQ@3410..3413 "..="
-                                                                                                                                                                                RANGE_EXPR@3413..3512
-                                                                                                                                                                                  DOT2@3413..3415 ".."
-                                                                                                                                                                                  WHITESPACE@3415..3416 " "
-                                                                                                                                                                                  RANGE_EXPR@3416..3512
-                                                                                                                                                                                    DOT2EQ@3416..3419 "..="
-                                                                                                                                                                                    RANGE_EXPR@3419..3512
-                                                                                                                                                                                      DOT2@3419..3421 ".."
-                                                                                                                                                                                      WHITESPACE@3421..3425 "    "
-                                                                                                                                                                                      RANGE_EXPR@3425..3512
-                                                                                                                                                                                        DOT2@3425..3427 ".."
-                                                                                                                                                                                        WHITESPACE@3427..3428 " "
-                                                                                                                                                                                        RANGE_EXPR@3428..3512
-                                                                                                                                                                                          DOT2@3428..3430 ".."
-                                                                                                                                                                                          WHITESPACE@3430..3431 " "
-                                                                                                                                                                                          RANGE_EXPR@3431..3512
-                                                                                                                                                                                            DOT2EQ@3431..3434 "..="
-                                                                                                                                                                                            RANGE_EXPR@3434..3512
-                                                                                                                                                                                              DOT2@3434..3436 ".."
-                                                                                                                                                                                              WHITESPACE@3436..3440 "    "
-                                                                                                                                                                                              RANGE_EXPR@3440..3512
-                                                                                                                                                                                                DOT2@3440..3442 ".."
-                                                                                                                                                                                                WHITESPACE@3442..3443 " "
-                                                                                                                                                                                                RANGE_EXPR@3443..3512
-                                                                                                                                                                                                  DOT2EQ@3443..3446 "..="
-                                                                                                                                                                                                  RANGE_EXPR@3446..3512
-                                                                                                                                                                                                    DOT2@3446..3448 ".."
-                                                                                                                                                                                                    WHITESPACE@3448..3449 " "
-                                                                                                                                                                                                    RANGE_EXPR@3449..3512
-                                                                                                                                                                                                      DOT2@3449..3451 ".."
-                                                                                                                                                                                                      WHITESPACE@3451..3456 "\n    "
-                                                                                                                                                                                                      RANGE_EXPR@3456..3512
-                                                                                                                                                                                                        DOT2EQ@3456..3459 "..="
-                                                                                                                                                                                                        RANGE_EXPR@3459..3512
-                                                                                                                                                                                                          DOT2@3459..3461 ".."
-                                                                                                                                                                                                          WHITESPACE@3461..3462 " "
-                                                                                                                                                                                                          RANGE_EXPR@3462..3512
-                                                                                                                                                                                                            DOT2EQ@3462..3465 "..="
-                                                                                                                                                                                                            RANGE_EXPR@3465..3512
-                                                                                                                                                                                                              DOT2@3465..3467 ".."
-                                                                                                                                                                                                              WHITESPACE@3467..3471 "    "
-                                                                                                                                                                                                              RANGE_EXPR@3471..3512
-                                                                                                                                                                                                                DOT2@3471..3473 ".."
-                                                                                                                                                                                                                WHITESPACE@3473..3474 " "
-                                                                                                                                                                                                                RANGE_EXPR@3474..3512
-                                                                                                                                                                                                                  DOT2EQ@3474..3477 "..="
-                                                                                                                                                                                                                  RANGE_EXPR@3477..3512
-                                                                                                                                                                                                                    DOT2EQ@3477..3480 "..="
-                                                                                                                                                                                                                    RANGE_EXPR@3480..3512
-                                                                                                                                                                                                                      DOT2@3480..3482 ".."
-                                                                                                                                                                                                                      WHITESPACE@3482..3486 "    "
-                                                                                                                                                                                                                      RANGE_EXPR@3486..3512
-                                                                                                                                                                                                                        DOT2EQ@3486..3489 "..="
-                                                                                                                                                                                                                        RANGE_EXPR@3489..3512
-                                                                                                                                                                                                                          DOT2EQ@3489..3492 "..="
-                                                                                                                                                                                                                          RANGE_EXPR@3492..3512
-                                                                                                                                                                                                                            DOT2@3492..3494 ".."
-                                                                                                                                                                                                                            WHITESPACE@3494..3495 " "
-                                                                                                                                                                                                                            RANGE_EXPR@3495..3512
-                                                                                                                                                                                                                              DOT2@3495..3497 ".."
-                                                                                                                                                                                                                              WHITESPACE@3497..3501 "    "
-                                                                                                                                                                                                                              RANGE_EXPR@3501..3512
-                                                                                                                                                                                                                                DOT2@3501..3503 ".."
-                                                                                                                                                                                                                                WHITESPACE@3503..3504 " "
-                                                                                                                                                                                                                                RANGE_EXPR@3504..3512
-                                                                                                                                                                                                                                  DOT2EQ@3504..3507 "..="
-                                                                                                                                                                                                                                  RANGE_EXPR@3507..3512
-                                                                                                                                                                                                                                    DOT2@3507..3509 ".."
-                                                                                                                                                                                                                                    WHITESPACE@3509..3510 " "
-                                                                                                                                                                                                                                    RANGE_EXPR@3510..3512
-                                                                                                                                                                                                                                      DOT2@3510..3512 ".."
-      WHITESPACE@3512..3513 "\n"
-      R_CURLY@3513..3514 "}"
+      STMT_LIST@3084..3514
+        L_CURLY@3084..3085 "{"
+        WHITESPACE@3085..3090 "\n    "
+        RANGE_EXPR@3090..3512
+          DOT2EQ@3090..3093 "..="
+          RANGE_EXPR@3093..3512
+            DOT2EQ@3093..3096 "..="
+            RANGE_EXPR@3096..3512
+              DOT2@3096..3098 ".."
+              WHITESPACE@3098..3099 " "
+              RANGE_EXPR@3099..3512
+                DOT2@3099..3101 ".."
+                WHITESPACE@3101..3105 "    "
+                RANGE_EXPR@3105..3512
+                  DOT2@3105..3107 ".."
+                  WHITESPACE@3107..3108 " "
+                  RANGE_EXPR@3108..3512
+                    DOT2@3108..3110 ".."
+                    WHITESPACE@3110..3111 " "
+                    RANGE_EXPR@3111..3512
+                      DOT2@3111..3113 ".."
+                      WHITESPACE@3113..3114 " "
+                      RANGE_EXPR@3114..3512
+                        DOT2@3114..3116 ".."
+                        WHITESPACE@3116..3120 "    "
+                        RANGE_EXPR@3120..3512
+                          DOT2@3120..3122 ".."
+                          WHITESPACE@3122..3123 " "
+                          RANGE_EXPR@3123..3512
+                            DOT2@3123..3125 ".."
+                            WHITESPACE@3125..3126 " "
+                            RANGE_EXPR@3126..3512
+                              DOT2@3126..3128 ".."
+                              WHITESPACE@3128..3129 " "
+                              RANGE_EXPR@3129..3512
+                                DOT2@3129..3131 ".."
+                                WHITESPACE@3131..3135 "    "
+                                RANGE_EXPR@3135..3512
+                                  DOT2@3135..3137 ".."
+                                  WHITESPACE@3137..3138 " "
+                                  RANGE_EXPR@3138..3512
+                                    DOT2EQ@3138..3141 "..="
+                                    RANGE_EXPR@3141..3512
+                                      DOT2@3141..3143 ".."
+                                      WHITESPACE@3143..3144 " "
+                                      RANGE_EXPR@3144..3512
+                                        DOT2@3144..3146 ".."
+                                        WHITESPACE@3146..3151 "\n    "
+                                        RANGE_EXPR@3151..3512
+                                          DOT2EQ@3151..3154 "..="
+                                          RANGE_EXPR@3154..3512
+                                            DOT2@3154..3156 ".."
+                                            WHITESPACE@3156..3157 " "
+                                            RANGE_EXPR@3157..3512
+                                              DOT2EQ@3157..3160 "..="
+                                              RANGE_EXPR@3160..3512
+                                                DOT2@3160..3162 ".."
+                                                WHITESPACE@3162..3166 "    "
+                                                RANGE_EXPR@3166..3512
+                                                  DOT2@3166..3168 ".."
+                                                  WHITESPACE@3168..3169 " "
+                                                  RANGE_EXPR@3169..3512
+                                                    DOT2@3169..3171 ".."
+                                                    WHITESPACE@3171..3172 " "
+                                                    RANGE_EXPR@3172..3512
+                                                      DOT2@3172..3174 ".."
+                                                      WHITESPACE@3174..3175 " "
+                                                      RANGE_EXPR@3175..3512
+                                                        DOT2@3175..3177 ".."
+                                                        WHITESPACE@3177..3181 "    "
+                                                        RANGE_EXPR@3181..3512
+                                                          DOT2@3181..3183 ".."
+                                                          WHITESPACE@3183..3184 " "
+                                                          RANGE_EXPR@3184..3512
+                                                            DOT2@3184..3186 ".."
+                                                            WHITESPACE@3186..3187 " "
+                                                            RANGE_EXPR@3187..3512
+                                                              DOT2@3187..3189 ".."
+                                                              WHITESPACE@3189..3190 " "
+                                                              RANGE_EXPR@3190..3512
+                                                                DOT2@3190..3192 ".."
+                                                                WHITESPACE@3192..3196 "    "
+                                                                RANGE_EXPR@3196..3512
+                                                                  DOT2EQ@3196..3199 "..="
+                                                                  RANGE_EXPR@3199..3512
+                                                                    DOT2EQ@3199..3202 "..="
+                                                                    RANGE_EXPR@3202..3512
+                                                                      DOT2EQ@3202..3205 "..="
+                                                                      RANGE_EXPR@3205..3512
+                                                                        DOT2@3205..3207 ".."
+                                                                        WHITESPACE@3207..3212 "\n    "
+                                                                        RANGE_EXPR@3212..3512
+                                                                          DOT2EQ@3212..3215 "..="
+                                                                          RANGE_EXPR@3215..3512
+                                                                            DOT2@3215..3217 ".."
+                                                                            WHITESPACE@3217..3218 " "
+                                                                            RANGE_EXPR@3218..3512
+                                                                              DOT2EQ@3218..3221 "..="
+                                                                              RANGE_EXPR@3221..3512
+                                                                                DOT2@3221..3223 ".."
+                                                                                WHITESPACE@3223..3227 "    "
+                                                                                RANGE_EXPR@3227..3512
+                                                                                  DOT2EQ@3227..3230 "..="
+                                                                                  RANGE_EXPR@3230..3512
+                                                                                    DOT2@3230..3232 ".."
+                                                                                    WHITESPACE@3232..3233 " "
+                                                                                    RANGE_EXPR@3233..3512
+                                                                                      DOT2EQ@3233..3236 "..="
+                                                                                      RANGE_EXPR@3236..3512
+                                                                                        DOT2@3236..3238 ".."
+                                                                                        WHITESPACE@3238..3242 "    "
+                                                                                        RANGE_EXPR@3242..3512
+                                                                                          DOT2@3242..3244 ".."
+                                                                                          WHITESPACE@3244..3245 " "
+                                                                                          RANGE_EXPR@3245..3512
+                                                                                            DOT2EQ@3245..3248 "..="
+                                                                                            RANGE_EXPR@3248..3512
+                                                                                              DOT2EQ@3248..3251 "..="
+                                                                                              RANGE_EXPR@3251..3512
+                                                                                                DOT2@3251..3253 ".."
+                                                                                                WHITESPACE@3253..3257 "    "
+                                                                                                RANGE_EXPR@3257..3512
+                                                                                                  DOT2@3257..3259 ".."
+                                                                                                  WHITESPACE@3259..3260 " "
+                                                                                                  RANGE_EXPR@3260..3512
+                                                                                                    DOT2EQ@3260..3263 "..="
+                                                                                                    RANGE_EXPR@3263..3512
+                                                                                                      DOT2@3263..3265 ".."
+                                                                                                      WHITESPACE@3265..3266 " "
+                                                                                                      RANGE_EXPR@3266..3512
+                                                                                                        DOT2@3266..3268 ".."
+                                                                                                        WHITESPACE@3268..3273 "\n    "
+                                                                                                        RANGE_EXPR@3273..3512
+                                                                                                          DOT2EQ@3273..3276 "..="
+                                                                                                          RANGE_EXPR@3276..3512
+                                                                                                            DOT2EQ@3276..3279 "..="
+                                                                                                            RANGE_EXPR@3279..3512
+                                                                                                              DOT2@3279..3281 ".."
+                                                                                                              WHITESPACE@3281..3282 " "
+                                                                                                              RANGE_EXPR@3282..3512
+                                                                                                                DOT2@3282..3284 ".."
+                                                                                                                WHITESPACE@3284..3288 "    "
+                                                                                                                RANGE_EXPR@3288..3512
+                                                                                                                  DOT2EQ@3288..3291 "..="
+                                                                                                                  RANGE_EXPR@3291..3512
+                                                                                                                    DOT2@3291..3293 ".."
+                                                                                                                    WHITESPACE@3293..3294 " "
+                                                                                                                    RANGE_EXPR@3294..3512
+                                                                                                                      DOT2EQ@3294..3297 "..="
+                                                                                                                      RANGE_EXPR@3297..3512
+                                                                                                                        DOT2@3297..3299 ".."
+                                                                                                                        WHITESPACE@3299..3303 "    "
+                                                                                                                        RANGE_EXPR@3303..3512
+                                                                                                                          DOT2EQ@3303..3306 "..="
+                                                                                                                          RANGE_EXPR@3306..3512
+                                                                                                                            DOT2@3306..3308 ".."
+                                                                                                                            WHITESPACE@3308..3309 " "
+                                                                                                                            RANGE_EXPR@3309..3512
+                                                                                                                              DOT2@3309..3311 ".."
+                                                                                                                              WHITESPACE@3311..3312 " "
+                                                                                                                              RANGE_EXPR@3312..3512
+                                                                                                                                DOT2@3312..3314 ".."
+                                                                                                                                WHITESPACE@3314..3318 "    "
+                                                                                                                                RANGE_EXPR@3318..3512
+                                                                                                                                  DOT2@3318..3320 ".."
+                                                                                                                                  WHITESPACE@3320..3321 " "
+                                                                                                                                  RANGE_EXPR@3321..3512
+                                                                                                                                    DOT2EQ@3321..3324 "..="
+                                                                                                                                    RANGE_EXPR@3324..3512
+                                                                                                                                      DOT2@3324..3326 ".."
+                                                                                                                                      WHITESPACE@3326..3327 " "
+                                                                                                                                      RANGE_EXPR@3327..3512
+                                                                                                                                        DOT2@3327..3329 ".."
+                                                                                                                                        WHITESPACE@3329..3334 "\n    "
+                                                                                                                                        RANGE_EXPR@3334..3512
+                                                                                                                                          DOT2EQ@3334..3337 "..="
+                                                                                                                                          RANGE_EXPR@3337..3512
+                                                                                                                                            DOT2@3337..3339 ".."
+                                                                                                                                            WHITESPACE@3339..3340 " "
+                                                                                                                                            RANGE_EXPR@3340..3512
+                                                                                                                                              DOT2EQ@3340..3343 "..="
+                                                                                                                                              RANGE_EXPR@3343..3512
+                                                                                                                                                DOT2@3343..3345 ".."
+                                                                                                                                                WHITESPACE@3345..3349 "    "
+                                                                                                                                                RANGE_EXPR@3349..3512
+                                                                                                                                                  DOT2EQ@3349..3352 "..="
+                                                                                                                                                  RANGE_EXPR@3352..3512
+                                                                                                                                                    DOT2@3352..3354 ".."
+                                                                                                                                                    WHITESPACE@3354..3355 " "
+                                                                                                                                                    RANGE_EXPR@3355..3512
+                                                                                                                                                      DOT2EQ@3355..3358 "..="
+                                                                                                                                                      RANGE_EXPR@3358..3512
+                                                                                                                                                        DOT2@3358..3360 ".."
+                                                                                                                                                        WHITESPACE@3360..3364 "    "
+                                                                                                                                                        RANGE_EXPR@3364..3512
+                                                                                                                                                          DOT2@3364..3366 ".."
+                                                                                                                                                          WHITESPACE@3366..3367 " "
+                                                                                                                                                          RANGE_EXPR@3367..3512
+                                                                                                                                                            DOT2EQ@3367..3370 "..="
+                                                                                                                                                            RANGE_EXPR@3370..3512
+                                                                                                                                                              DOT2@3370..3372 ".."
+                                                                                                                                                              WHITESPACE@3372..3373 " "
+                                                                                                                                                              RANGE_EXPR@3373..3512
+                                                                                                                                                                DOT2@3373..3375 ".."
+                                                                                                                                                                WHITESPACE@3375..3379 "    "
+                                                                                                                                                                RANGE_EXPR@3379..3512
+                                                                                                                                                                  DOT2@3379..3381 ".."
+                                                                                                                                                                  WHITESPACE@3381..3382 " "
+                                                                                                                                                                  RANGE_EXPR@3382..3512
+                                                                                                                                                                    DOT2EQ@3382..3385 "..="
+                                                                                                                                                                    RANGE_EXPR@3385..3512
+                                                                                                                                                                      DOT2@3385..3387 ".."
+                                                                                                                                                                      WHITESPACE@3387..3388 " "
+                                                                                                                                                                      RANGE_EXPR@3388..3512
+                                                                                                                                                                        DOT2@3388..3390 ".."
+                                                                                                                                                                        WHITESPACE@3390..3395 "\n    "
+                                                                                                                                                                        RANGE_EXPR@3395..3512
+                                                                                                                                                                          DOT2EQ@3395..3398 "..="
+                                                                                                                                                                          RANGE_EXPR@3398..3512
+                                                                                                                                                                            DOT2@3398..3400 ".."
+                                                                                                                                                                            WHITESPACE@3400..3401 " "
+                                                                                                                                                                            RANGE_EXPR@3401..3512
+                                                                                                                                                                              DOT2EQ@3401..3404 "..="
+                                                                                                                                                                              RANGE_EXPR@3404..3512
+                                                                                                                                                                                DOT2@3404..3406 ".."
+                                                                                                                                                                                WHITESPACE@3406..3410 "    "
+                                                                                                                                                                                RANGE_EXPR@3410..3512
+                                                                                                                                                                                  DOT2EQ@3410..3413 "..="
+                                                                                                                                                                                  RANGE_EXPR@3413..3512
+                                                                                                                                                                                    DOT2@3413..3415 ".."
+                                                                                                                                                                                    WHITESPACE@3415..3416 " "
+                                                                                                                                                                                    RANGE_EXPR@3416..3512
+                                                                                                                                                                                      DOT2EQ@3416..3419 "..="
+                                                                                                                                                                                      RANGE_EXPR@3419..3512
+                                                                                                                                                                                        DOT2@3419..3421 ".."
+                                                                                                                                                                                        WHITESPACE@3421..3425 "    "
+                                                                                                                                                                                        RANGE_EXPR@3425..3512
+                                                                                                                                                                                          DOT2@3425..3427 ".."
+                                                                                                                                                                                          WHITESPACE@3427..3428 " "
+                                                                                                                                                                                          RANGE_EXPR@3428..3512
+                                                                                                                                                                                            DOT2@3428..3430 ".."
+                                                                                                                                                                                            WHITESPACE@3430..3431 " "
+                                                                                                                                                                                            RANGE_EXPR@3431..3512
+                                                                                                                                                                                              DOT2EQ@3431..3434 "..="
+                                                                                                                                                                                              RANGE_EXPR@3434..3512
+                                                                                                                                                                                                DOT2@3434..3436 ".."
+                                                                                                                                                                                                WHITESPACE@3436..3440 "    "
+                                                                                                                                                                                                RANGE_EXPR@3440..3512
+                                                                                                                                                                                                  DOT2@3440..3442 ".."
+                                                                                                                                                                                                  WHITESPACE@3442..3443 " "
+                                                                                                                                                                                                  RANGE_EXPR@3443..3512
+                                                                                                                                                                                                    DOT2EQ@3443..3446 "..="
+                                                                                                                                                                                                    RANGE_EXPR@3446..3512
+                                                                                                                                                                                                      DOT2@3446..3448 ".."
+                                                                                                                                                                                                      WHITESPACE@3448..3449 " "
+                                                                                                                                                                                                      RANGE_EXPR@3449..3512
+                                                                                                                                                                                                        DOT2@3449..3451 ".."
+                                                                                                                                                                                                        WHITESPACE@3451..3456 "\n    "
+                                                                                                                                                                                                        RANGE_EXPR@3456..3512
+                                                                                                                                                                                                          DOT2EQ@3456..3459 "..="
+                                                                                                                                                                                                          RANGE_EXPR@3459..3512
+                                                                                                                                                                                                            DOT2@3459..3461 ".."
+                                                                                                                                                                                                            WHITESPACE@3461..3462 " "
+                                                                                                                                                                                                            RANGE_EXPR@3462..3512
+                                                                                                                                                                                                              DOT2EQ@3462..3465 "..="
+                                                                                                                                                                                                              RANGE_EXPR@3465..3512
+                                                                                                                                                                                                                DOT2@3465..3467 ".."
+                                                                                                                                                                                                                WHITESPACE@3467..3471 "    "
+                                                                                                                                                                                                                RANGE_EXPR@3471..3512
+                                                                                                                                                                                                                  DOT2@3471..3473 ".."
+                                                                                                                                                                                                                  WHITESPACE@3473..3474 " "
+                                                                                                                                                                                                                  RANGE_EXPR@3474..3512
+                                                                                                                                                                                                                    DOT2EQ@3474..3477 "..="
+                                                                                                                                                                                                                    RANGE_EXPR@3477..3512
+                                                                                                                                                                                                                      DOT2EQ@3477..3480 "..="
+                                                                                                                                                                                                                      RANGE_EXPR@3480..3512
+                                                                                                                                                                                                                        DOT2@3480..3482 ".."
+                                                                                                                                                                                                                        WHITESPACE@3482..3486 "    "
+                                                                                                                                                                                                                        RANGE_EXPR@3486..3512
+                                                                                                                                                                                                                          DOT2EQ@3486..3489 "..="
+                                                                                                                                                                                                                          RANGE_EXPR@3489..3512
+                                                                                                                                                                                                                            DOT2EQ@3489..3492 "..="
+                                                                                                                                                                                                                            RANGE_EXPR@3492..3512
+                                                                                                                                                                                                                              DOT2@3492..3494 ".."
+                                                                                                                                                                                                                              WHITESPACE@3494..3495 " "
+                                                                                                                                                                                                                              RANGE_EXPR@3495..3512
+                                                                                                                                                                                                                                DOT2@3495..3497 ".."
+                                                                                                                                                                                                                                WHITESPACE@3497..3501 "    "
+                                                                                                                                                                                                                                RANGE_EXPR@3501..3512
+                                                                                                                                                                                                                                  DOT2@3501..3503 ".."
+                                                                                                                                                                                                                                  WHITESPACE@3503..3504 " "
+                                                                                                                                                                                                                                  RANGE_EXPR@3504..3512
+                                                                                                                                                                                                                                    DOT2EQ@3504..3507 "..="
+                                                                                                                                                                                                                                    RANGE_EXPR@3507..3512
+                                                                                                                                                                                                                                      DOT2@3507..3509 ".."
+                                                                                                                                                                                                                                      WHITESPACE@3509..3510 " "
+                                                                                                                                                                                                                                      RANGE_EXPR@3510..3512
+                                                                                                                                                                                                                                        DOT2@3510..3512 ".."
+        WHITESPACE@3512..3513 "\n"
+        R_CURLY@3513..3514 "}"
   WHITESPACE@3514..3516 "\n\n"
   FN@3516..3552
     FN_KW@3516..3518 "fn"
@@ -2074,29 +2110,30 @@ SOURCE_FILE@0..3813
       R_PAREN@3526..3527 ")"
     WHITESPACE@3527..3528 " "
     BLOCK_EXPR@3528..3552
-      L_CURLY@3528..3529 "{"
-      WHITESPACE@3529..3534 "\n    "
-      SEMICOLON@3534..3535 ";"
-      SEMICOLON@3535..3536 ";"
-      SEMICOLON@3536..3537 ";"
-      EXPR_STMT@3537..3540
-        TUPLE_EXPR@3537..3539
-          L_PAREN@3537..3538 "("
-          R_PAREN@3538..3539 ")"
-        SEMICOLON@3539..3540 ";"
-      SEMICOLON@3540..3541 ";"
-      SEMICOLON@3541..3542 ";"
-      SEMICOLON@3542..3543 ";"
-      SEMICOLON@3543..3544 ";"
-      SEMICOLON@3544..3545 ";"
-      SEMICOLON@3545..3546 ";"
-      SEMICOLON@3546..3547 ";"
-      SEMICOLON@3547..3548 ";"
-      TUPLE_EXPR@3548..3550
-        L_PAREN@3548..3549 "("
-        R_PAREN@3549..3550 ")"
-      WHITESPACE@3550..3551 "\n"
-      R_CURLY@3551..3552 "}"
+      STMT_LIST@3528..3552
+        L_CURLY@3528..3529 "{"
+        WHITESPACE@3529..3534 "\n    "
+        SEMICOLON@3534..3535 ";"
+        SEMICOLON@3535..3536 ";"
+        SEMICOLON@3536..3537 ";"
+        EXPR_STMT@3537..3540
+          TUPLE_EXPR@3537..3539
+            L_PAREN@3537..3538 "("
+            R_PAREN@3538..3539 ")"
+          SEMICOLON@3539..3540 ";"
+        SEMICOLON@3540..3541 ";"
+        SEMICOLON@3541..3542 ";"
+        SEMICOLON@3542..3543 ";"
+        SEMICOLON@3543..3544 ";"
+        SEMICOLON@3544..3545 ";"
+        SEMICOLON@3545..3546 ";"
+        SEMICOLON@3546..3547 ";"
+        SEMICOLON@3547..3548 ";"
+        TUPLE_EXPR@3548..3550
+          L_PAREN@3548..3549 "("
+          R_PAREN@3549..3550 ")"
+        WHITESPACE@3550..3551 "\n"
+        R_CURLY@3551..3552 "}"
   WHITESPACE@3552..3554 "\n\n"
   FN@3554..3812
     VISIBILITY@3554..3557
@@ -2111,189 +2148,190 @@ SOURCE_FILE@0..3813
       R_PAREN@3566..3567 ")"
     WHITESPACE@3567..3568 " "
     BLOCK_EXPR@3568..3812
-      L_CURLY@3568..3569 "{"
-      WHITESPACE@3569..3574 "\n    "
-      EXPR_STMT@3574..3584
-        CALL_EXPR@3574..3583
-          PATH_EXPR@3574..3581
-            PATH@3574..3581
-              PATH_SEGMENT@3574..3581
-                NAME_REF@3574..3581
-                  IDENT@3574..3581 "strange"
-          ARG_LIST@3581..3583
-            L_PAREN@3581..3582 "("
-            R_PAREN@3582..3583 ")"
-        SEMICOLON@3583..3584 ";"
-      WHITESPACE@3584..3589 "\n    "
-      EXPR_STMT@3589..3597
-        CALL_EXPR@3589..3596
-          PATH_EXPR@3589..3594
-            PATH@3589..3594
-              PATH_SEGMENT@3589..3594
-                NAME_REF@3589..3594
-                  IDENT@3589..3594 "funny"
-          ARG_LIST@3594..3596
-            L_PAREN@3594..3595 "("
-            R_PAREN@3595..3596 ")"
-        SEMICOLON@3596..3597 ";"
-      WHITESPACE@3597..3602 "\n    "
-      EXPR_STMT@3602..3609
-        CALL_EXPR@3602..3608
-          PATH_EXPR@3602..3606
-            PATH@3602..3606
-              PATH_SEGMENT@3602..3606
-                NAME_REF@3602..3606
-                  IDENT@3602..3606 "what"
-          ARG_LIST@3606..3608
-            L_PAREN@3606..3607 "("
-            R_PAREN@3607..3608 ")"
-        SEMICOLON@3608..3609 ";"
-      WHITESPACE@3609..3614 "\n    "
-      EXPR_STMT@3614..3628
-        CALL_EXPR@3614..3627
-          PATH_EXPR@3614..3625
-            PATH@3614..3625
-              PATH_SEGMENT@3614..3625
-                NAME_REF@3614..3625
-                  IDENT@3614..3625 "zombiejesus"
-          ARG_LIST@3625..3627
-            L_PAREN@3625..3626 "("
-            R_PAREN@3626..3627 ")"
-        SEMICOLON@3627..3628 ";"
-      WHITESPACE@3628..3633 "\n    "
-      EXPR_STMT@3633..3643
-        CALL_EXPR@3633..3642
-          PATH_EXPR@3633..3640
-            PATH@3633..3640
-              PATH_SEGMENT@3633..3640
-                NAME_REF@3633..3640
-                  IDENT@3633..3640 "notsure"
-          ARG_LIST@3640..3642
-            L_PAREN@3640..3641 "("
-            R_PAREN@3641..3642 ")"
-        SEMICOLON@3642..3643 ";"
-      WHITESPACE@3643..3648 "\n    "
-      EXPR_STMT@3648..3664
-        CALL_EXPR@3648..3663
-          PATH_EXPR@3648..3661
-            PATH@3648..3661
-              PATH_SEGMENT@3648..3661
-                NAME_REF@3648..3661
-                  IDENT@3648..3661 "canttouchthis"
-          ARG_LIST@3661..3663
-            L_PAREN@3661..3662 "("
-            R_PAREN@3662..3663 ")"
-        SEMICOLON@3663..3664 ";"
-      WHITESPACE@3664..3669 "\n    "
-      EXPR_STMT@3669..3681
-        CALL_EXPR@3669..3680
-          PATH_EXPR@3669..3678
-            PATH@3669..3678
-              PATH_SEGMENT@3669..3678
-                NAME_REF@3669..3678
-                  IDENT@3669..3678 "angrydome"
-          ARG_LIST@3678..3680
-            L_PAREN@3678..3679 "("
-            R_PAREN@3679..3680 ")"
-        SEMICOLON@3680..3681 ";"
-      WHITESPACE@3681..3686 "\n    "
-      EXPR_STMT@3686..3701
-        CALL_EXPR@3686..3700
-          PATH_EXPR@3686..3698
-            PATH@3686..3698
-              PATH_SEGMENT@3686..3698
-                NAME_REF@3686..3698
-                  IDENT@3686..3698 "evil_lincoln"
-          ARG_LIST@3698..3700
-            L_PAREN@3698..3699 "("
-            R_PAREN@3699..3700 ")"
-        SEMICOLON@3700..3701 ";"
-      WHITESPACE@3701..3706 "\n    "
-      EXPR_STMT@3706..3713
-        CALL_EXPR@3706..3712
-          PATH_EXPR@3706..3710
-            PATH@3706..3710
-              PATH_SEGMENT@3706..3710
-                NAME_REF@3706..3710
-                  IDENT@3706..3710 "dots"
-          ARG_LIST@3710..3712
-            L_PAREN@3710..3711 "("
-            R_PAREN@3711..3712 ")"
-        SEMICOLON@3712..3713 ";"
-      WHITESPACE@3713..3718 "\n    "
-      EXPR_STMT@3718..3726
-        CALL_EXPR@3718..3725
-          PATH_EXPR@3718..3720
-            PATH@3718..3720
-              PATH_SEGMENT@3718..3720
-                NAME_REF@3718..3720
-                  IDENT@3718..3720 "u8"
-          ARG_LIST@3720..3725
-            L_PAREN@3720..3721 "("
-            LITERAL@3721..3724
-              INT_NUMBER@3721..3724 "8u8"
-            R_PAREN@3724..3725 ")"
-        SEMICOLON@3725..3726 ";"
-      WHITESPACE@3726..3731 "\n    "
-      EXPR_STMT@3731..3739
-        CALL_EXPR@3731..3738
-          PATH_EXPR@3731..3736
-            PATH@3731..3736
-              PATH_SEGMENT@3731..3736
-                NAME_REF@3731..3736
-                  IDENT@3731..3736 "fishy"
-          ARG_LIST@3736..3738
-            L_PAREN@3736..3737 "("
-            R_PAREN@3737..3738 ")"
-        SEMICOLON@3738..3739 ";"
-      WHITESPACE@3739..3744 "\n    "
-      EXPR_STMT@3744..3752
-        CALL_EXPR@3744..3751
-          PATH_EXPR@3744..3749
-            PATH@3744..3749
-              PATH_SEGMENT@3744..3749
-                NAME_REF@3744..3749
-                  IDENT@3744..3749 "union"
-          ARG_LIST@3749..3751
-            L_PAREN@3749..3750 "("
-            R_PAREN@3750..3751 ")"
-        SEMICOLON@3751..3752 ";"
-      WHITESPACE@3752..3757 "\n    "
-      EXPR_STMT@3757..3778
-        CALL_EXPR@3757..3777
-          PATH_EXPR@3757..3775
-            PATH@3757..3775
-              PATH_SEGMENT@3757..3775
-                NAME_REF@3757..3775
-                  IDENT@3757..3775 "special_characters"
-          ARG_LIST@3775..3777
-            L_PAREN@3775..3776 "("
-            R_PAREN@3776..3777 ")"
-        SEMICOLON@3777..3778 ";"
-      WHITESPACE@3778..3783 "\n    "
-      EXPR_STMT@3783..3796
-        CALL_EXPR@3783..3795
-          PATH_EXPR@3783..3793
-            PATH@3783..3793
-              PATH_SEGMENT@3783..3793
-                NAME_REF@3783..3793
-                  IDENT@3783..3793 "punch_card"
-          ARG_LIST@3793..3795
-            L_PAREN@3793..3794 "("
-            R_PAREN@3794..3795 ")"
-        SEMICOLON@3795..3796 ";"
-      WHITESPACE@3796..3801 "\n    "
-      EXPR_STMT@3801..3810
-        CALL_EXPR@3801..3809
-          PATH_EXPR@3801..3807
-            PATH@3801..3807
-              PATH_SEGMENT@3801..3807
-                NAME_REF@3801..3807
-                  IDENT@3801..3807 "ktulhu"
-          ARG_LIST@3807..3809
-            L_PAREN@3807..3808 "("
-            R_PAREN@3808..3809 ")"
-        SEMICOLON@3809..3810 ";"
-      WHITESPACE@3810..3811 "\n"
-      R_CURLY@3811..3812 "}"
+      STMT_LIST@3568..3812
+        L_CURLY@3568..3569 "{"
+        WHITESPACE@3569..3574 "\n    "
+        EXPR_STMT@3574..3584
+          CALL_EXPR@3574..3583
+            PATH_EXPR@3574..3581
+              PATH@3574..3581
+                PATH_SEGMENT@3574..3581
+                  NAME_REF@3574..3581
+                    IDENT@3574..3581 "strange"
+            ARG_LIST@3581..3583
+              L_PAREN@3581..3582 "("
+              R_PAREN@3582..3583 ")"
+          SEMICOLON@3583..3584 ";"
+        WHITESPACE@3584..3589 "\n    "
+        EXPR_STMT@3589..3597
+          CALL_EXPR@3589..3596
+            PATH_EXPR@3589..3594
+              PATH@3589..3594
+                PATH_SEGMENT@3589..3594
+                  NAME_REF@3589..3594
+                    IDENT@3589..3594 "funny"
+            ARG_LIST@3594..3596
+              L_PAREN@3594..3595 "("
+              R_PAREN@3595..3596 ")"
+          SEMICOLON@3596..3597 ";"
+        WHITESPACE@3597..3602 "\n    "
+        EXPR_STMT@3602..3609
+          CALL_EXPR@3602..3608
+            PATH_EXPR@3602..3606
+              PATH@3602..3606
+                PATH_SEGMENT@3602..3606
+                  NAME_REF@3602..3606
+                    IDENT@3602..3606 "what"
+            ARG_LIST@3606..3608
+              L_PAREN@3606..3607 "("
+              R_PAREN@3607..3608 ")"
+          SEMICOLON@3608..3609 ";"
+        WHITESPACE@3609..3614 "\n    "
+        EXPR_STMT@3614..3628
+          CALL_EXPR@3614..3627
+            PATH_EXPR@3614..3625
+              PATH@3614..3625
+                PATH_SEGMENT@3614..3625
+                  NAME_REF@3614..3625
+                    IDENT@3614..3625 "zombiejesus"
+            ARG_LIST@3625..3627
+              L_PAREN@3625..3626 "("
+              R_PAREN@3626..3627 ")"
+          SEMICOLON@3627..3628 ";"
+        WHITESPACE@3628..3633 "\n    "
+        EXPR_STMT@3633..3643
+          CALL_EXPR@3633..3642
+            PATH_EXPR@3633..3640
+              PATH@3633..3640
+                PATH_SEGMENT@3633..3640
+                  NAME_REF@3633..3640
+                    IDENT@3633..3640 "notsure"
+            ARG_LIST@3640..3642
+              L_PAREN@3640..3641 "("
+              R_PAREN@3641..3642 ")"
+          SEMICOLON@3642..3643 ";"
+        WHITESPACE@3643..3648 "\n    "
+        EXPR_STMT@3648..3664
+          CALL_EXPR@3648..3663
+            PATH_EXPR@3648..3661
+              PATH@3648..3661
+                PATH_SEGMENT@3648..3661
+                  NAME_REF@3648..3661
+                    IDENT@3648..3661 "canttouchthis"
+            ARG_LIST@3661..3663
+              L_PAREN@3661..3662 "("
+              R_PAREN@3662..3663 ")"
+          SEMICOLON@3663..3664 ";"
+        WHITESPACE@3664..3669 "\n    "
+        EXPR_STMT@3669..3681
+          CALL_EXPR@3669..3680
+            PATH_EXPR@3669..3678
+              PATH@3669..3678
+                PATH_SEGMENT@3669..3678
+                  NAME_REF@3669..3678
+                    IDENT@3669..3678 "angrydome"
+            ARG_LIST@3678..3680
+              L_PAREN@3678..3679 "("
+              R_PAREN@3679..3680 ")"
+          SEMICOLON@3680..3681 ";"
+        WHITESPACE@3681..3686 "\n    "
+        EXPR_STMT@3686..3701
+          CALL_EXPR@3686..3700
+            PATH_EXPR@3686..3698
+              PATH@3686..3698
+                PATH_SEGMENT@3686..3698
+                  NAME_REF@3686..3698
+                    IDENT@3686..3698 "evil_lincoln"
+            ARG_LIST@3698..3700
+              L_PAREN@3698..3699 "("
+              R_PAREN@3699..3700 ")"
+          SEMICOLON@3700..3701 ";"
+        WHITESPACE@3701..3706 "\n    "
+        EXPR_STMT@3706..3713
+          CALL_EXPR@3706..3712
+            PATH_EXPR@3706..3710
+              PATH@3706..3710
+                PATH_SEGMENT@3706..3710
+                  NAME_REF@3706..3710
+                    IDENT@3706..3710 "dots"
+            ARG_LIST@3710..3712
+              L_PAREN@3710..3711 "("
+              R_PAREN@3711..3712 ")"
+          SEMICOLON@3712..3713 ";"
+        WHITESPACE@3713..3718 "\n    "
+        EXPR_STMT@3718..3726
+          CALL_EXPR@3718..3725
+            PATH_EXPR@3718..3720
+              PATH@3718..3720
+                PATH_SEGMENT@3718..3720
+                  NAME_REF@3718..3720
+                    IDENT@3718..3720 "u8"
+            ARG_LIST@3720..3725
+              L_PAREN@3720..3721 "("
+              LITERAL@3721..3724
+                INT_NUMBER@3721..3724 "8u8"
+              R_PAREN@3724..3725 ")"
+          SEMICOLON@3725..3726 ";"
+        WHITESPACE@3726..3731 "\n    "
+        EXPR_STMT@3731..3739
+          CALL_EXPR@3731..3738
+            PATH_EXPR@3731..3736
+              PATH@3731..3736
+                PATH_SEGMENT@3731..3736
+                  NAME_REF@3731..3736
+                    IDENT@3731..3736 "fishy"
+            ARG_LIST@3736..3738
+              L_PAREN@3736..3737 "("
+              R_PAREN@3737..3738 ")"
+          SEMICOLON@3738..3739 ";"
+        WHITESPACE@3739..3744 "\n    "
+        EXPR_STMT@3744..3752
+          CALL_EXPR@3744..3751
+            PATH_EXPR@3744..3749
+              PATH@3744..3749
+                PATH_SEGMENT@3744..3749
+                  NAME_REF@3744..3749
+                    IDENT@3744..3749 "union"
+            ARG_LIST@3749..3751
+              L_PAREN@3749..3750 "("
+              R_PAREN@3750..3751 ")"
+          SEMICOLON@3751..3752 ";"
+        WHITESPACE@3752..3757 "\n    "
+        EXPR_STMT@3757..3778
+          CALL_EXPR@3757..3777
+            PATH_EXPR@3757..3775
+              PATH@3757..3775
+                PATH_SEGMENT@3757..3775
+                  NAME_REF@3757..3775
+                    IDENT@3757..3775 "special_characters"
+            ARG_LIST@3775..3777
+              L_PAREN@3775..3776 "("
+              R_PAREN@3776..3777 ")"
+          SEMICOLON@3777..3778 ";"
+        WHITESPACE@3778..3783 "\n    "
+        EXPR_STMT@3783..3796
+          CALL_EXPR@3783..3795
+            PATH_EXPR@3783..3793
+              PATH@3783..3793
+                PATH_SEGMENT@3783..3793
+                  NAME_REF@3783..3793
+                    IDENT@3783..3793 "punch_card"
+            ARG_LIST@3793..3795
+              L_PAREN@3793..3794 "("
+              R_PAREN@3794..3795 ")"
+          SEMICOLON@3795..3796 ";"
+        WHITESPACE@3796..3801 "\n    "
+        EXPR_STMT@3801..3810
+          CALL_EXPR@3801..3809
+            PATH_EXPR@3801..3807
+              PATH@3801..3807
+                PATH_SEGMENT@3801..3807
+                  NAME_REF@3801..3807
+                    IDENT@3801..3807 "ktulhu"
+            ARG_LIST@3807..3809
+              L_PAREN@3807..3808 "("
+              R_PAREN@3808..3809 ")"
+          SEMICOLON@3809..3810 ";"
+        WHITESPACE@3810..3811 "\n"
+        R_CURLY@3811..3812 "}"
   WHITESPACE@3812..3813 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0036_fully_qualified.rast b/crates/syntax/test_data/parser/ok/0036_fully_qualified.rast
index c4da317b9f9..2aa7fffd1c5 100644
--- a/crates/syntax/test_data/parser/ok/0036_fully_qualified.rast
+++ b/crates/syntax/test_data/parser/ok/0036_fully_qualified.rast
@@ -76,17 +76,18 @@ SOURCE_FILE@0..157
       COMMA@133..134 ","
     WHITESPACE@134..135 "\n"
     BLOCK_EXPR@135..156
-      L_CURLY@135..136 "{"
-      WHITESPACE@136..141 "\n    "
-      METHOD_CALL_EXPR@141..154
-        LITERAL@141..143
-          STRING@141..143 "\"\""
-        DOT@143..144 "."
-        NAME_REF@144..152
-          IDENT@144..152 "to_owned"
-        ARG_LIST@152..154
-          L_PAREN@152..153 "("
-          R_PAREN@153..154 ")"
-      WHITESPACE@154..155 "\n"
-      R_CURLY@155..156 "}"
+      STMT_LIST@135..156
+        L_CURLY@135..136 "{"
+        WHITESPACE@136..141 "\n    "
+        METHOD_CALL_EXPR@141..154
+          LITERAL@141..143
+            STRING@141..143 "\"\""
+          DOT@143..144 "."
+          NAME_REF@144..152
+            IDENT@144..152 "to_owned"
+          ARG_LIST@152..154
+            L_PAREN@152..153 "("
+            R_PAREN@153..154 ")"
+        WHITESPACE@154..155 "\n"
+        R_CURLY@155..156 "}"
   WHITESPACE@156..157 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0038_where_pred_type.rast b/crates/syntax/test_data/parser/ok/0038_where_pred_type.rast
index 22168eaf1ac..09aa2e60d97 100644
--- a/crates/syntax/test_data/parser/ok/0038_where_pred_type.rast
+++ b/crates/syntax/test_data/parser/ok/0038_where_pred_type.rast
@@ -38,5 +38,6 @@ SOURCE_FILE@0..34
                     IDENT@28..31 "Foo"
     WHITESPACE@31..32 " "
     BLOCK_EXPR@32..34
-      L_CURLY@32..33 "{"
-      R_CURLY@33..34 "}"
+      STMT_LIST@32..34
+        L_CURLY@32..33 "{"
+        R_CURLY@33..34 "}"
diff --git a/crates/syntax/test_data/parser/ok/0039_raw_fn_item.rast b/crates/syntax/test_data/parser/ok/0039_raw_fn_item.rast
index 68a366354e6..186dea82d4d 100644
--- a/crates/syntax/test_data/parser/ok/0039_raw_fn_item.rast
+++ b/crates/syntax/test_data/parser/ok/0039_raw_fn_item.rast
@@ -9,7 +9,8 @@ SOURCE_FILE@0..15
       R_PAREN@9..10 ")"
     WHITESPACE@10..11 " "
     BLOCK_EXPR@11..14
-      L_CURLY@11..12 "{"
-      WHITESPACE@12..13 "\n"
-      R_CURLY@13..14 "}"
+      STMT_LIST@11..14
+        L_CURLY@11..12 "{"
+        WHITESPACE@12..13 "\n"
+        R_CURLY@13..14 "}"
   WHITESPACE@14..15 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0041_raw_keywords.rast b/crates/syntax/test_data/parser/ok/0041_raw_keywords.rast
index 4035aef6f23..a8971b466e6 100644
--- a/crates/syntax/test_data/parser/ok/0041_raw_keywords.rast
+++ b/crates/syntax/test_data/parser/ok/0041_raw_keywords.rast
@@ -9,41 +9,42 @@ SOURCE_FILE@0..59
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..59
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..11 " "
-      LET_STMT@11..29
-        LET_KW@11..14 "let"
-        WHITESPACE@14..15 " "
-        IDENT_PAT@15..23
-          NAME@15..23
-            IDENT@15..23 "r#struct"
-        WHITESPACE@23..24 " "
-        EQ@24..25 "="
-        WHITESPACE@25..26 " "
-        LITERAL@26..28
-          INT_NUMBER@26..28 "92"
-        SEMICOLON@28..29 ";"
-      WHITESPACE@29..30 " "
-      LET_STMT@30..57
-        LET_KW@30..33 "let"
-        WHITESPACE@33..34 " "
-        IDENT_PAT@34..41
-          NAME@34..41
-            IDENT@34..41 "r#trait"
-        WHITESPACE@41..42 " "
-        EQ@42..43 "="
-        WHITESPACE@43..44 " "
-        BIN_EXPR@44..56
-          PATH_EXPR@44..52
-            PATH@44..52
-              PATH_SEGMENT@44..52
-                NAME_REF@44..52
-                  IDENT@44..52 "r#struct"
-          WHITESPACE@52..53 " "
-          STAR@53..54 "*"
-          WHITESPACE@54..55 " "
-          LITERAL@55..56
-            INT_NUMBER@55..56 "2"
-        SEMICOLON@56..57 ";"
-      WHITESPACE@57..58 " "
-      R_CURLY@58..59 "}"
+      STMT_LIST@9..59
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..11 " "
+        LET_STMT@11..29
+          LET_KW@11..14 "let"
+          WHITESPACE@14..15 " "
+          IDENT_PAT@15..23
+            NAME@15..23
+              IDENT@15..23 "r#struct"
+          WHITESPACE@23..24 " "
+          EQ@24..25 "="
+          WHITESPACE@25..26 " "
+          LITERAL@26..28
+            INT_NUMBER@26..28 "92"
+          SEMICOLON@28..29 ";"
+        WHITESPACE@29..30 " "
+        LET_STMT@30..57
+          LET_KW@30..33 "let"
+          WHITESPACE@33..34 " "
+          IDENT_PAT@34..41
+            NAME@34..41
+              IDENT@34..41 "r#trait"
+          WHITESPACE@41..42 " "
+          EQ@42..43 "="
+          WHITESPACE@43..44 " "
+          BIN_EXPR@44..56
+            PATH_EXPR@44..52
+              PATH@44..52
+                PATH_SEGMENT@44..52
+                  NAME_REF@44..52
+                    IDENT@44..52 "r#struct"
+            WHITESPACE@52..53 " "
+            STAR@53..54 "*"
+            WHITESPACE@54..55 " "
+            LITERAL@55..56
+              INT_NUMBER@55..56 "2"
+          SEMICOLON@56..57 ";"
+        WHITESPACE@57..58 " "
+        R_CURLY@58..59 "}"
diff --git a/crates/syntax/test_data/parser/ok/0042_ufcs_call_list.rast b/crates/syntax/test_data/parser/ok/0042_ufcs_call_list.rast
index e71e069f1f4..aa7a4dc7456 100644
--- a/crates/syntax/test_data/parser/ok/0042_ufcs_call_list.rast
+++ b/crates/syntax/test_data/parser/ok/0042_ufcs_call_list.rast
@@ -39,19 +39,20 @@ SOURCE_FILE@0..199
                   IDENT@102..106 "bool"
         WHITESPACE@106..107 " "
         BLOCK_EXPR@107..139
-          L_CURLY@107..108 "{"
-          WHITESPACE@108..117 "\n        "
-          MACRO_CALL@117..133
-            PATH@117..130
-              PATH_SEGMENT@117..130
-                NAME_REF@117..130
-                  IDENT@117..130 "unimplemented"
-            BANG@130..131 "!"
-            TOKEN_TREE@131..133
-              L_PAREN@131..132 "("
-              R_PAREN@132..133 ")"
-          WHITESPACE@133..138 "\n    "
-          R_CURLY@138..139 "}"
+          STMT_LIST@107..139
+            L_CURLY@107..108 "{"
+            WHITESPACE@108..117 "\n        "
+            MACRO_CALL@117..133
+              PATH@117..130
+                PATH_SEGMENT@117..130
+                  NAME_REF@117..130
+                    IDENT@117..130 "unimplemented"
+              BANG@130..131 "!"
+              TOKEN_TREE@131..133
+                L_PAREN@131..132 "("
+                R_PAREN@132..133 ")"
+            WHITESPACE@133..138 "\n    "
+            R_CURLY@138..139 "}"
       WHITESPACE@139..140 "\n"
       R_CURLY@140..141 "}"
   WHITESPACE@141..143 "\n\n"
@@ -75,8 +76,9 @@ SOURCE_FILE@0..199
       R_PAREN@157..158 ")"
     WHITESPACE@158..159 " "
     BLOCK_EXPR@159..161
-      L_CURLY@159..160 "{"
-      R_CURLY@160..161 "}"
+      STMT_LIST@159..161
+        L_CURLY@159..160 "{"
+        R_CURLY@160..161 "}"
   WHITESPACE@161..163 "\n\n"
   FN@163..198
     FN_KW@163..165 "fn"
@@ -88,36 +90,37 @@ SOURCE_FILE@0..199
       R_PAREN@171..172 ")"
     WHITESPACE@172..173 " "
     BLOCK_EXPR@173..198
-      L_CURLY@173..174 "{"
-      WHITESPACE@174..179 "\n    "
-      CALL_EXPR@179..196
-        PATH_EXPR@179..182
-          PATH@179..182
-            PATH_SEGMENT@179..182
-              NAME_REF@179..182
-                IDENT@179..182 "baz"
-        ARG_LIST@182..196
-          L_PAREN@182..183 "("
-          CALL_EXPR@183..195
-            PATH_EXPR@183..193
-              PATH@183..193
-                PATH@183..188
-                  PATH_SEGMENT@183..188
-                    L_ANGLE@183..184 "<"
-                    PATH_TYPE@184..187
-                      PATH@184..187
-                        PATH_SEGMENT@184..187
-                          NAME_REF@184..187
-                            IDENT@184..187 "Foo"
-                    R_ANGLE@187..188 ">"
-                COLON2@188..190 "::"
-                PATH_SEGMENT@190..193
-                  NAME_REF@190..193
-                    IDENT@190..193 "bar"
-            ARG_LIST@193..195
-              L_PAREN@193..194 "("
-              R_PAREN@194..195 ")"
-          R_PAREN@195..196 ")"
-      WHITESPACE@196..197 "\n"
-      R_CURLY@197..198 "}"
+      STMT_LIST@173..198
+        L_CURLY@173..174 "{"
+        WHITESPACE@174..179 "\n    "
+        CALL_EXPR@179..196
+          PATH_EXPR@179..182
+            PATH@179..182
+              PATH_SEGMENT@179..182
+                NAME_REF@179..182
+                  IDENT@179..182 "baz"
+          ARG_LIST@182..196
+            L_PAREN@182..183 "("
+            CALL_EXPR@183..195
+              PATH_EXPR@183..193
+                PATH@183..193
+                  PATH@183..188
+                    PATH_SEGMENT@183..188
+                      L_ANGLE@183..184 "<"
+                      PATH_TYPE@184..187
+                        PATH@184..187
+                          PATH_SEGMENT@184..187
+                            NAME_REF@184..187
+                              IDENT@184..187 "Foo"
+                      R_ANGLE@187..188 ">"
+                  COLON2@188..190 "::"
+                  PATH_SEGMENT@190..193
+                    NAME_REF@190..193
+                      IDENT@190..193 "bar"
+              ARG_LIST@193..195
+                L_PAREN@193..194 "("
+                R_PAREN@194..195 ")"
+            R_PAREN@195..196 ")"
+        WHITESPACE@196..197 "\n"
+        R_CURLY@197..198 "}"
   WHITESPACE@198..199 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0043_complex_assignment.rast b/crates/syntax/test_data/parser/ok/0043_complex_assignment.rast
index adc4a22e969..12d776c7bf9 100644
--- a/crates/syntax/test_data/parser/ok/0043_complex_assignment.rast
+++ b/crates/syntax/test_data/parser/ok/0043_complex_assignment.rast
@@ -40,70 +40,71 @@ SOURCE_FILE@0..160
       R_PAREN@99..100 ")"
     WHITESPACE@100..101 " "
     BLOCK_EXPR@101..159
-      L_CURLY@101..102 "{"
-      WHITESPACE@102..107 "\n    "
-      EXPR_STMT@107..136
-        BIN_EXPR@107..135
-          INDEX_EXPR@107..131
-            FIELD_EXPR@107..128
-              RECORD_EXPR@107..124
-                PATH@107..111
-                  PATH_SEGMENT@107..111
-                    NAME_REF@107..111
-                      IDENT@107..111 "Repr"
-                WHITESPACE@111..112 " "
-                RECORD_EXPR_FIELD_LIST@112..124
-                  L_CURLY@112..113 "{"
-                  WHITESPACE@113..114 " "
-                  RECORD_EXPR_FIELD@114..122
-                    NAME_REF@114..117
-                      IDENT@114..117 "raw"
-                    COLON@117..118 ":"
-                    WHITESPACE@118..119 " "
-                    ARRAY_EXPR@119..122
-                      L_BRACK@119..120 "["
-                      LITERAL@120..121
-                        INT_NUMBER@120..121 "0"
-                      R_BRACK@121..122 "]"
-                  WHITESPACE@122..123 " "
-                  R_CURLY@123..124 "}"
-              DOT@124..125 "."
-              NAME_REF@125..128
-                IDENT@125..128 "raw"
-            L_BRACK@128..129 "["
-            LITERAL@129..130
-              INT_NUMBER@129..130 "0"
-            R_BRACK@130..131 "]"
-          WHITESPACE@131..132 " "
-          EQ@132..133 "="
-          WHITESPACE@133..134 " "
-          LITERAL@134..135
-            INT_NUMBER@134..135 "0"
-        SEMICOLON@135..136 ";"
-      WHITESPACE@136..141 "\n    "
-      EXPR_STMT@141..157
-        CALL_EXPR@141..156
-          RECORD_EXPR@141..154
-            PATH@141..145
-              PATH_SEGMENT@141..145
-                NAME_REF@141..145
-                  IDENT@141..145 "Repr"
-            RECORD_EXPR_FIELD_LIST@145..154
-              L_CURLY@145..146 "{"
-              RECORD_EXPR_FIELD@146..153
-                NAME_REF@146..149
-                  IDENT@146..149 "raw"
-                COLON@149..150 ":"
-                ARRAY_EXPR@150..153
-                  L_BRACK@150..151 "["
-                  LITERAL@151..152
-                    INT_NUMBER@151..152 "0"
-                  R_BRACK@152..153 "]"
-              R_CURLY@153..154 "}"
-          ARG_LIST@154..156
-            L_PAREN@154..155 "("
-            R_PAREN@155..156 ")"
-        SEMICOLON@156..157 ";"
-      WHITESPACE@157..158 "\n"
-      R_CURLY@158..159 "}"
+      STMT_LIST@101..159
+        L_CURLY@101..102 "{"
+        WHITESPACE@102..107 "\n    "
+        EXPR_STMT@107..136
+          BIN_EXPR@107..135
+            INDEX_EXPR@107..131
+              FIELD_EXPR@107..128
+                RECORD_EXPR@107..124
+                  PATH@107..111
+                    PATH_SEGMENT@107..111
+                      NAME_REF@107..111
+                        IDENT@107..111 "Repr"
+                  WHITESPACE@111..112 " "
+                  RECORD_EXPR_FIELD_LIST@112..124
+                    L_CURLY@112..113 "{"
+                    WHITESPACE@113..114 " "
+                    RECORD_EXPR_FIELD@114..122
+                      NAME_REF@114..117
+                        IDENT@114..117 "raw"
+                      COLON@117..118 ":"
+                      WHITESPACE@118..119 " "
+                      ARRAY_EXPR@119..122
+                        L_BRACK@119..120 "["
+                        LITERAL@120..121
+                          INT_NUMBER@120..121 "0"
+                        R_BRACK@121..122 "]"
+                    WHITESPACE@122..123 " "
+                    R_CURLY@123..124 "}"
+                DOT@124..125 "."
+                NAME_REF@125..128
+                  IDENT@125..128 "raw"
+              L_BRACK@128..129 "["
+              LITERAL@129..130
+                INT_NUMBER@129..130 "0"
+              R_BRACK@130..131 "]"
+            WHITESPACE@131..132 " "
+            EQ@132..133 "="
+            WHITESPACE@133..134 " "
+            LITERAL@134..135
+              INT_NUMBER@134..135 "0"
+          SEMICOLON@135..136 ";"
+        WHITESPACE@136..141 "\n    "
+        EXPR_STMT@141..157
+          CALL_EXPR@141..156
+            RECORD_EXPR@141..154
+              PATH@141..145
+                PATH_SEGMENT@141..145
+                  NAME_REF@141..145
+                    IDENT@141..145 "Repr"
+              RECORD_EXPR_FIELD_LIST@145..154
+                L_CURLY@145..146 "{"
+                RECORD_EXPR_FIELD@146..153
+                  NAME_REF@146..149
+                    IDENT@146..149 "raw"
+                  COLON@149..150 ":"
+                  ARRAY_EXPR@150..153
+                    L_BRACK@150..151 "["
+                    LITERAL@151..152
+                      INT_NUMBER@151..152 "0"
+                    R_BRACK@152..153 "]"
+                R_CURLY@153..154 "}"
+            ARG_LIST@154..156
+              L_PAREN@154..155 "("
+              R_PAREN@155..156 ")"
+          SEMICOLON@156..157 ";"
+        WHITESPACE@157..158 "\n"
+        R_CURLY@158..159 "}"
   WHITESPACE@159..160 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0044_let_attrs.rast b/crates/syntax/test_data/parser/ok/0044_let_attrs.rast
index d0e7a1dbe67..80c1d6b87af 100644
--- a/crates/syntax/test_data/parser/ok/0044_let_attrs.rast
+++ b/crates/syntax/test_data/parser/ok/0044_let_attrs.rast
@@ -11,66 +11,67 @@ SOURCE_FILE@0..166
       R_PAREN@69..70 ")"
     WHITESPACE@70..71 " "
     BLOCK_EXPR@71..165
-      L_CURLY@71..72 "{"
-      WHITESPACE@72..77 "\n    "
-      LET_STMT@77..163
-        ATTR@77..106
-          POUND@77..78 "#"
-          L_BRACK@78..79 "["
-          META@79..105
-            PATH@79..82
-              PATH_SEGMENT@79..82
-                NAME_REF@79..82
-                  IDENT@79..82 "cfg"
-            TOKEN_TREE@82..105
-              L_PAREN@82..83 "("
-              IDENT@83..90 "feature"
-              WHITESPACE@90..91 " "
-              EQ@91..92 "="
-              WHITESPACE@92..93 " "
-              STRING@93..104 "\"backtrace\""
-              R_PAREN@104..105 ")"
-          R_BRACK@105..106 "]"
-        WHITESPACE@106..111 "\n    "
-        LET_KW@111..114 "let"
-        WHITESPACE@114..115 " "
-        IDENT_PAT@115..124
-          NAME@115..124
-            IDENT@115..124 "exit_code"
-        WHITESPACE@124..125 " "
-        EQ@125..126 "="
-        WHITESPACE@126..127 " "
-        CALL_EXPR@127..162
-          PATH_EXPR@127..146
-            PATH@127..146
-              PATH@127..132
-                PATH_SEGMENT@127..132
-                  NAME_REF@127..132
-                    IDENT@127..132 "panic"
-              COLON2@132..134 "::"
-              PATH_SEGMENT@134..146
-                NAME_REF@134..146
-                  IDENT@134..146 "catch_unwind"
-          ARG_LIST@146..162
-            L_PAREN@146..147 "("
-            CLOSURE_EXPR@147..161
-              MOVE_KW@147..151 "move"
-              WHITESPACE@151..152 " "
-              PARAM_LIST@152..154
-                PIPE@152..153 "|"
-                PIPE@153..154 "|"
-              WHITESPACE@154..155 " "
-              CALL_EXPR@155..161
-                PATH_EXPR@155..159
-                  PATH@155..159
-                    PATH_SEGMENT@155..159
-                      NAME_REF@155..159
-                        IDENT@155..159 "main"
-                ARG_LIST@159..161
-                  L_PAREN@159..160 "("
-                  R_PAREN@160..161 ")"
-            R_PAREN@161..162 ")"
-        SEMICOLON@162..163 ";"
-      WHITESPACE@163..164 "\n"
-      R_CURLY@164..165 "}"
+      STMT_LIST@71..165
+        L_CURLY@71..72 "{"
+        WHITESPACE@72..77 "\n    "
+        LET_STMT@77..163
+          ATTR@77..106
+            POUND@77..78 "#"
+            L_BRACK@78..79 "["
+            META@79..105
+              PATH@79..82
+                PATH_SEGMENT@79..82
+                  NAME_REF@79..82
+                    IDENT@79..82 "cfg"
+              TOKEN_TREE@82..105
+                L_PAREN@82..83 "("
+                IDENT@83..90 "feature"
+                WHITESPACE@90..91 " "
+                EQ@91..92 "="
+                WHITESPACE@92..93 " "
+                STRING@93..104 "\"backtrace\""
+                R_PAREN@104..105 ")"
+            R_BRACK@105..106 "]"
+          WHITESPACE@106..111 "\n    "
+          LET_KW@111..114 "let"
+          WHITESPACE@114..115 " "
+          IDENT_PAT@115..124
+            NAME@115..124
+              IDENT@115..124 "exit_code"
+          WHITESPACE@124..125 " "
+          EQ@125..126 "="
+          WHITESPACE@126..127 " "
+          CALL_EXPR@127..162
+            PATH_EXPR@127..146
+              PATH@127..146
+                PATH@127..132
+                  PATH_SEGMENT@127..132
+                    NAME_REF@127..132
+                      IDENT@127..132 "panic"
+                COLON2@132..134 "::"
+                PATH_SEGMENT@134..146
+                  NAME_REF@134..146
+                    IDENT@134..146 "catch_unwind"
+            ARG_LIST@146..162
+              L_PAREN@146..147 "("
+              CLOSURE_EXPR@147..161
+                MOVE_KW@147..151 "move"
+                WHITESPACE@151..152 " "
+                PARAM_LIST@152..154
+                  PIPE@152..153 "|"
+                  PIPE@153..154 "|"
+                WHITESPACE@154..155 " "
+                CALL_EXPR@155..161
+                  PATH_EXPR@155..159
+                    PATH@155..159
+                      PATH_SEGMENT@155..159
+                        NAME_REF@155..159
+                          IDENT@155..159 "main"
+                  ARG_LIST@159..161
+                    L_PAREN@159..160 "("
+                    R_PAREN@160..161 ")"
+              R_PAREN@161..162 ")"
+          SEMICOLON@162..163 ";"
+        WHITESPACE@163..164 "\n"
+        R_CURLY@164..165 "}"
   WHITESPACE@165..166 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0045_block_attrs.rast b/crates/syntax/test_data/parser/ok/0045_block_attrs.rast
index 7fbd635d003..a45f88def1e 100644
--- a/crates/syntax/test_data/parser/ok/0045_block_attrs.rast
+++ b/crates/syntax/test_data/parser/ok/0045_block_attrs.rast
@@ -9,87 +9,90 @@ SOURCE_FILE@0..764
       R_PAREN@9..10 ")"
     WHITESPACE@10..11 " "
     BLOCK_EXPR@11..461
-      L_CURLY@11..12 "{"
-      WHITESPACE@12..17 "\n    "
-      ATTR@17..57
-        POUND@17..18 "#"
-        BANG@18..19 "!"
-        L_BRACK@19..20 "["
-        META@20..56
-          PATH@20..23
-            PATH_SEGMENT@20..23
-              NAME_REF@20..23
-                IDENT@20..23 "doc"
-          TOKEN_TREE@23..56
-            L_PAREN@23..24 "("
-            STRING@24..55 "\"Inner attributes all ..."
-            R_PAREN@55..56 ")"
-        R_BRACK@56..57 "]"
-      WHITESPACE@57..62 "\n    "
-      COMMENT@62..97 "//! As are ModuleDoc  ..."
-      WHITESPACE@97..102 "\n    "
-      EXPR_STMT@102..295
-        BLOCK_EXPR@102..294
-          L_CURLY@102..103 "{"
-          WHITESPACE@103..112 "\n        "
-          ATTR@112..180
-            POUND@112..113 "#"
-            BANG@113..114 "!"
-            L_BRACK@114..115 "["
-            META@115..179
-              PATH@115..118
-                PATH_SEGMENT@115..118
-                  NAME_REF@115..118
-                    IDENT@115..118 "doc"
-              TOKEN_TREE@118..179
-                L_PAREN@118..119 "("
-                STRING@119..178 "\"Inner attributes are ..."
-                R_PAREN@178..179 ")"
-            R_BRACK@179..180 "]"
-          WHITESPACE@180..189 "\n        "
-          ATTR@189..244
-            POUND@189..190 "#"
-            BANG@190..191 "!"
-            L_BRACK@191..192 "["
-            META@192..243
-              PATH@192..195
-                PATH_SEGMENT@192..195
-                  NAME_REF@192..195
-                    IDENT@192..195 "doc"
-              TOKEN_TREE@195..243
-                L_PAREN@195..196 "("
-                STRING@196..242 "\"Being validated is n ..."
-                R_PAREN@242..243 ")"
-            R_BRACK@243..244 "]"
-          WHITESPACE@244..253 "\n        "
-          COMMENT@253..288 "//! As are ModuleDoc  ..."
-          WHITESPACE@288..293 "\n    "
-          R_CURLY@293..294 "}"
-        SEMICOLON@294..295 ";"
-      WHITESPACE@295..300 "\n    "
-      BLOCK_EXPR@300..459
-        L_CURLY@300..301 "{"
-        WHITESPACE@301..310 "\n        "
-        ATTR@310..409
-          POUND@310..311 "#"
-          BANG@311..312 "!"
-          L_BRACK@312..313 "["
-          META@313..408
-            PATH@313..316
-              PATH_SEGMENT@313..316
-                NAME_REF@313..316
-                  IDENT@313..316 "doc"
-            TOKEN_TREE@316..408
-              L_PAREN@316..317 "("
-              STRING@317..407 "\"Inner attributes are ..."
-              R_PAREN@407..408 ")"
-          R_BRACK@408..409 "]"
-        WHITESPACE@409..418 "\n        "
-        COMMENT@418..453 "//! As are ModuleDoc  ..."
-        WHITESPACE@453..458 "\n    "
-        R_CURLY@458..459 "}"
-      WHITESPACE@459..460 "\n"
-      R_CURLY@460..461 "}"
+      STMT_LIST@11..461
+        L_CURLY@11..12 "{"
+        WHITESPACE@12..17 "\n    "
+        ATTR@17..57
+          POUND@17..18 "#"
+          BANG@18..19 "!"
+          L_BRACK@19..20 "["
+          META@20..56
+            PATH@20..23
+              PATH_SEGMENT@20..23
+                NAME_REF@20..23
+                  IDENT@20..23 "doc"
+            TOKEN_TREE@23..56
+              L_PAREN@23..24 "("
+              STRING@24..55 "\"Inner attributes all ..."
+              R_PAREN@55..56 ")"
+          R_BRACK@56..57 "]"
+        WHITESPACE@57..62 "\n    "
+        COMMENT@62..97 "//! As are ModuleDoc  ..."
+        WHITESPACE@97..102 "\n    "
+        EXPR_STMT@102..295
+          BLOCK_EXPR@102..294
+            STMT_LIST@102..294
+              L_CURLY@102..103 "{"
+              WHITESPACE@103..112 "\n        "
+              ATTR@112..180
+                POUND@112..113 "#"
+                BANG@113..114 "!"
+                L_BRACK@114..115 "["
+                META@115..179
+                  PATH@115..118
+                    PATH_SEGMENT@115..118
+                      NAME_REF@115..118
+                        IDENT@115..118 "doc"
+                  TOKEN_TREE@118..179
+                    L_PAREN@118..119 "("
+                    STRING@119..178 "\"Inner attributes are ..."
+                    R_PAREN@178..179 ")"
+                R_BRACK@179..180 "]"
+              WHITESPACE@180..189 "\n        "
+              ATTR@189..244
+                POUND@189..190 "#"
+                BANG@190..191 "!"
+                L_BRACK@191..192 "["
+                META@192..243
+                  PATH@192..195
+                    PATH_SEGMENT@192..195
+                      NAME_REF@192..195
+                        IDENT@192..195 "doc"
+                  TOKEN_TREE@195..243
+                    L_PAREN@195..196 "("
+                    STRING@196..242 "\"Being validated is n ..."
+                    R_PAREN@242..243 ")"
+                R_BRACK@243..244 "]"
+              WHITESPACE@244..253 "\n        "
+              COMMENT@253..288 "//! As are ModuleDoc  ..."
+              WHITESPACE@288..293 "\n    "
+              R_CURLY@293..294 "}"
+          SEMICOLON@294..295 ";"
+        WHITESPACE@295..300 "\n    "
+        BLOCK_EXPR@300..459
+          STMT_LIST@300..459
+            L_CURLY@300..301 "{"
+            WHITESPACE@301..310 "\n        "
+            ATTR@310..409
+              POUND@310..311 "#"
+              BANG@311..312 "!"
+              L_BRACK@312..313 "["
+              META@313..408
+                PATH@313..316
+                  PATH_SEGMENT@313..316
+                    NAME_REF@313..316
+                      IDENT@313..316 "doc"
+                TOKEN_TREE@316..408
+                  L_PAREN@316..317 "("
+                  STRING@317..407 "\"Inner attributes are ..."
+                  R_PAREN@407..408 ")"
+              R_BRACK@408..409 "]"
+            WHITESPACE@409..418 "\n        "
+            COMMENT@418..453 "//! As are ModuleDoc  ..."
+            WHITESPACE@453..458 "\n    "
+            R_CURLY@458..459 "}"
+        WHITESPACE@459..460 "\n"
+        R_CURLY@460..461 "}"
   WHITESPACE@461..463 "\n\n"
   FN@463..539
     FN_KW@463..465 "fn"
@@ -101,36 +104,38 @@ SOURCE_FILE@0..764
       R_PAREN@472..473 ")"
     WHITESPACE@473..474 " "
     BLOCK_EXPR@474..539
-      L_CURLY@474..475 "{"
-      WHITESPACE@475..480 "\n    "
-      LET_STMT@480..537
-        LET_KW@480..483 "let"
-        WHITESPACE@483..484 " "
-        WILDCARD_PAT@484..485
-          UNDERSCORE@484..485 "_"
-        WHITESPACE@485..486 " "
-        EQ@486..487 "="
-        WHITESPACE@487..488 " "
-        BLOCK_EXPR@488..536
-          ATTR@488..533
-            POUND@488..489 "#"
-            L_BRACK@489..490 "["
-            META@490..532
-              PATH@490..493
-                PATH_SEGMENT@490..493
-                  NAME_REF@490..493
-                    IDENT@490..493 "doc"
-              TOKEN_TREE@493..532
-                L_PAREN@493..494 "("
-                STRING@494..531 "\"Outer attributes are ..."
-                R_PAREN@531..532 ")"
-            R_BRACK@532..533 "]"
-          WHITESPACE@533..534 " "
-          L_CURLY@534..535 "{"
-          R_CURLY@535..536 "}"
-        SEMICOLON@536..537 ";"
-      WHITESPACE@537..538 "\n"
-      R_CURLY@538..539 "}"
+      STMT_LIST@474..539
+        L_CURLY@474..475 "{"
+        WHITESPACE@475..480 "\n    "
+        LET_STMT@480..537
+          LET_KW@480..483 "let"
+          WHITESPACE@483..484 " "
+          WILDCARD_PAT@484..485
+            UNDERSCORE@484..485 "_"
+          WHITESPACE@485..486 " "
+          EQ@486..487 "="
+          WHITESPACE@487..488 " "
+          BLOCK_EXPR@488..536
+            ATTR@488..533
+              POUND@488..489 "#"
+              L_BRACK@489..490 "["
+              META@490..532
+                PATH@490..493
+                  PATH_SEGMENT@490..493
+                    NAME_REF@490..493
+                      IDENT@490..493 "doc"
+                TOKEN_TREE@493..532
+                  L_PAREN@493..494 "("
+                  STRING@494..531 "\"Outer attributes are ..."
+                  R_PAREN@531..532 ")"
+              R_BRACK@532..533 "]"
+            WHITESPACE@533..534 " "
+            STMT_LIST@534..536
+              L_CURLY@534..535 "{"
+              R_CURLY@535..536 "}"
+          SEMICOLON@536..537 ";"
+        WHITESPACE@537..538 "\n"
+        R_CURLY@538..539 "}"
   WHITESPACE@539..541 "\n\n"
   IMPL@541..763
     COMMENT@541..601 "// https://github.com ..."
@@ -199,26 +204,27 @@ SOURCE_FILE@0..764
           R_PAREN@678..679 ")"
         WHITESPACE@679..680 " "
         BLOCK_EXPR@680..761
-          L_CURLY@680..681 "{"
-          WHITESPACE@681..690 "\n        "
-          ATTR@690..717
-            POUND@690..691 "#"
-            BANG@691..692 "!"
-            L_BRACK@692..693 "["
-            META@693..716
-              PATH@693..698
-                PATH_SEGMENT@693..698
-                  NAME_REF@693..698
-                    IDENT@693..698 "allow"
-              TOKEN_TREE@698..716
-                L_PAREN@698..699 "("
-                IDENT@699..715 "unused_variables"
-                R_PAREN@715..716 ")"
-            R_BRACK@716..717 "]"
-          WHITESPACE@717..718 " "
-          COMMENT@718..755 "// this is  `inner_at ..."
-          WHITESPACE@755..760 "\n    "
-          R_CURLY@760..761 "}"
+          STMT_LIST@680..761
+            L_CURLY@680..681 "{"
+            WHITESPACE@681..690 "\n        "
+            ATTR@690..717
+              POUND@690..691 "#"
+              BANG@691..692 "!"
+              L_BRACK@692..693 "["
+              META@693..716
+                PATH@693..698
+                  PATH_SEGMENT@693..698
+                    NAME_REF@693..698
+                      IDENT@693..698 "allow"
+                TOKEN_TREE@698..716
+                  L_PAREN@698..699 "("
+                  IDENT@699..715 "unused_variables"
+                  R_PAREN@715..716 ")"
+              R_BRACK@716..717 "]"
+            WHITESPACE@717..718 " "
+            COMMENT@718..755 "// this is  `inner_at ..."
+            WHITESPACE@755..760 "\n    "
+            R_CURLY@760..761 "}"
       WHITESPACE@761..762 "\n"
       R_CURLY@762..763 "}"
   WHITESPACE@763..764 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0047_minus_in_inner_pattern.rast b/crates/syntax/test_data/parser/ok/0047_minus_in_inner_pattern.rast
index 731a2315aa4..9b6101edb17 100644
--- a/crates/syntax/test_data/parser/ok/0047_minus_in_inner_pattern.rast
+++ b/crates/syntax/test_data/parser/ok/0047_minus_in_inner_pattern.rast
@@ -11,250 +11,252 @@ SOURCE_FILE@0..395
       R_PAREN@70..71 ")"
     WHITESPACE@71..72 " "
     BLOCK_EXPR@72..341
-      L_CURLY@72..73 "{"
-      WHITESPACE@73..78 "\n    "
-      EXPR_STMT@78..141
-        MATCH_EXPR@78..141
-          MATCH_KW@78..83 "match"
-          WHITESPACE@83..84 " "
-          CALL_EXPR@84..92
-            PATH_EXPR@84..88
-              PATH@84..88
-                PATH_SEGMENT@84..88
-                  NAME_REF@84..88
-                    IDENT@84..88 "Some"
-            ARG_LIST@88..92
-              L_PAREN@88..89 "("
-              PREFIX_EXPR@89..91
-                MINUS@89..90 "-"
-                LITERAL@90..91
-                  INT_NUMBER@90..91 "1"
-              R_PAREN@91..92 ")"
-          WHITESPACE@92..93 " "
-          MATCH_ARM_LIST@93..141
-            L_CURLY@93..94 "{"
-            WHITESPACE@94..103 "\n        "
-            MATCH_ARM@103..118
-              TUPLE_STRUCT_PAT@103..111
-                PATH@103..107
-                  PATH_SEGMENT@103..107
-                    NAME_REF@103..107
-                      IDENT@103..107 "Some"
-                L_PAREN@107..108 "("
-                LITERAL_PAT@108..110
-                  MINUS@108..109 "-"
-                  LITERAL@109..110
-                    INT_NUMBER@109..110 "1"
-                R_PAREN@110..111 ")"
-              WHITESPACE@111..112 " "
-              FAT_ARROW@112..114 "=>"
-              WHITESPACE@114..115 " "
-              TUPLE_EXPR@115..117
-                L_PAREN@115..116 "("
-                R_PAREN@116..117 ")"
-              COMMA@117..118 ","
-            WHITESPACE@118..127 "\n        "
-            MATCH_ARM@127..135
-              WILDCARD_PAT@127..128
-                UNDERSCORE@127..128 "_"
-              WHITESPACE@128..129 " "
-              FAT_ARROW@129..131 "=>"
-              WHITESPACE@131..132 " "
-              TUPLE_EXPR@132..134
-                L_PAREN@132..133 "("
-                R_PAREN@133..134 ")"
-              COMMA@134..135 ","
-            WHITESPACE@135..140 "\n    "
-            R_CURLY@140..141 "}"
-      WHITESPACE@141..147 "\n\n    "
-      EXPR_STMT@147..222
-        MATCH_EXPR@147..222
-          MATCH_KW@147..152 "match"
-          WHITESPACE@152..153 " "
-          CALL_EXPR@153..167
-            PATH_EXPR@153..157
-              PATH@153..157
-                PATH_SEGMENT@153..157
-                  NAME_REF@153..157
-                    IDENT@153..157 "Some"
-            ARG_LIST@157..167
-              L_PAREN@157..158 "("
-              TUPLE_EXPR@158..166
-                L_PAREN@158..159 "("
-                PREFIX_EXPR@159..161
-                  MINUS@159..160 "-"
-                  LITERAL@160..161
-                    INT_NUMBER@160..161 "1"
-                COMMA@161..162 ","
-                WHITESPACE@162..163 " "
-                PREFIX_EXPR@163..165
-                  MINUS@163..164 "-"
-                  LITERAL@164..165
-                    INT_NUMBER@164..165 "1"
-                R_PAREN@165..166 ")"
-              R_PAREN@166..167 ")"
-          WHITESPACE@167..168 " "
-          MATCH_ARM_LIST@168..222
-            L_CURLY@168..169 "{"
-            WHITESPACE@169..178 "\n        "
-            MATCH_ARM@178..199
-              TUPLE_STRUCT_PAT@178..192
-                PATH@178..182
-                  PATH_SEGMENT@178..182
-                    NAME_REF@178..182
-                      IDENT@178..182 "Some"
-                L_PAREN@182..183 "("
-                TUPLE_PAT@183..191
-                  L_PAREN@183..184 "("
-                  LITERAL_PAT@184..186
-                    MINUS@184..185 "-"
-                    LITERAL@185..186
-                      INT_NUMBER@185..186 "1"
-                  COMMA@186..187 ","
-                  WHITESPACE@187..188 " "
-                  LITERAL_PAT@188..190
-                    MINUS@188..189 "-"
-                    LITERAL@189..190
-                      INT_NUMBER@189..190 "1"
-                  R_PAREN@190..191 ")"
-                R_PAREN@191..192 ")"
-              WHITESPACE@192..193 " "
-              FAT_ARROW@193..195 "=>"
-              WHITESPACE@195..196 " "
-              TUPLE_EXPR@196..198
-                L_PAREN@196..197 "("
-                R_PAREN@197..198 ")"
-              COMMA@198..199 ","
-            WHITESPACE@199..208 "\n        "
-            MATCH_ARM@208..216
-              WILDCARD_PAT@208..209
-                UNDERSCORE@208..209 "_"
-              WHITESPACE@209..210 " "
-              FAT_ARROW@210..212 "=>"
-              WHITESPACE@212..213 " "
-              TUPLE_EXPR@213..215
-                L_PAREN@213..214 "("
-                R_PAREN@214..215 ")"
-              COMMA@215..216 ","
-            WHITESPACE@216..221 "\n    "
-            R_CURLY@221..222 "}"
-      WHITESPACE@222..228 "\n\n    "
-      EXPR_STMT@228..299
-        MATCH_EXPR@228..299
-          MATCH_KW@228..233 "match"
-          WHITESPACE@233..234 " "
-          CALL_EXPR@234..246
-            PATH_EXPR@234..238
-              PATH@234..238
-                PATH@234..235
-                  PATH_SEGMENT@234..235
-                    NAME_REF@234..235
-                      IDENT@234..235 "A"
-                COLON2@235..237 "::"
-                PATH_SEGMENT@237..238
-                  NAME_REF@237..238
-                    IDENT@237..238 "B"
-            ARG_LIST@238..246
-              L_PAREN@238..239 "("
-              PREFIX_EXPR@239..241
-                MINUS@239..240 "-"
-                LITERAL@240..241
-                  INT_NUMBER@240..241 "1"
-              COMMA@241..242 ","
-              WHITESPACE@242..243 " "
-              PREFIX_EXPR@243..245
-                MINUS@243..244 "-"
-                LITERAL@244..245
-                  INT_NUMBER@244..245 "1"
-              R_PAREN@245..246 ")"
-          WHITESPACE@246..247 " "
-          MATCH_ARM_LIST@247..299
-            L_CURLY@247..248 "{"
-            WHITESPACE@248..257 "\n        "
-            MATCH_ARM@257..276
-              TUPLE_STRUCT_PAT@257..269
-                PATH@257..261
-                  PATH@257..258
-                    PATH_SEGMENT@257..258
-                      NAME_REF@257..258
-                        IDENT@257..258 "A"
-                  COLON2@258..260 "::"
-                  PATH_SEGMENT@260..261
-                    NAME_REF@260..261
-                      IDENT@260..261 "B"
-                L_PAREN@261..262 "("
-                LITERAL_PAT@262..264
-                  MINUS@262..263 "-"
-                  LITERAL@263..264
-                    INT_NUMBER@263..264 "1"
-                COMMA@264..265 ","
-                WHITESPACE@265..266 " "
-                LITERAL_PAT@266..268
-                  MINUS@266..267 "-"
-                  LITERAL@267..268
-                    INT_NUMBER@267..268 "1"
-                R_PAREN@268..269 ")"
-              WHITESPACE@269..270 " "
-              FAT_ARROW@270..272 "=>"
-              WHITESPACE@272..273 " "
-              TUPLE_EXPR@273..275
-                L_PAREN@273..274 "("
-                R_PAREN@274..275 ")"
-              COMMA@275..276 ","
-            WHITESPACE@276..285 "\n        "
-            MATCH_ARM@285..293
-              WILDCARD_PAT@285..286
-                UNDERSCORE@285..286 "_"
-              WHITESPACE@286..287 " "
-              FAT_ARROW@287..289 "=>"
-              WHITESPACE@289..290 " "
-              TUPLE_EXPR@290..292
-                L_PAREN@290..291 "("
-                R_PAREN@291..292 ")"
-              COMMA@292..293 ","
-            WHITESPACE@293..298 "\n    "
-            R_CURLY@298..299 "}"
-      WHITESPACE@299..305 "\n\n    "
-      IF_EXPR@305..339
-        IF_KW@305..307 "if"
-        WHITESPACE@307..308 " "
-        CONDITION@308..331
-          LET_KW@308..311 "let"
-          WHITESPACE@311..312 " "
-          TUPLE_STRUCT_PAT@312..320
-            PATH@312..316
-              PATH_SEGMENT@312..316
-                NAME_REF@312..316
-                  IDENT@312..316 "Some"
-            L_PAREN@316..317 "("
-            LITERAL_PAT@317..319
-              MINUS@317..318 "-"
-              LITERAL@318..319
-                INT_NUMBER@318..319 "1"
-            R_PAREN@319..320 ")"
-          WHITESPACE@320..321 " "
-          EQ@321..322 "="
-          WHITESPACE@322..323 " "
-          CALL_EXPR@323..331
-            PATH_EXPR@323..327
-              PATH@323..327
-                PATH_SEGMENT@323..327
-                  NAME_REF@323..327
-                    IDENT@323..327 "Some"
-            ARG_LIST@327..331
-              L_PAREN@327..328 "("
-              PREFIX_EXPR@328..330
-                MINUS@328..329 "-"
-                LITERAL@329..330
-                  INT_NUMBER@329..330 "1"
-              R_PAREN@330..331 ")"
-        WHITESPACE@331..332 " "
-        BLOCK_EXPR@332..339
-          L_CURLY@332..333 "{"
-          WHITESPACE@333..338 "\n    "
-          R_CURLY@338..339 "}"
-      WHITESPACE@339..340 "\n"
-      R_CURLY@340..341 "}"
+      STMT_LIST@72..341
+        L_CURLY@72..73 "{"
+        WHITESPACE@73..78 "\n    "
+        EXPR_STMT@78..141
+          MATCH_EXPR@78..141
+            MATCH_KW@78..83 "match"
+            WHITESPACE@83..84 " "
+            CALL_EXPR@84..92
+              PATH_EXPR@84..88
+                PATH@84..88
+                  PATH_SEGMENT@84..88
+                    NAME_REF@84..88
+                      IDENT@84..88 "Some"
+              ARG_LIST@88..92
+                L_PAREN@88..89 "("
+                PREFIX_EXPR@89..91
+                  MINUS@89..90 "-"
+                  LITERAL@90..91
+                    INT_NUMBER@90..91 "1"
+                R_PAREN@91..92 ")"
+            WHITESPACE@92..93 " "
+            MATCH_ARM_LIST@93..141
+              L_CURLY@93..94 "{"
+              WHITESPACE@94..103 "\n        "
+              MATCH_ARM@103..118
+                TUPLE_STRUCT_PAT@103..111
+                  PATH@103..107
+                    PATH_SEGMENT@103..107
+                      NAME_REF@103..107
+                        IDENT@103..107 "Some"
+                  L_PAREN@107..108 "("
+                  LITERAL_PAT@108..110
+                    MINUS@108..109 "-"
+                    LITERAL@109..110
+                      INT_NUMBER@109..110 "1"
+                  R_PAREN@110..111 ")"
+                WHITESPACE@111..112 " "
+                FAT_ARROW@112..114 "=>"
+                WHITESPACE@114..115 " "
+                TUPLE_EXPR@115..117
+                  L_PAREN@115..116 "("
+                  R_PAREN@116..117 ")"
+                COMMA@117..118 ","
+              WHITESPACE@118..127 "\n        "
+              MATCH_ARM@127..135
+                WILDCARD_PAT@127..128
+                  UNDERSCORE@127..128 "_"
+                WHITESPACE@128..129 " "
+                FAT_ARROW@129..131 "=>"
+                WHITESPACE@131..132 " "
+                TUPLE_EXPR@132..134
+                  L_PAREN@132..133 "("
+                  R_PAREN@133..134 ")"
+                COMMA@134..135 ","
+              WHITESPACE@135..140 "\n    "
+              R_CURLY@140..141 "}"
+        WHITESPACE@141..147 "\n\n    "
+        EXPR_STMT@147..222
+          MATCH_EXPR@147..222
+            MATCH_KW@147..152 "match"
+            WHITESPACE@152..153 " "
+            CALL_EXPR@153..167
+              PATH_EXPR@153..157
+                PATH@153..157
+                  PATH_SEGMENT@153..157
+                    NAME_REF@153..157
+                      IDENT@153..157 "Some"
+              ARG_LIST@157..167
+                L_PAREN@157..158 "("
+                TUPLE_EXPR@158..166
+                  L_PAREN@158..159 "("
+                  PREFIX_EXPR@159..161
+                    MINUS@159..160 "-"
+                    LITERAL@160..161
+                      INT_NUMBER@160..161 "1"
+                  COMMA@161..162 ","
+                  WHITESPACE@162..163 " "
+                  PREFIX_EXPR@163..165
+                    MINUS@163..164 "-"
+                    LITERAL@164..165
+                      INT_NUMBER@164..165 "1"
+                  R_PAREN@165..166 ")"
+                R_PAREN@166..167 ")"
+            WHITESPACE@167..168 " "
+            MATCH_ARM_LIST@168..222
+              L_CURLY@168..169 "{"
+              WHITESPACE@169..178 "\n        "
+              MATCH_ARM@178..199
+                TUPLE_STRUCT_PAT@178..192
+                  PATH@178..182
+                    PATH_SEGMENT@178..182
+                      NAME_REF@178..182
+                        IDENT@178..182 "Some"
+                  L_PAREN@182..183 "("
+                  TUPLE_PAT@183..191
+                    L_PAREN@183..184 "("
+                    LITERAL_PAT@184..186
+                      MINUS@184..185 "-"
+                      LITERAL@185..186
+                        INT_NUMBER@185..186 "1"
+                    COMMA@186..187 ","
+                    WHITESPACE@187..188 " "
+                    LITERAL_PAT@188..190
+                      MINUS@188..189 "-"
+                      LITERAL@189..190
+                        INT_NUMBER@189..190 "1"
+                    R_PAREN@190..191 ")"
+                  R_PAREN@191..192 ")"
+                WHITESPACE@192..193 " "
+                FAT_ARROW@193..195 "=>"
+                WHITESPACE@195..196 " "
+                TUPLE_EXPR@196..198
+                  L_PAREN@196..197 "("
+                  R_PAREN@197..198 ")"
+                COMMA@198..199 ","
+              WHITESPACE@199..208 "\n        "
+              MATCH_ARM@208..216
+                WILDCARD_PAT@208..209
+                  UNDERSCORE@208..209 "_"
+                WHITESPACE@209..210 " "
+                FAT_ARROW@210..212 "=>"
+                WHITESPACE@212..213 " "
+                TUPLE_EXPR@213..215
+                  L_PAREN@213..214 "("
+                  R_PAREN@214..215 ")"
+                COMMA@215..216 ","
+              WHITESPACE@216..221 "\n    "
+              R_CURLY@221..222 "}"
+        WHITESPACE@222..228 "\n\n    "
+        EXPR_STMT@228..299
+          MATCH_EXPR@228..299
+            MATCH_KW@228..233 "match"
+            WHITESPACE@233..234 " "
+            CALL_EXPR@234..246
+              PATH_EXPR@234..238
+                PATH@234..238
+                  PATH@234..235
+                    PATH_SEGMENT@234..235
+                      NAME_REF@234..235
+                        IDENT@234..235 "A"
+                  COLON2@235..237 "::"
+                  PATH_SEGMENT@237..238
+                    NAME_REF@237..238
+                      IDENT@237..238 "B"
+              ARG_LIST@238..246
+                L_PAREN@238..239 "("
+                PREFIX_EXPR@239..241
+                  MINUS@239..240 "-"
+                  LITERAL@240..241
+                    INT_NUMBER@240..241 "1"
+                COMMA@241..242 ","
+                WHITESPACE@242..243 " "
+                PREFIX_EXPR@243..245
+                  MINUS@243..244 "-"
+                  LITERAL@244..245
+                    INT_NUMBER@244..245 "1"
+                R_PAREN@245..246 ")"
+            WHITESPACE@246..247 " "
+            MATCH_ARM_LIST@247..299
+              L_CURLY@247..248 "{"
+              WHITESPACE@248..257 "\n        "
+              MATCH_ARM@257..276
+                TUPLE_STRUCT_PAT@257..269
+                  PATH@257..261
+                    PATH@257..258
+                      PATH_SEGMENT@257..258
+                        NAME_REF@257..258
+                          IDENT@257..258 "A"
+                    COLON2@258..260 "::"
+                    PATH_SEGMENT@260..261
+                      NAME_REF@260..261
+                        IDENT@260..261 "B"
+                  L_PAREN@261..262 "("
+                  LITERAL_PAT@262..264
+                    MINUS@262..263 "-"
+                    LITERAL@263..264
+                      INT_NUMBER@263..264 "1"
+                  COMMA@264..265 ","
+                  WHITESPACE@265..266 " "
+                  LITERAL_PAT@266..268
+                    MINUS@266..267 "-"
+                    LITERAL@267..268
+                      INT_NUMBER@267..268 "1"
+                  R_PAREN@268..269 ")"
+                WHITESPACE@269..270 " "
+                FAT_ARROW@270..272 "=>"
+                WHITESPACE@272..273 " "
+                TUPLE_EXPR@273..275
+                  L_PAREN@273..274 "("
+                  R_PAREN@274..275 ")"
+                COMMA@275..276 ","
+              WHITESPACE@276..285 "\n        "
+              MATCH_ARM@285..293
+                WILDCARD_PAT@285..286
+                  UNDERSCORE@285..286 "_"
+                WHITESPACE@286..287 " "
+                FAT_ARROW@287..289 "=>"
+                WHITESPACE@289..290 " "
+                TUPLE_EXPR@290..292
+                  L_PAREN@290..291 "("
+                  R_PAREN@291..292 ")"
+                COMMA@292..293 ","
+              WHITESPACE@293..298 "\n    "
+              R_CURLY@298..299 "}"
+        WHITESPACE@299..305 "\n\n    "
+        IF_EXPR@305..339
+          IF_KW@305..307 "if"
+          WHITESPACE@307..308 " "
+          CONDITION@308..331
+            LET_KW@308..311 "let"
+            WHITESPACE@311..312 " "
+            TUPLE_STRUCT_PAT@312..320
+              PATH@312..316
+                PATH_SEGMENT@312..316
+                  NAME_REF@312..316
+                    IDENT@312..316 "Some"
+              L_PAREN@316..317 "("
+              LITERAL_PAT@317..319
+                MINUS@317..318 "-"
+                LITERAL@318..319
+                  INT_NUMBER@318..319 "1"
+              R_PAREN@319..320 ")"
+            WHITESPACE@320..321 " "
+            EQ@321..322 "="
+            WHITESPACE@322..323 " "
+            CALL_EXPR@323..331
+              PATH_EXPR@323..327
+                PATH@323..327
+                  PATH_SEGMENT@323..327
+                    NAME_REF@323..327
+                      IDENT@323..327 "Some"
+              ARG_LIST@327..331
+                L_PAREN@327..328 "("
+                PREFIX_EXPR@328..330
+                  MINUS@328..329 "-"
+                  LITERAL@329..330
+                    INT_NUMBER@329..330 "1"
+                R_PAREN@330..331 ")"
+          WHITESPACE@331..332 " "
+          BLOCK_EXPR@332..339
+            STMT_LIST@332..339
+              L_CURLY@332..333 "{"
+              WHITESPACE@333..338 "\n    "
+              R_CURLY@338..339 "}"
+        WHITESPACE@339..340 "\n"
+        R_CURLY@340..341 "}"
   WHITESPACE@341..343 "\n\n"
   ENUM@343..367
     ENUM_KW@343..347 "enum"
@@ -315,6 +317,7 @@ SOURCE_FILE@0..395
       R_PAREN@390..391 ")"
     WHITESPACE@391..392 " "
     BLOCK_EXPR@392..394
-      L_CURLY@392..393 "{"
-      R_CURLY@393..394 "}"
+      STMT_LIST@392..394
+        L_CURLY@392..393 "{"
+        R_CURLY@393..394 "}"
   WHITESPACE@394..395 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0048_compound_assignment.rast b/crates/syntax/test_data/parser/ok/0048_compound_assignment.rast
index eaab478433f..b19a0b5f8bb 100644
--- a/crates/syntax/test_data/parser/ok/0048_compound_assignment.rast
+++ b/crates/syntax/test_data/parser/ok/0048_compound_assignment.rast
@@ -11,190 +11,191 @@ SOURCE_FILE@0..257
       R_PAREN@83..84 ")"
     WHITESPACE@84..85 " "
     BLOCK_EXPR@85..256
-      L_CURLY@85..86 "{"
-      WHITESPACE@86..91 "\n    "
-      LET_STMT@91..105
-        LET_KW@91..94 "let"
-        WHITESPACE@94..95 " "
-        IDENT_PAT@95..100
-          MUT_KW@95..98 "mut"
-          WHITESPACE@98..99 " "
-          NAME@99..100
-            IDENT@99..100 "a"
-        WHITESPACE@100..101 " "
-        EQ@101..102 "="
-        WHITESPACE@102..103 " "
-        LITERAL@103..104
-          INT_NUMBER@103..104 "0"
-        SEMICOLON@104..105 ";"
-      WHITESPACE@105..110 "\n    "
-      EXPR_STMT@110..117
-        BIN_EXPR@110..116
-          PATH_EXPR@110..111
-            PATH@110..111
-              PATH_SEGMENT@110..111
-                NAME_REF@110..111
-                  IDENT@110..111 "a"
-          WHITESPACE@111..112 " "
-          PLUSEQ@112..114 "+="
-          WHITESPACE@114..115 " "
-          LITERAL@115..116
-            INT_NUMBER@115..116 "1"
-        SEMICOLON@116..117 ";"
-      WHITESPACE@117..122 "\n    "
-      EXPR_STMT@122..129
-        BIN_EXPR@122..128
-          PATH_EXPR@122..123
-            PATH@122..123
-              PATH_SEGMENT@122..123
-                NAME_REF@122..123
-                  IDENT@122..123 "a"
-          WHITESPACE@123..124 " "
-          MINUSEQ@124..126 "-="
-          WHITESPACE@126..127 " "
-          LITERAL@127..128
-            INT_NUMBER@127..128 "2"
-        SEMICOLON@128..129 ";"
-      WHITESPACE@129..134 "\n    "
-      EXPR_STMT@134..141
-        BIN_EXPR@134..140
-          PATH_EXPR@134..135
-            PATH@134..135
-              PATH_SEGMENT@134..135
-                NAME_REF@134..135
-                  IDENT@134..135 "a"
-          WHITESPACE@135..136 " "
-          STAREQ@136..138 "*="
-          WHITESPACE@138..139 " "
-          LITERAL@139..140
-            INT_NUMBER@139..140 "3"
-        SEMICOLON@140..141 ";"
-      WHITESPACE@141..146 "\n    "
-      EXPR_STMT@146..153
-        BIN_EXPR@146..152
-          PATH_EXPR@146..147
-            PATH@146..147
-              PATH_SEGMENT@146..147
-                NAME_REF@146..147
-                  IDENT@146..147 "a"
-          WHITESPACE@147..148 " "
-          PERCENTEQ@148..150 "%="
-          WHITESPACE@150..151 " "
-          LITERAL@151..152
-            INT_NUMBER@151..152 "4"
-        SEMICOLON@152..153 ";"
-      WHITESPACE@153..158 "\n    "
-      EXPR_STMT@158..165
-        BIN_EXPR@158..164
-          PATH_EXPR@158..159
-            PATH@158..159
-              PATH_SEGMENT@158..159
-                NAME_REF@158..159
-                  IDENT@158..159 "a"
-          WHITESPACE@159..160 " "
-          SLASHEQ@160..162 "/="
-          WHITESPACE@162..163 " "
-          LITERAL@163..164
-            INT_NUMBER@163..164 "5"
-        SEMICOLON@164..165 ";"
-      WHITESPACE@165..170 "\n    "
-      EXPR_STMT@170..177
-        BIN_EXPR@170..176
-          PATH_EXPR@170..171
-            PATH@170..171
-              PATH_SEGMENT@170..171
-                NAME_REF@170..171
-                  IDENT@170..171 "a"
-          WHITESPACE@171..172 " "
-          PIPEEQ@172..174 "|="
-          WHITESPACE@174..175 " "
-          LITERAL@175..176
-            INT_NUMBER@175..176 "6"
-        SEMICOLON@176..177 ";"
-      WHITESPACE@177..182 "\n    "
-      EXPR_STMT@182..189
-        BIN_EXPR@182..188
-          PATH_EXPR@182..183
-            PATH@182..183
-              PATH_SEGMENT@182..183
-                NAME_REF@182..183
-                  IDENT@182..183 "a"
-          WHITESPACE@183..184 " "
-          AMPEQ@184..186 "&="
-          WHITESPACE@186..187 " "
-          LITERAL@187..188
-            INT_NUMBER@187..188 "7"
-        SEMICOLON@188..189 ";"
-      WHITESPACE@189..194 "\n    "
-      EXPR_STMT@194..201
-        BIN_EXPR@194..200
-          PATH_EXPR@194..195
-            PATH@194..195
-              PATH_SEGMENT@194..195
-                NAME_REF@194..195
-                  IDENT@194..195 "a"
-          WHITESPACE@195..196 " "
-          CARETEQ@196..198 "^="
-          WHITESPACE@198..199 " "
-          LITERAL@199..200
-            INT_NUMBER@199..200 "8"
-        SEMICOLON@200..201 ";"
-      WHITESPACE@201..206 "\n    "
-      EXPR_STMT@206..213
-        BIN_EXPR@206..212
-          PATH_EXPR@206..207
-            PATH@206..207
-              PATH_SEGMENT@206..207
-                NAME_REF@206..207
-                  IDENT@206..207 "a"
-          WHITESPACE@207..208 " "
-          LTEQ@208..210 "<="
-          WHITESPACE@210..211 " "
-          LITERAL@211..212
-            INT_NUMBER@211..212 "9"
-        SEMICOLON@212..213 ";"
-      WHITESPACE@213..218 "\n    "
-      EXPR_STMT@218..226
-        BIN_EXPR@218..225
-          PATH_EXPR@218..219
-            PATH@218..219
-              PATH_SEGMENT@218..219
-                NAME_REF@218..219
-                  IDENT@218..219 "a"
-          WHITESPACE@219..220 " "
-          GTEQ@220..222 ">="
-          WHITESPACE@222..223 " "
-          LITERAL@223..225
-            INT_NUMBER@223..225 "10"
-        SEMICOLON@225..226 ";"
-      WHITESPACE@226..231 "\n    "
-      EXPR_STMT@231..240
-        BIN_EXPR@231..239
-          PATH_EXPR@231..232
-            PATH@231..232
-              PATH_SEGMENT@231..232
-                NAME_REF@231..232
-                  IDENT@231..232 "a"
-          WHITESPACE@232..233 " "
-          SHREQ@233..236 ">>="
-          WHITESPACE@236..237 " "
-          LITERAL@237..239
-            INT_NUMBER@237..239 "11"
-        SEMICOLON@239..240 ";"
-      WHITESPACE@240..245 "\n    "
-      EXPR_STMT@245..254
-        BIN_EXPR@245..253
-          PATH_EXPR@245..246
-            PATH@245..246
-              PATH_SEGMENT@245..246
-                NAME_REF@245..246
-                  IDENT@245..246 "a"
-          WHITESPACE@246..247 " "
-          SHLEQ@247..250 "<<="
-          WHITESPACE@250..251 " "
-          LITERAL@251..253
-            INT_NUMBER@251..253 "12"
-        SEMICOLON@253..254 ";"
-      WHITESPACE@254..255 "\n"
-      R_CURLY@255..256 "}"
+      STMT_LIST@85..256
+        L_CURLY@85..86 "{"
+        WHITESPACE@86..91 "\n    "
+        LET_STMT@91..105
+          LET_KW@91..94 "let"
+          WHITESPACE@94..95 " "
+          IDENT_PAT@95..100
+            MUT_KW@95..98 "mut"
+            WHITESPACE@98..99 " "
+            NAME@99..100
+              IDENT@99..100 "a"
+          WHITESPACE@100..101 " "
+          EQ@101..102 "="
+          WHITESPACE@102..103 " "
+          LITERAL@103..104
+            INT_NUMBER@103..104 "0"
+          SEMICOLON@104..105 ";"
+        WHITESPACE@105..110 "\n    "
+        EXPR_STMT@110..117
+          BIN_EXPR@110..116
+            PATH_EXPR@110..111
+              PATH@110..111
+                PATH_SEGMENT@110..111
+                  NAME_REF@110..111
+                    IDENT@110..111 "a"
+            WHITESPACE@111..112 " "
+            PLUSEQ@112..114 "+="
+            WHITESPACE@114..115 " "
+            LITERAL@115..116
+              INT_NUMBER@115..116 "1"
+          SEMICOLON@116..117 ";"
+        WHITESPACE@117..122 "\n    "
+        EXPR_STMT@122..129
+          BIN_EXPR@122..128
+            PATH_EXPR@122..123
+              PATH@122..123
+                PATH_SEGMENT@122..123
+                  NAME_REF@122..123
+                    IDENT@122..123 "a"
+            WHITESPACE@123..124 " "
+            MINUSEQ@124..126 "-="
+            WHITESPACE@126..127 " "
+            LITERAL@127..128
+              INT_NUMBER@127..128 "2"
+          SEMICOLON@128..129 ";"
+        WHITESPACE@129..134 "\n    "
+        EXPR_STMT@134..141
+          BIN_EXPR@134..140
+            PATH_EXPR@134..135
+              PATH@134..135
+                PATH_SEGMENT@134..135
+                  NAME_REF@134..135
+                    IDENT@134..135 "a"
+            WHITESPACE@135..136 " "
+            STAREQ@136..138 "*="
+            WHITESPACE@138..139 " "
+            LITERAL@139..140
+              INT_NUMBER@139..140 "3"
+          SEMICOLON@140..141 ";"
+        WHITESPACE@141..146 "\n    "
+        EXPR_STMT@146..153
+          BIN_EXPR@146..152
+            PATH_EXPR@146..147
+              PATH@146..147
+                PATH_SEGMENT@146..147
+                  NAME_REF@146..147
+                    IDENT@146..147 "a"
+            WHITESPACE@147..148 " "
+            PERCENTEQ@148..150 "%="
+            WHITESPACE@150..151 " "
+            LITERAL@151..152
+              INT_NUMBER@151..152 "4"
+          SEMICOLON@152..153 ";"
+        WHITESPACE@153..158 "\n    "
+        EXPR_STMT@158..165
+          BIN_EXPR@158..164
+            PATH_EXPR@158..159
+              PATH@158..159
+                PATH_SEGMENT@158..159
+                  NAME_REF@158..159
+                    IDENT@158..159 "a"
+            WHITESPACE@159..160 " "
+            SLASHEQ@160..162 "/="
+            WHITESPACE@162..163 " "
+            LITERAL@163..164
+              INT_NUMBER@163..164 "5"
+          SEMICOLON@164..165 ";"
+        WHITESPACE@165..170 "\n    "
+        EXPR_STMT@170..177
+          BIN_EXPR@170..176
+            PATH_EXPR@170..171
+              PATH@170..171
+                PATH_SEGMENT@170..171
+                  NAME_REF@170..171
+                    IDENT@170..171 "a"
+            WHITESPACE@171..172 " "
+            PIPEEQ@172..174 "|="
+            WHITESPACE@174..175 " "
+            LITERAL@175..176
+              INT_NUMBER@175..176 "6"
+          SEMICOLON@176..177 ";"
+        WHITESPACE@177..182 "\n    "
+        EXPR_STMT@182..189
+          BIN_EXPR@182..188
+            PATH_EXPR@182..183
+              PATH@182..183
+                PATH_SEGMENT@182..183
+                  NAME_REF@182..183
+                    IDENT@182..183 "a"
+            WHITESPACE@183..184 " "
+            AMPEQ@184..186 "&="
+            WHITESPACE@186..187 " "
+            LITERAL@187..188
+              INT_NUMBER@187..188 "7"
+          SEMICOLON@188..189 ";"
+        WHITESPACE@189..194 "\n    "
+        EXPR_STMT@194..201
+          BIN_EXPR@194..200
+            PATH_EXPR@194..195
+              PATH@194..195
+                PATH_SEGMENT@194..195
+                  NAME_REF@194..195
+                    IDENT@194..195 "a"
+            WHITESPACE@195..196 " "
+            CARETEQ@196..198 "^="
+            WHITESPACE@198..199 " "
+            LITERAL@199..200
+              INT_NUMBER@199..200 "8"
+          SEMICOLON@200..201 ";"
+        WHITESPACE@201..206 "\n    "
+        EXPR_STMT@206..213
+          BIN_EXPR@206..212
+            PATH_EXPR@206..207
+              PATH@206..207
+                PATH_SEGMENT@206..207
+                  NAME_REF@206..207
+                    IDENT@206..207 "a"
+            WHITESPACE@207..208 " "
+            LTEQ@208..210 "<="
+            WHITESPACE@210..211 " "
+            LITERAL@211..212
+              INT_NUMBER@211..212 "9"
+          SEMICOLON@212..213 ";"
+        WHITESPACE@213..218 "\n    "
+        EXPR_STMT@218..226
+          BIN_EXPR@218..225
+            PATH_EXPR@218..219
+              PATH@218..219
+                PATH_SEGMENT@218..219
+                  NAME_REF@218..219
+                    IDENT@218..219 "a"
+            WHITESPACE@219..220 " "
+            GTEQ@220..222 ">="
+            WHITESPACE@222..223 " "
+            LITERAL@223..225
+              INT_NUMBER@223..225 "10"
+          SEMICOLON@225..226 ";"
+        WHITESPACE@226..231 "\n    "
+        EXPR_STMT@231..240
+          BIN_EXPR@231..239
+            PATH_EXPR@231..232
+              PATH@231..232
+                PATH_SEGMENT@231..232
+                  NAME_REF@231..232
+                    IDENT@231..232 "a"
+            WHITESPACE@232..233 " "
+            SHREQ@233..236 ">>="
+            WHITESPACE@236..237 " "
+            LITERAL@237..239
+              INT_NUMBER@237..239 "11"
+          SEMICOLON@239..240 ";"
+        WHITESPACE@240..245 "\n    "
+        EXPR_STMT@245..254
+          BIN_EXPR@245..253
+            PATH_EXPR@245..246
+              PATH@245..246
+                PATH_SEGMENT@245..246
+                  NAME_REF@245..246
+                    IDENT@245..246 "a"
+            WHITESPACE@246..247 " "
+            SHLEQ@247..250 "<<="
+            WHITESPACE@250..251 " "
+            LITERAL@251..253
+              INT_NUMBER@251..253 "12"
+          SEMICOLON@253..254 ";"
+        WHITESPACE@254..255 "\n"
+        R_CURLY@255..256 "}"
   WHITESPACE@256..257 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0049_async_block.rast b/crates/syntax/test_data/parser/ok/0049_async_block.rast
index 57ecad3cfa5..a254214595a 100644
--- a/crates/syntax/test_data/parser/ok/0049_async_block.rast
+++ b/crates/syntax/test_data/parser/ok/0049_async_block.rast
@@ -9,27 +9,28 @@ SOURCE_FILE@0..47
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..45
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..24
-        EFFECT_EXPR@15..23
-          ASYNC_KW@15..20 "async"
-          WHITESPACE@20..21 " "
-          BLOCK_EXPR@21..23
-            L_CURLY@21..22 "{"
-            R_CURLY@22..23 "}"
-        SEMICOLON@23..24 ";"
-      WHITESPACE@24..29 "\n    "
-      EXPR_STMT@29..43
-        EFFECT_EXPR@29..42
-          ASYNC_KW@29..34 "async"
-          WHITESPACE@34..35 " "
-          MOVE_KW@35..39 "move"
-          WHITESPACE@39..40 " "
-          BLOCK_EXPR@40..42
-            L_CURLY@40..41 "{"
-            R_CURLY@41..42 "}"
-        SEMICOLON@42..43 ";"
-      WHITESPACE@43..44 "\n"
-      R_CURLY@44..45 "}"
+      STMT_LIST@9..45
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..24
+          BLOCK_EXPR@15..23
+            ASYNC_KW@15..20 "async"
+            WHITESPACE@20..21 " "
+            STMT_LIST@21..23
+              L_CURLY@21..22 "{"
+              R_CURLY@22..23 "}"
+          SEMICOLON@23..24 ";"
+        WHITESPACE@24..29 "\n    "
+        EXPR_STMT@29..43
+          BLOCK_EXPR@29..42
+            ASYNC_KW@29..34 "async"
+            WHITESPACE@34..35 " "
+            MOVE_KW@35..39 "move"
+            WHITESPACE@39..40 " "
+            STMT_LIST@40..42
+              L_CURLY@40..41 "{"
+              R_CURLY@41..42 "}"
+          SEMICOLON@42..43 ";"
+        WHITESPACE@43..44 "\n"
+        R_CURLY@44..45 "}"
   WHITESPACE@45..47 "\n\n"
diff --git a/crates/syntax/test_data/parser/ok/0050_async_block_as_argument.rast b/crates/syntax/test_data/parser/ok/0050_async_block_as_argument.rast
index c7ce12e93a0..f54c0c16642 100644
--- a/crates/syntax/test_data/parser/ok/0050_async_block_as_argument.rast
+++ b/crates/syntax/test_data/parser/ok/0050_async_block_as_argument.rast
@@ -49,8 +49,9 @@ SOURCE_FILE@0..95
       R_PAREN@48..49 ")"
     WHITESPACE@49..50 " "
     BLOCK_EXPR@50..52
-      L_CURLY@50..51 "{"
-      R_CURLY@51..52 "}"
+      STMT_LIST@50..52
+        L_CURLY@50..51 "{"
+        R_CURLY@51..52 "}"
   WHITESPACE@52..54 "\n\n"
   FN@54..94
     FN_KW@54..56 "fn"
@@ -62,29 +63,30 @@ SOURCE_FILE@0..95
       R_PAREN@62..63 ")"
     WHITESPACE@63..64 " "
     BLOCK_EXPR@64..94
-      L_CURLY@64..65 "{"
-      WHITESPACE@65..70 "\n    "
-      CALL_EXPR@70..92
-        PATH_EXPR@70..73
-          PATH@70..73
-            PATH_SEGMENT@70..73
-              NAME_REF@70..73
-                IDENT@70..73 "foo"
-        ARG_LIST@73..92
-          L_PAREN@73..74 "("
-          EFFECT_EXPR@74..91
-            ASYNC_KW@74..79 "async"
-            WHITESPACE@79..80 " "
-            MOVE_KW@80..84 "move"
-            WHITESPACE@84..85 " "
-            BLOCK_EXPR@85..91
-              L_CURLY@85..86 "{"
-              WHITESPACE@86..87 " "
-              LITERAL@87..89
-                INT_NUMBER@87..89 "12"
-              WHITESPACE@89..90 " "
-              R_CURLY@90..91 "}"
-          R_PAREN@91..92 ")"
-      WHITESPACE@92..93 "\n"
-      R_CURLY@93..94 "}"
+      STMT_LIST@64..94
+        L_CURLY@64..65 "{"
+        WHITESPACE@65..70 "\n    "
+        CALL_EXPR@70..92
+          PATH_EXPR@70..73
+            PATH@70..73
+              PATH_SEGMENT@70..73
+                NAME_REF@70..73
+                  IDENT@70..73 "foo"
+          ARG_LIST@73..92
+            L_PAREN@73..74 "("
+            BLOCK_EXPR@74..91
+              ASYNC_KW@74..79 "async"
+              WHITESPACE@79..80 " "
+              MOVE_KW@80..84 "move"
+              WHITESPACE@84..85 " "
+              STMT_LIST@85..91
+                L_CURLY@85..86 "{"
+                WHITESPACE@86..87 " "
+                LITERAL@87..89
+                  INT_NUMBER@87..89 "12"
+                WHITESPACE@89..90 " "
+                R_CURLY@90..91 "}"
+            R_PAREN@91..92 ")"
+        WHITESPACE@92..93 "\n"
+        R_CURLY@93..94 "}"
   WHITESPACE@94..95 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0051_parameter_attrs.rast b/crates/syntax/test_data/parser/ok/0051_parameter_attrs.rast
index a7f0f7bc666..e4e76645ce0 100644
--- a/crates/syntax/test_data/parser/ok/0051_parameter_attrs.rast
+++ b/crates/syntax/test_data/parser/ok/0051_parameter_attrs.rast
@@ -40,8 +40,9 @@ SOURCE_FILE@0..519
       R_PAREN@33..34 ")"
     WHITESPACE@34..35 " "
     BLOCK_EXPR@35..37
-      L_CURLY@35..36 "{"
-      R_CURLY@36..37 "}"
+      STMT_LIST@35..37
+        L_CURLY@35..36 "{"
+        R_CURLY@36..37 "}"
   WHITESPACE@37..38 "\n"
   FN@38..62
     FN_KW@38..40 "fn"
@@ -74,8 +75,9 @@ SOURCE_FILE@0..519
       R_PAREN@58..59 ")"
     WHITESPACE@59..60 " "
     BLOCK_EXPR@60..62
-      L_CURLY@60..61 "{"
-      R_CURLY@61..62 "}"
+      STMT_LIST@60..62
+        L_CURLY@60..61 "{"
+        R_CURLY@61..62 "}"
   WHITESPACE@62..64 "\n\n"
   EXTERN_BLOCK@64..128
     ABI@64..74
@@ -189,8 +191,9 @@ SOURCE_FILE@0..519
       L_PAREN@168..169 "("
       R_PAREN@169..170 ")"
     BLOCK_EXPR@170..172
-      L_CURLY@170..171 "{"
-      R_CURLY@171..172 "}"
+      STMT_LIST@170..172
+        L_CURLY@170..171 "{"
+        R_CURLY@171..172 "}"
   WHITESPACE@172..174 "\n\n"
   TRAIT@174..236
     TRAIT_KW@174..179 "trait"
@@ -294,8 +297,9 @@ SOURCE_FILE@0..519
           R_PAREN@273..274 ")"
         WHITESPACE@274..275 " "
         BLOCK_EXPR@275..277
-          L_CURLY@275..276 "{"
-          R_CURLY@276..277 "}"
+          STMT_LIST@275..277
+            L_CURLY@275..276 "{"
+            R_CURLY@276..277 "}"
       WHITESPACE@277..283 "\n     "
       FN@283..305
         FN_KW@283..285 "fn"
@@ -320,8 +324,9 @@ SOURCE_FILE@0..519
           R_PAREN@301..302 ")"
         WHITESPACE@302..303 " "
         BLOCK_EXPR@303..305
-          L_CURLY@303..304 "{"
-          R_CURLY@304..305 "}"
+          STMT_LIST@303..305
+            L_CURLY@303..304 "{"
+            R_CURLY@304..305 "}"
       WHITESPACE@305..311 "\n     "
       FN@311..334
         FN_KW@311..313 "fn"
@@ -347,8 +352,9 @@ SOURCE_FILE@0..519
           R_PAREN@330..331 ")"
         WHITESPACE@331..332 " "
         BLOCK_EXPR@332..334
-          L_CURLY@332..333 "{"
-          R_CURLY@333..334 "}"
+          STMT_LIST@332..334
+            L_CURLY@332..333 "{"
+            R_CURLY@333..334 "}"
       WHITESPACE@334..340 "\n     "
       FN@340..371
         FN_KW@340..342 "fn"
@@ -382,8 +388,9 @@ SOURCE_FILE@0..519
           R_PAREN@367..368 ")"
         WHITESPACE@368..369 " "
         BLOCK_EXPR@369..371
-          L_CURLY@369..370 "{"
-          R_CURLY@370..371 "}"
+          STMT_LIST@369..371
+            L_CURLY@369..370 "{"
+            R_CURLY@370..371 "}"
       WHITESPACE@371..377 "\n     "
       FN@377..407
         FN_KW@377..379 "fn"
@@ -418,8 +425,9 @@ SOURCE_FILE@0..519
           R_PAREN@403..404 ")"
         WHITESPACE@404..405 " "
         BLOCK_EXPR@405..407
-          L_CURLY@405..406 "{"
-          R_CURLY@406..407 "}"
+          STMT_LIST@405..407
+            L_CURLY@405..406 "{"
+            R_CURLY@406..407 "}"
       WHITESPACE@407..413 "\n     "
       FN@413..447
         FN_KW@413..415 "fn"
@@ -456,8 +464,9 @@ SOURCE_FILE@0..519
           R_PAREN@443..444 ")"
         WHITESPACE@444..445 " "
         BLOCK_EXPR@445..447
-          L_CURLY@445..446 "{"
-          R_CURLY@446..447 "}"
+          STMT_LIST@445..447
+            L_CURLY@445..446 "{"
+            R_CURLY@446..447 "}"
       WHITESPACE@447..453 "\n     "
       FN@453..480
         FN_KW@453..455 "fn"
@@ -489,8 +498,9 @@ SOURCE_FILE@0..519
           R_PAREN@476..477 ")"
         WHITESPACE@477..478 " "
         BLOCK_EXPR@478..480
-          L_CURLY@478..479 "{"
-          R_CURLY@479..480 "}"
+          STMT_LIST@478..480
+            L_CURLY@478..479 "{"
+            R_CURLY@479..480 "}"
       WHITESPACE@480..486 "\n     "
       FN@486..517
         FN_KW@486..488 "fn"
@@ -531,7 +541,8 @@ SOURCE_FILE@0..519
           R_PAREN@513..514 ")"
         WHITESPACE@514..515 " "
         BLOCK_EXPR@515..517
-          L_CURLY@515..516 "{"
-          R_CURLY@516..517 "}"
+          STMT_LIST@515..517
+            L_CURLY@515..516 "{"
+            R_CURLY@516..517 "}"
       WHITESPACE@517..518 "\n"
       R_CURLY@518..519 "}"
diff --git a/crates/syntax/test_data/parser/ok/0052_for_range_block.rast b/crates/syntax/test_data/parser/ok/0052_for_range_block.rast
index 350823ba36c..949ddc3797e 100644
--- a/crates/syntax/test_data/parser/ok/0052_for_range_block.rast
+++ b/crates/syntax/test_data/parser/ok/0052_for_range_block.rast
@@ -9,70 +9,73 @@ SOURCE_FILE@0..80
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..79
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..14 "\n   "
-      FOR_EXPR@14..77
-        FOR_KW@14..17 "for"
-        WHITESPACE@17..18 " "
-        IDENT_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 " "
-          DOT2@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 " "
-                DOT2@32..34 ".."
-                WHITESPACE@34..35 " "
-                BLOCK_EXPR@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"
-            GENERIC_ARG_LIST@47..54
-              COLON2@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_EXPR@57..77
-          L_CURLY@57..58 "{"
-          WHITESPACE@58..66 "\n       "
-          EXPR_STMT@66..72
-            BREAK_EXPR@66..71
-              BREAK_KW@66..71 "break"
-            SEMICOLON@71..72 ";"
-          WHITESPACE@72..76 "\n   "
-          R_CURLY@76..77 "}"
-      WHITESPACE@77..78 "\n"
-      R_CURLY@78..79 "}"
+      STMT_LIST@9..79
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..14 "\n   "
+        FOR_EXPR@14..77
+          FOR_KW@14..17 "for"
+          WHITESPACE@17..18 " "
+          IDENT_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 " "
+            DOT2@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 " "
+                  DOT2@32..34 ".."
+                  WHITESPACE@34..35 " "
+                  BLOCK_EXPR@35..42
+                    STMT_LIST@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"
+              GENERIC_ARG_LIST@47..54
+                COLON2@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_EXPR@57..77
+            STMT_LIST@57..77
+              L_CURLY@57..58 "{"
+              WHITESPACE@58..66 "\n       "
+              EXPR_STMT@66..72
+                BREAK_EXPR@66..71
+                  BREAK_KW@66..71 "break"
+                SEMICOLON@71..72 ";"
+              WHITESPACE@72..76 "\n   "
+              R_CURLY@76..77 "}"
+        WHITESPACE@77..78 "\n"
+        R_CURLY@78..79 "}"
   WHITESPACE@79..80 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0054_qual_path_in_type_arg.rast b/crates/syntax/test_data/parser/ok/0054_qual_path_in_type_arg.rast
index f25c9ac36ff..e85cb15961e 100644
--- a/crates/syntax/test_data/parser/ok/0054_qual_path_in_type_arg.rast
+++ b/crates/syntax/test_data/parser/ok/0054_qual_path_in_type_arg.rast
@@ -32,8 +32,9 @@ SOURCE_FILE@0..88
               R_ANGLE@22..23 ">"
     WHITESPACE@23..24 " "
     BLOCK_EXPR@24..26
-      L_CURLY@24..25 "{"
-      R_CURLY@25..26 "}"
+      STMT_LIST@24..26
+        L_CURLY@24..25 "{"
+        R_CURLY@25..26 "}"
   WHITESPACE@26..28 "\n\n"
   FN@28..56
     FN_KW@28..30 "fn"
@@ -74,8 +75,9 @@ SOURCE_FILE@0..88
       R_PAREN@52..53 ")"
     WHITESPACE@53..54 " "
     BLOCK_EXPR@54..56
-      L_CURLY@54..55 "{"
-      R_CURLY@55..56 "}"
+      STMT_LIST@54..56
+        L_CURLY@54..55 "{"
+        R_CURLY@55..56 "}"
   WHITESPACE@56..58 "\n\n"
   FN@58..87
     FN_KW@58..60 "fn"
@@ -118,6 +120,7 @@ SOURCE_FILE@0..88
       R_PAREN@83..84 ")"
     WHITESPACE@84..85 " "
     BLOCK_EXPR@85..87
-      L_CURLY@85..86 "{"
-      R_CURLY@86..87 "}"
+      STMT_LIST@85..87
+        L_CURLY@85..86 "{"
+        R_CURLY@86..87 "}"
   WHITESPACE@87..88 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0055_dot_dot_dot.rast b/crates/syntax/test_data/parser/ok/0055_dot_dot_dot.rast
index 7447d516ed1..b43c38b9e04 100644
--- a/crates/syntax/test_data/parser/ok/0055_dot_dot_dot.rast
+++ b/crates/syntax/test_data/parser/ok/0055_dot_dot_dot.rast
@@ -22,28 +22,29 @@ SOURCE_FILE@0..49
       R_PAREN@22..23 ")"
     WHITESPACE@23..24 " "
     BLOCK_EXPR@24..48
-      L_CURLY@24..25 "{"
-      WHITESPACE@25..30 "\n    "
-      LET_STMT@30..46
-        LET_KW@30..33 "let"
-        WHITESPACE@33..34 " "
-        TUPLE_PAT@34..36
-          L_PAREN@34..35 "("
-          R_PAREN@35..36 ")"
-        COLON@36..37 ":"
-        PATH_TYPE@37..40
-          PATH@37..40
-            PATH_SEGMENT@37..40
-              COLON2@37..39 "::"
-              NAME_REF@39..40
-                IDENT@39..40 "X"
-        WHITESPACE@40..41 " "
-        EQ@41..42 "="
-        WHITESPACE@42..43 " "
-        TUPLE_EXPR@43..45
-          L_PAREN@43..44 "("
-          R_PAREN@44..45 ")"
-        SEMICOLON@45..46 ";"
-      WHITESPACE@46..47 "\n"
-      R_CURLY@47..48 "}"
+      STMT_LIST@24..48
+        L_CURLY@24..25 "{"
+        WHITESPACE@25..30 "\n    "
+        LET_STMT@30..46
+          LET_KW@30..33 "let"
+          WHITESPACE@33..34 " "
+          TUPLE_PAT@34..36
+            L_PAREN@34..35 "("
+            R_PAREN@35..36 ")"
+          COLON@36..37 ":"
+          PATH_TYPE@37..40
+            PATH@37..40
+              PATH_SEGMENT@37..40
+                COLON2@37..39 "::"
+                NAME_REF@39..40
+                  IDENT@39..40 "X"
+          WHITESPACE@40..41 " "
+          EQ@41..42 "="
+          WHITESPACE@42..43 " "
+          TUPLE_EXPR@43..45
+            L_PAREN@43..44 "("
+            R_PAREN@44..45 ")"
+          SEMICOLON@45..46 ";"
+        WHITESPACE@46..47 "\n"
+        R_CURLY@47..48 "}"
   WHITESPACE@48..49 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0056_neq_in_type.rast b/crates/syntax/test_data/parser/ok/0056_neq_in_type.rast
index 3ef916e5565..7393f1df83a 100644
--- a/crates/syntax/test_data/parser/ok/0056_neq_in_type.rast
+++ b/crates/syntax/test_data/parser/ok/0056_neq_in_type.rast
@@ -9,56 +9,58 @@ SOURCE_FILE@0..71
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..70
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      IF_EXPR@16..68
-        IF_KW@16..18 "if"
-        WHITESPACE@18..19 " "
-        CONDITION@19..65
-          BIN_EXPR@19..65
-            CAST_EXPR@19..40
-              METHOD_CALL_EXPR@19..33
-                LITERAL@19..25
-                  FLOAT_NUMBER@19..25 "1.0f32"
-                DOT@25..26 "."
-                NAME_REF@26..31
-                  IDENT@26..31 "floor"
-                ARG_LIST@31..33
-                  L_PAREN@31..32 "("
-                  R_PAREN@32..33 ")"
-              WHITESPACE@33..34 " "
-              AS_KW@34..36 "as"
-              WHITESPACE@36..37 " "
-              PATH_TYPE@37..40
-                PATH@37..40
-                  PATH_SEGMENT@37..40
-                    NAME_REF@37..40
-                      IDENT@37..40 "i64"
-            WHITESPACE@40..41 " "
-            NEQ@41..43 "!="
-            WHITESPACE@43..44 " "
-            CAST_EXPR@44..65
-              METHOD_CALL_EXPR@44..58
-                LITERAL@44..50
-                  FLOAT_NUMBER@44..50 "1.0f32"
-                DOT@50..51 "."
-                NAME_REF@51..56
-                  IDENT@51..56 "floor"
-                ARG_LIST@56..58
-                  L_PAREN@56..57 "("
-                  R_PAREN@57..58 ")"
-              WHITESPACE@58..59 " "
-              AS_KW@59..61 "as"
-              WHITESPACE@61..62 " "
-              PATH_TYPE@62..65
-                PATH@62..65
-                  PATH_SEGMENT@62..65
-                    NAME_REF@62..65
-                      IDENT@62..65 "i64"
-        WHITESPACE@65..66 " "
-        BLOCK_EXPR@66..68
-          L_CURLY@66..67 "{"
-          R_CURLY@67..68 "}"
-      WHITESPACE@68..69 "\n"
-      R_CURLY@69..70 "}"
+      STMT_LIST@10..70
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        IF_EXPR@16..68
+          IF_KW@16..18 "if"
+          WHITESPACE@18..19 " "
+          CONDITION@19..65
+            BIN_EXPR@19..65
+              CAST_EXPR@19..40
+                METHOD_CALL_EXPR@19..33
+                  LITERAL@19..25
+                    FLOAT_NUMBER@19..25 "1.0f32"
+                  DOT@25..26 "."
+                  NAME_REF@26..31
+                    IDENT@26..31 "floor"
+                  ARG_LIST@31..33
+                    L_PAREN@31..32 "("
+                    R_PAREN@32..33 ")"
+                WHITESPACE@33..34 " "
+                AS_KW@34..36 "as"
+                WHITESPACE@36..37 " "
+                PATH_TYPE@37..40
+                  PATH@37..40
+                    PATH_SEGMENT@37..40
+                      NAME_REF@37..40
+                        IDENT@37..40 "i64"
+              WHITESPACE@40..41 " "
+              NEQ@41..43 "!="
+              WHITESPACE@43..44 " "
+              CAST_EXPR@44..65
+                METHOD_CALL_EXPR@44..58
+                  LITERAL@44..50
+                    FLOAT_NUMBER@44..50 "1.0f32"
+                  DOT@50..51 "."
+                  NAME_REF@51..56
+                    IDENT@51..56 "floor"
+                  ARG_LIST@56..58
+                    L_PAREN@56..57 "("
+                    R_PAREN@57..58 ")"
+                WHITESPACE@58..59 " "
+                AS_KW@59..61 "as"
+                WHITESPACE@61..62 " "
+                PATH_TYPE@62..65
+                  PATH@62..65
+                    PATH_SEGMENT@62..65
+                      NAME_REF@62..65
+                        IDENT@62..65 "i64"
+          WHITESPACE@65..66 " "
+          BLOCK_EXPR@66..68
+            STMT_LIST@66..68
+              L_CURLY@66..67 "{"
+              R_CURLY@67..68 "}"
+        WHITESPACE@68..69 "\n"
+        R_CURLY@69..70 "}"
   WHITESPACE@70..71 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0057_loop_in_call.rast b/crates/syntax/test_data/parser/ok/0057_loop_in_call.rast
index 76301004a5d..f8efd8ea4ca 100644
--- a/crates/syntax/test_data/parser/ok/0057_loop_in_call.rast
+++ b/crates/syntax/test_data/parser/ok/0057_loop_in_call.rast
@@ -20,8 +20,9 @@ SOURCE_FILE@0..50
       R_PAREN@13..14 ")"
     WHITESPACE@14..15 " "
     BLOCK_EXPR@15..17
-      L_CURLY@15..16 "{"
-      R_CURLY@16..17 "}"
+      STMT_LIST@15..17
+        L_CURLY@15..16 "{"
+        R_CURLY@16..17 "}"
   WHITESPACE@17..19 "\n\n"
   FN@19..50
     FN_KW@19..21 "fn"
@@ -33,24 +34,26 @@ SOURCE_FILE@0..50
       R_PAREN@27..28 ")"
     WHITESPACE@28..29 " "
     BLOCK_EXPR@29..50
-      L_CURLY@29..30 "{"
-      WHITESPACE@30..35 "\n    "
-      EXPR_STMT@35..48
-        CALL_EXPR@35..47
-          PATH_EXPR@35..38
-            PATH@35..38
-              PATH_SEGMENT@35..38
-                NAME_REF@35..38
-                  IDENT@35..38 "foo"
-          ARG_LIST@38..47
-            L_PAREN@38..39 "("
-            LOOP_EXPR@39..46
-              LOOP_KW@39..43 "loop"
-              WHITESPACE@43..44 " "
-              BLOCK_EXPR@44..46
-                L_CURLY@44..45 "{"
-                R_CURLY@45..46 "}"
-            R_PAREN@46..47 ")"
-        SEMICOLON@47..48 ";"
-      WHITESPACE@48..49 "\n"
-      R_CURLY@49..50 "}"
+      STMT_LIST@29..50
+        L_CURLY@29..30 "{"
+        WHITESPACE@30..35 "\n    "
+        EXPR_STMT@35..48
+          CALL_EXPR@35..47
+            PATH_EXPR@35..38
+              PATH@35..38
+                PATH_SEGMENT@35..38
+                  NAME_REF@35..38
+                    IDENT@35..38 "foo"
+            ARG_LIST@38..47
+              L_PAREN@38..39 "("
+              LOOP_EXPR@39..46
+                LOOP_KW@39..43 "loop"
+                WHITESPACE@43..44 " "
+                BLOCK_EXPR@44..46
+                  STMT_LIST@44..46
+                    L_CURLY@44..45 "{"
+                    R_CURLY@45..46 "}"
+              R_PAREN@46..47 ")"
+          SEMICOLON@47..48 ";"
+        WHITESPACE@48..49 "\n"
+        R_CURLY@49..50 "}"
diff --git a/crates/syntax/test_data/parser/ok/0058_unary_expr_precedence.rast b/crates/syntax/test_data/parser/ok/0058_unary_expr_precedence.rast
index a1dfd58f26b..476a19307ab 100644
--- a/crates/syntax/test_data/parser/ok/0058_unary_expr_precedence.rast
+++ b/crates/syntax/test_data/parser/ok/0058_unary_expr_precedence.rast
@@ -9,88 +9,89 @@ SOURCE_FILE@0..79
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..78
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..27
-        BIN_EXPR@15..26
-          BIN_EXPR@15..22
-            LITERAL@15..16
-              INT_NUMBER@15..16 "1"
-            WHITESPACE@16..17 " "
-            PLUS@17..18 "+"
-            WHITESPACE@18..19 " "
-            PREFIX_EXPR@19..22
-              STAR@19..20 "*"
-              REF_EXPR@20..22
-                AMP@20..21 "&"
-                LITERAL@21..22
-                  INT_NUMBER@21..22 "2"
-          WHITESPACE@22..23 " "
-          PLUS@23..24 "+"
-          WHITESPACE@24..25 " "
-          LITERAL@25..26
-            INT_NUMBER@25..26 "3"
-        SEMICOLON@26..27 ";"
-      WHITESPACE@27..32 "\n    "
-      EXPR_STMT@32..43
-        CAST_EXPR@32..42
-          PREFIX_EXPR@32..35
-            STAR@32..33 "*"
-            REF_EXPR@33..35
-              AMP@33..34 "&"
-              LITERAL@34..35
-                INT_NUMBER@34..35 "1"
-          WHITESPACE@35..36 " "
-          AS_KW@36..38 "as"
-          WHITESPACE@38..39 " "
-          PATH_TYPE@39..42
-            PATH@39..42
-              PATH_SEGMENT@39..42
-                NAME_REF@39..42
-                  IDENT@39..42 "u64"
-        SEMICOLON@42..43 ";"
-      WHITESPACE@43..48 "\n    "
-      EXPR_STMT@48..54
-        PREFIX_EXPR@48..53
-          STAR@48..49 "*"
-          CALL_EXPR@49..53
-            PATH_EXPR@49..50
-              PATH@49..50
-                PATH_SEGMENT@49..50
-                  NAME_REF@49..50
-                    IDENT@49..50 "x"
-            ARG_LIST@50..53
-              L_PAREN@50..51 "("
-              LITERAL@51..52
-                INT_NUMBER@51..52 "1"
-              R_PAREN@52..53 ")"
-        SEMICOLON@53..54 ";"
-      WHITESPACE@54..59 "\n    "
-      EXPR_STMT@59..65
-        REF_EXPR@59..64
-          AMP@59..60 "&"
-          INDEX_EXPR@60..64
-            PATH_EXPR@60..61
-              PATH@60..61
-                PATH_SEGMENT@60..61
-                  NAME_REF@60..61
-                    IDENT@60..61 "x"
-            L_BRACK@61..62 "["
-            LITERAL@62..63
-              INT_NUMBER@62..63 "1"
-            R_BRACK@63..64 "]"
-        SEMICOLON@64..65 ";"
-      WHITESPACE@65..70 "\n    "
-      EXPR_STMT@70..76
-        RANGE_EXPR@70..75
-          PREFIX_EXPR@70..72
-            MINUS@70..71 "-"
-            LITERAL@71..72
-              INT_NUMBER@71..72 "1"
-          DOT2@72..74 ".."
-          LITERAL@74..75
-            INT_NUMBER@74..75 "2"
-        SEMICOLON@75..76 ";"
-      WHITESPACE@76..77 "\n"
-      R_CURLY@77..78 "}"
+      STMT_LIST@9..78
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..27
+          BIN_EXPR@15..26
+            BIN_EXPR@15..22
+              LITERAL@15..16
+                INT_NUMBER@15..16 "1"
+              WHITESPACE@16..17 " "
+              PLUS@17..18 "+"
+              WHITESPACE@18..19 " "
+              PREFIX_EXPR@19..22
+                STAR@19..20 "*"
+                REF_EXPR@20..22
+                  AMP@20..21 "&"
+                  LITERAL@21..22
+                    INT_NUMBER@21..22 "2"
+            WHITESPACE@22..23 " "
+            PLUS@23..24 "+"
+            WHITESPACE@24..25 " "
+            LITERAL@25..26
+              INT_NUMBER@25..26 "3"
+          SEMICOLON@26..27 ";"
+        WHITESPACE@27..32 "\n    "
+        EXPR_STMT@32..43
+          CAST_EXPR@32..42
+            PREFIX_EXPR@32..35
+              STAR@32..33 "*"
+              REF_EXPR@33..35
+                AMP@33..34 "&"
+                LITERAL@34..35
+                  INT_NUMBER@34..35 "1"
+            WHITESPACE@35..36 " "
+            AS_KW@36..38 "as"
+            WHITESPACE@38..39 " "
+            PATH_TYPE@39..42
+              PATH@39..42
+                PATH_SEGMENT@39..42
+                  NAME_REF@39..42
+                    IDENT@39..42 "u64"
+          SEMICOLON@42..43 ";"
+        WHITESPACE@43..48 "\n    "
+        EXPR_STMT@48..54
+          PREFIX_EXPR@48..53
+            STAR@48..49 "*"
+            CALL_EXPR@49..53
+              PATH_EXPR@49..50
+                PATH@49..50
+                  PATH_SEGMENT@49..50
+                    NAME_REF@49..50
+                      IDENT@49..50 "x"
+              ARG_LIST@50..53
+                L_PAREN@50..51 "("
+                LITERAL@51..52
+                  INT_NUMBER@51..52 "1"
+                R_PAREN@52..53 ")"
+          SEMICOLON@53..54 ";"
+        WHITESPACE@54..59 "\n    "
+        EXPR_STMT@59..65
+          REF_EXPR@59..64
+            AMP@59..60 "&"
+            INDEX_EXPR@60..64
+              PATH_EXPR@60..61
+                PATH@60..61
+                  PATH_SEGMENT@60..61
+                    NAME_REF@60..61
+                      IDENT@60..61 "x"
+              L_BRACK@61..62 "["
+              LITERAL@62..63
+                INT_NUMBER@62..63 "1"
+              R_BRACK@63..64 "]"
+          SEMICOLON@64..65 ";"
+        WHITESPACE@65..70 "\n    "
+        EXPR_STMT@70..76
+          RANGE_EXPR@70..75
+            PREFIX_EXPR@70..72
+              MINUS@70..71 "-"
+              LITERAL@71..72
+                INT_NUMBER@71..72 "1"
+            DOT2@72..74 ".."
+            LITERAL@74..75
+              INT_NUMBER@74..75 "2"
+          SEMICOLON@75..76 ";"
+        WHITESPACE@76..77 "\n"
+        R_CURLY@77..78 "}"
   WHITESPACE@78..79 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0059_loops_in_parens.rast b/crates/syntax/test_data/parser/ok/0059_loops_in_parens.rast
index 213f7b3815a..0cb1ccf044a 100644
--- a/crates/syntax/test_data/parser/ok/0059_loops_in_parens.rast
+++ b/crates/syntax/test_data/parser/ok/0059_loops_in_parens.rast
@@ -9,89 +9,93 @@ SOURCE_FILE@0..105
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..104
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      EXPR_STMT@16..50
-        CALL_EXPR@16..49
-          PATH_EXPR@16..20
-            PATH@16..20
-              PATH_SEGMENT@16..20
-                NAME_REF@16..20
-                  IDENT@16..20 "Some"
-          ARG_LIST@20..49
-            L_PAREN@20..21 "("
-            FOR_EXPR@21..48
-              FOR_KW@21..24 "for"
-              WHITESPACE@24..25 " "
-              WILDCARD_PAT@25..26
-                UNDERSCORE@25..26 "_"
-              WHITESPACE@26..27 " "
-              IN_KW@27..29 "in"
-              WHITESPACE@29..30 " "
-              METHOD_CALL_EXPR@30..45
-                ARRAY_EXPR@30..33
-                  L_BRACK@30..31 "["
-                  LITERAL@31..32
-                    INT_NUMBER@31..32 "1"
-                  R_BRACK@32..33 "]"
-                DOT@33..34 "."
-                NAME_REF@34..43
-                  IDENT@34..43 "into_iter"
-                ARG_LIST@43..45
-                  L_PAREN@43..44 "("
-                  R_PAREN@44..45 ")"
-              WHITESPACE@45..46 " "
-              BLOCK_EXPR@46..48
-                L_CURLY@46..47 "{"
-                R_CURLY@47..48 "}"
-            R_PAREN@48..49 ")"
-        SEMICOLON@49..50 ";"
-      WHITESPACE@50..55 "\n    "
-      EXPR_STMT@55..77
-        CALL_EXPR@55..76
-          PATH_EXPR@55..59
-            PATH@55..59
-              PATH_SEGMENT@55..59
-                NAME_REF@55..59
-                  IDENT@55..59 "Some"
-          ARG_LIST@59..76
-            L_PAREN@59..60 "("
-            LOOP_EXPR@60..75
-              LOOP_KW@60..64 "loop"
-              WHITESPACE@64..65 " "
-              BLOCK_EXPR@65..75
-                L_CURLY@65..66 "{"
-                WHITESPACE@66..67 " "
-                EXPR_STMT@67..73
-                  BREAK_EXPR@67..72
-                    BREAK_KW@67..72 "break"
-                  SEMICOLON@72..73 ";"
-                WHITESPACE@73..74 " "
-                R_CURLY@74..75 "}"
-            R_PAREN@75..76 ")"
-        SEMICOLON@76..77 ";"
-      WHITESPACE@77..82 "\n    "
-      EXPR_STMT@82..102
-        CALL_EXPR@82..101
-          PATH_EXPR@82..86
-            PATH@82..86
-              PATH_SEGMENT@82..86
-                NAME_REF@82..86
-                  IDENT@82..86 "Some"
-          ARG_LIST@86..101
-            L_PAREN@86..87 "("
-            WHILE_EXPR@87..100
-              WHILE_KW@87..92 "while"
-              WHITESPACE@92..93 " "
-              CONDITION@93..97
-                LITERAL@93..97
-                  TRUE_KW@93..97 "true"
-              WHITESPACE@97..98 " "
-              BLOCK_EXPR@98..100
-                L_CURLY@98..99 "{"
-                R_CURLY@99..100 "}"
-            R_PAREN@100..101 ")"
-        SEMICOLON@101..102 ";"
-      WHITESPACE@102..103 "\n"
-      R_CURLY@103..104 "}"
+      STMT_LIST@10..104
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        EXPR_STMT@16..50
+          CALL_EXPR@16..49
+            PATH_EXPR@16..20
+              PATH@16..20
+                PATH_SEGMENT@16..20
+                  NAME_REF@16..20
+                    IDENT@16..20 "Some"
+            ARG_LIST@20..49
+              L_PAREN@20..21 "("
+              FOR_EXPR@21..48
+                FOR_KW@21..24 "for"
+                WHITESPACE@24..25 " "
+                WILDCARD_PAT@25..26
+                  UNDERSCORE@25..26 "_"
+                WHITESPACE@26..27 " "
+                IN_KW@27..29 "in"
+                WHITESPACE@29..30 " "
+                METHOD_CALL_EXPR@30..45
+                  ARRAY_EXPR@30..33
+                    L_BRACK@30..31 "["
+                    LITERAL@31..32
+                      INT_NUMBER@31..32 "1"
+                    R_BRACK@32..33 "]"
+                  DOT@33..34 "."
+                  NAME_REF@34..43
+                    IDENT@34..43 "into_iter"
+                  ARG_LIST@43..45
+                    L_PAREN@43..44 "("
+                    R_PAREN@44..45 ")"
+                WHITESPACE@45..46 " "
+                BLOCK_EXPR@46..48
+                  STMT_LIST@46..48
+                    L_CURLY@46..47 "{"
+                    R_CURLY@47..48 "}"
+              R_PAREN@48..49 ")"
+          SEMICOLON@49..50 ";"
+        WHITESPACE@50..55 "\n    "
+        EXPR_STMT@55..77
+          CALL_EXPR@55..76
+            PATH_EXPR@55..59
+              PATH@55..59
+                PATH_SEGMENT@55..59
+                  NAME_REF@55..59
+                    IDENT@55..59 "Some"
+            ARG_LIST@59..76
+              L_PAREN@59..60 "("
+              LOOP_EXPR@60..75
+                LOOP_KW@60..64 "loop"
+                WHITESPACE@64..65 " "
+                BLOCK_EXPR@65..75
+                  STMT_LIST@65..75
+                    L_CURLY@65..66 "{"
+                    WHITESPACE@66..67 " "
+                    EXPR_STMT@67..73
+                      BREAK_EXPR@67..72
+                        BREAK_KW@67..72 "break"
+                      SEMICOLON@72..73 ";"
+                    WHITESPACE@73..74 " "
+                    R_CURLY@74..75 "}"
+              R_PAREN@75..76 ")"
+          SEMICOLON@76..77 ";"
+        WHITESPACE@77..82 "\n    "
+        EXPR_STMT@82..102
+          CALL_EXPR@82..101
+            PATH_EXPR@82..86
+              PATH@82..86
+                PATH_SEGMENT@82..86
+                  NAME_REF@82..86
+                    IDENT@82..86 "Some"
+            ARG_LIST@86..101
+              L_PAREN@86..87 "("
+              WHILE_EXPR@87..100
+                WHILE_KW@87..92 "while"
+                WHITESPACE@92..93 " "
+                CONDITION@93..97
+                  LITERAL@93..97
+                    TRUE_KW@93..97 "true"
+                WHITESPACE@97..98 " "
+                BLOCK_EXPR@98..100
+                  STMT_LIST@98..100
+                    L_CURLY@98..99 "{"
+                    R_CURLY@99..100 "}"
+              R_PAREN@100..101 ")"
+          SEMICOLON@101..102 ";"
+        WHITESPACE@102..103 "\n"
+        R_CURLY@103..104 "}"
   WHITESPACE@104..105 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0060_as_range.rast b/crates/syntax/test_data/parser/ok/0060_as_range.rast
index 1fd1a288845..f6921085059 100644
--- a/crates/syntax/test_data/parser/ok/0060_as_range.rast
+++ b/crates/syntax/test_data/parser/ok/0060_as_range.rast
@@ -9,47 +9,48 @@ SOURCE_FILE@0..56
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..55
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      EXPR_STMT@16..30
-        RANGE_EXPR@16..29
-          CAST_EXPR@16..26
-            LITERAL@16..17
-              INT_NUMBER@16..17 "0"
-            WHITESPACE@17..18 " "
-            AS_KW@18..20 "as"
-            WHITESPACE@20..21 " "
-            PATH_TYPE@21..26
-              PATH@21..26
-                PATH_SEGMENT@21..26
-                  NAME_REF@21..26
-                    IDENT@21..26 "usize"
-          WHITESPACE@26..27 " "
-          DOT2@27..29 ".."
-        SEMICOLON@29..30 ";"
-      WHITESPACE@30..35 "\n    "
-      EXPR_STMT@35..53
-        RANGE_EXPR@35..52
-          BIN_EXPR@35..49
-            LITERAL@35..36
-              INT_NUMBER@35..36 "1"
-            WHITESPACE@36..37 " "
-            PLUS@37..38 "+"
-            WHITESPACE@38..39 " "
-            CAST_EXPR@39..49
-              LITERAL@39..40
-                INT_NUMBER@39..40 "2"
-              WHITESPACE@40..41 " "
-              AS_KW@41..43 "as"
-              WHITESPACE@43..44 " "
-              PATH_TYPE@44..49
-                PATH@44..49
-                  PATH_SEGMENT@44..49
-                    NAME_REF@44..49
-                      IDENT@44..49 "usize"
-          WHITESPACE@49..50 " "
-          DOT2@50..52 ".."
-        SEMICOLON@52..53 ";"
-      WHITESPACE@53..54 "\n"
-      R_CURLY@54..55 "}"
+      STMT_LIST@10..55
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        EXPR_STMT@16..30
+          RANGE_EXPR@16..29
+            CAST_EXPR@16..26
+              LITERAL@16..17
+                INT_NUMBER@16..17 "0"
+              WHITESPACE@17..18 " "
+              AS_KW@18..20 "as"
+              WHITESPACE@20..21 " "
+              PATH_TYPE@21..26
+                PATH@21..26
+                  PATH_SEGMENT@21..26
+                    NAME_REF@21..26
+                      IDENT@21..26 "usize"
+            WHITESPACE@26..27 " "
+            DOT2@27..29 ".."
+          SEMICOLON@29..30 ";"
+        WHITESPACE@30..35 "\n    "
+        EXPR_STMT@35..53
+          RANGE_EXPR@35..52
+            BIN_EXPR@35..49
+              LITERAL@35..36
+                INT_NUMBER@35..36 "1"
+              WHITESPACE@36..37 " "
+              PLUS@37..38 "+"
+              WHITESPACE@38..39 " "
+              CAST_EXPR@39..49
+                LITERAL@39..40
+                  INT_NUMBER@39..40 "2"
+                WHITESPACE@40..41 " "
+                AS_KW@41..43 "as"
+                WHITESPACE@43..44 " "
+                PATH_TYPE@44..49
+                  PATH@44..49
+                    PATH_SEGMENT@44..49
+                      NAME_REF@44..49
+                        IDENT@44..49 "usize"
+            WHITESPACE@49..50 " "
+            DOT2@50..52 ".."
+          SEMICOLON@52..53 ";"
+        WHITESPACE@53..54 "\n"
+        R_CURLY@54..55 "}"
   WHITESPACE@55..56 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0061_match_full_range.rast b/crates/syntax/test_data/parser/ok/0061_match_full_range.rast
index ba49c115b5a..bcc8732c973 100644
--- a/crates/syntax/test_data/parser/ok/0061_match_full_range.rast
+++ b/crates/syntax/test_data/parser/ok/0061_match_full_range.rast
@@ -9,18 +9,19 @@ SOURCE_FILE@0..35
       R_PAREN@8..9 ")"
     WHITESPACE@9..10 " "
     BLOCK_EXPR@10..34
-      L_CURLY@10..11 "{"
-      WHITESPACE@11..16 "\n    "
-      MATCH_EXPR@16..32
-        MATCH_KW@16..21 "match"
-        WHITESPACE@21..22 " "
-        RANGE_EXPR@22..24
-          DOT2@22..24 ".."
-        WHITESPACE@24..25 " "
-        MATCH_ARM_LIST@25..32
-          L_CURLY@25..26 "{"
-          WHITESPACE@26..31 "\n    "
-          R_CURLY@31..32 "}"
-      WHITESPACE@32..33 "\n"
-      R_CURLY@33..34 "}"
+      STMT_LIST@10..34
+        L_CURLY@10..11 "{"
+        WHITESPACE@11..16 "\n    "
+        MATCH_EXPR@16..32
+          MATCH_KW@16..21 "match"
+          WHITESPACE@21..22 " "
+          RANGE_EXPR@22..24
+            DOT2@22..24 ".."
+          WHITESPACE@24..25 " "
+          MATCH_ARM_LIST@25..32
+            L_CURLY@25..26 "{"
+            WHITESPACE@26..31 "\n    "
+            R_CURLY@31..32 "}"
+        WHITESPACE@32..33 "\n"
+        R_CURLY@33..34 "}"
   WHITESPACE@34..35 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0062_macro_2.0.rast b/crates/syntax/test_data/parser/ok/0062_macro_2.0.rast
index e75848f0f86..80f331bec37 100644
--- a/crates/syntax/test_data/parser/ok/0062_macro_2.0.rast
+++ b/crates/syntax/test_data/parser/ok/0062_macro_2.0.rast
@@ -71,106 +71,107 @@ SOURCE_FILE@0..349
       R_PAREN@126..127 ")"
     WHITESPACE@127..128 " "
     BLOCK_EXPR@128..348
-      L_CURLY@128..129 "{"
-      WHITESPACE@129..134 "\n    "
-      MACRO_DEF@134..346
-        MACRO_KW@134..139 "macro"
-        WHITESPACE@139..140 " "
-        NAME@140..150
-          IDENT@140..150 "test_merge"
-        TOKEN_TREE@150..346
-          TOKEN_TREE@150..203
-            L_PAREN@150..151 "("
-            TOKEN_TREE@151..175
-              L_BRACK@151..152 "["
-              DOLLAR@152..153 "$"
-              TOKEN_TREE@153..166
-                L_PAREN@153..154 "("
-                DOLLAR@154..155 "$"
-                IDENT@155..160 "input"
-                COLON@160..161 ":"
-                IDENT@161..165 "expr"
-                R_PAREN@165..166 ")"
-              COMMA@166..167 ","
-              STAR@167..168 "*"
-              WHITESPACE@168..169 " "
-              DOLLAR@169..170 "$"
-              TOKEN_TREE@170..173
-                L_PAREN@170..171 "("
-                COMMA@171..172 ","
-                R_PAREN@172..173 ")"
-              STAR@173..174 "*"
-              R_BRACK@174..175 "]"
-            COMMA@175..176 ","
-            WHITESPACE@176..177 " "
-            TOKEN_TREE@177..202
-              L_BRACK@177..178 "["
-              DOLLAR@178..179 "$"
-              TOKEN_TREE@179..193
-                L_PAREN@179..180 "("
-                DOLLAR@180..181 "$"
-                IDENT@181..187 "output"
-                COLON@187..188 ":"
-                IDENT@188..192 "expr"
-                R_PAREN@192..193 ")"
-              COMMA@193..194 ","
-              STAR@194..195 "*"
-              WHITESPACE@195..196 " "
-              DOLLAR@196..197 "$"
-              TOKEN_TREE@197..200
-                L_PAREN@197..198 "("
-                COMMA@198..199 ","
-                R_PAREN@199..200 ")"
-              STAR@200..201 "*"
-              R_BRACK@201..202 "]"
-            R_PAREN@202..203 ")"
-          WHITESPACE@203..204 " "
-          TOKEN_TREE@204..346
-            L_CURLY@204..205 "{"
-            WHITESPACE@205..214 "\n        "
-            IDENT@214..223 "assert_eq"
-            BANG@223..224 "!"
-            TOKEN_TREE@224..339
-              L_PAREN@224..225 "("
-              WHITESPACE@225..238 "\n            "
-              IDENT@238..253 "merge_use_trees"
-              TOKEN_TREE@253..284
-                L_PAREN@253..254 "("
-                IDENT@254..269 "parse_use_trees"
-                BANG@269..270 "!"
-                TOKEN_TREE@270..283
-                  L_PAREN@270..271 "("
-                  DOLLAR@271..272 "$"
-                  TOKEN_TREE@272..281
-                    L_PAREN@272..273 "("
-                    DOLLAR@273..274 "$"
-                    IDENT@274..279 "input"
-                    COMMA@279..280 ","
-                    R_PAREN@280..281 ")"
-                  STAR@281..282 "*"
-                  R_PAREN@282..283 ")"
-                R_PAREN@283..284 ")"
-              COMMA@284..285 ","
-              WHITESPACE@285..298 "\n            "
-              IDENT@298..313 "parse_use_trees"
-              BANG@313..314 "!"
-              TOKEN_TREE@314..328
-                L_PAREN@314..315 "("
-                DOLLAR@315..316 "$"
-                TOKEN_TREE@316..326
-                  L_PAREN@316..317 "("
-                  DOLLAR@317..318 "$"
-                  IDENT@318..324 "output"
-                  COMMA@324..325 ","
-                  R_PAREN@325..326 ")"
-                STAR@326..327 "*"
-                R_PAREN@327..328 ")"
-              COMMA@328..329 ","
-              WHITESPACE@329..338 "\n        "
-              R_PAREN@338..339 ")"
-            SEMICOLON@339..340 ";"
-            WHITESPACE@340..345 "\n    "
-            R_CURLY@345..346 "}"
-      WHITESPACE@346..347 "\n"
-      R_CURLY@347..348 "}"
+      STMT_LIST@128..348
+        L_CURLY@128..129 "{"
+        WHITESPACE@129..134 "\n    "
+        MACRO_DEF@134..346
+          MACRO_KW@134..139 "macro"
+          WHITESPACE@139..140 " "
+          NAME@140..150
+            IDENT@140..150 "test_merge"
+          TOKEN_TREE@150..346
+            TOKEN_TREE@150..203
+              L_PAREN@150..151 "("
+              TOKEN_TREE@151..175
+                L_BRACK@151..152 "["
+                DOLLAR@152..153 "$"
+                TOKEN_TREE@153..166
+                  L_PAREN@153..154 "("
+                  DOLLAR@154..155 "$"
+                  IDENT@155..160 "input"
+                  COLON@160..161 ":"
+                  IDENT@161..165 "expr"
+                  R_PAREN@165..166 ")"
+                COMMA@166..167 ","
+                STAR@167..168 "*"
+                WHITESPACE@168..169 " "
+                DOLLAR@169..170 "$"
+                TOKEN_TREE@170..173
+                  L_PAREN@170..171 "("
+                  COMMA@171..172 ","
+                  R_PAREN@172..173 ")"
+                STAR@173..174 "*"
+                R_BRACK@174..175 "]"
+              COMMA@175..176 ","
+              WHITESPACE@176..177 " "
+              TOKEN_TREE@177..202
+                L_BRACK@177..178 "["
+                DOLLAR@178..179 "$"
+                TOKEN_TREE@179..193
+                  L_PAREN@179..180 "("
+                  DOLLAR@180..181 "$"
+                  IDENT@181..187 "output"
+                  COLON@187..188 ":"
+                  IDENT@188..192 "expr"
+                  R_PAREN@192..193 ")"
+                COMMA@193..194 ","
+                STAR@194..195 "*"
+                WHITESPACE@195..196 " "
+                DOLLAR@196..197 "$"
+                TOKEN_TREE@197..200
+                  L_PAREN@197..198 "("
+                  COMMA@198..199 ","
+                  R_PAREN@199..200 ")"
+                STAR@200..201 "*"
+                R_BRACK@201..202 "]"
+              R_PAREN@202..203 ")"
+            WHITESPACE@203..204 " "
+            TOKEN_TREE@204..346
+              L_CURLY@204..205 "{"
+              WHITESPACE@205..214 "\n        "
+              IDENT@214..223 "assert_eq"
+              BANG@223..224 "!"
+              TOKEN_TREE@224..339
+                L_PAREN@224..225 "("
+                WHITESPACE@225..238 "\n            "
+                IDENT@238..253 "merge_use_trees"
+                TOKEN_TREE@253..284
+                  L_PAREN@253..254 "("
+                  IDENT@254..269 "parse_use_trees"
+                  BANG@269..270 "!"
+                  TOKEN_TREE@270..283
+                    L_PAREN@270..271 "("
+                    DOLLAR@271..272 "$"
+                    TOKEN_TREE@272..281
+                      L_PAREN@272..273 "("
+                      DOLLAR@273..274 "$"
+                      IDENT@274..279 "input"
+                      COMMA@279..280 ","
+                      R_PAREN@280..281 ")"
+                    STAR@281..282 "*"
+                    R_PAREN@282..283 ")"
+                  R_PAREN@283..284 ")"
+                COMMA@284..285 ","
+                WHITESPACE@285..298 "\n            "
+                IDENT@298..313 "parse_use_trees"
+                BANG@313..314 "!"
+                TOKEN_TREE@314..328
+                  L_PAREN@314..315 "("
+                  DOLLAR@315..316 "$"
+                  TOKEN_TREE@316..326
+                    L_PAREN@316..317 "("
+                    DOLLAR@317..318 "$"
+                    IDENT@318..324 "output"
+                    COMMA@324..325 ","
+                    R_PAREN@325..326 ")"
+                  STAR@326..327 "*"
+                  R_PAREN@327..328 ")"
+                COMMA@328..329 ","
+                WHITESPACE@329..338 "\n        "
+                R_PAREN@338..339 ")"
+              SEMICOLON@339..340 ";"
+              WHITESPACE@340..345 "\n    "
+              R_CURLY@345..346 "}"
+        WHITESPACE@346..347 "\n"
+        R_CURLY@347..348 "}"
   WHITESPACE@348..349 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0063_trait_fn_patterns.rast b/crates/syntax/test_data/parser/ok/0063_trait_fn_patterns.rast
index 8eda5997627..979058d032f 100644
--- a/crates/syntax/test_data/parser/ok/0063_trait_fn_patterns.rast
+++ b/crates/syntax/test_data/parser/ok/0063_trait_fn_patterns.rast
@@ -47,8 +47,9 @@ SOURCE_FILE@0..170
           R_PAREN@42..43 ")"
         WHITESPACE@43..44 " "
         BLOCK_EXPR@44..46
-          L_CURLY@44..45 "{"
-          R_CURLY@45..46 "}"
+          STMT_LIST@44..46
+            L_CURLY@44..45 "{"
+            R_CURLY@45..46 "}"
       WHITESPACE@46..51 "\n    "
       FN@51..74
         FN_KW@51..53 "fn"
@@ -89,8 +90,9 @@ SOURCE_FILE@0..170
           R_PAREN@70..71 ")"
         WHITESPACE@71..72 " "
         BLOCK_EXPR@72..74
-          L_CURLY@72..73 "{"
-          R_CURLY@73..74 "}"
+          STMT_LIST@72..74
+            L_CURLY@72..73 "{"
+            R_CURLY@73..74 "}"
       WHITESPACE@74..79 "\n    "
       FN@79..108
         FN_KW@79..81 "fn"
@@ -120,8 +122,9 @@ SOURCE_FILE@0..170
           R_PAREN@104..105 ")"
         WHITESPACE@105..106 " "
         BLOCK_EXPR@106..108
-          L_CURLY@106..107 "{"
-          R_CURLY@107..108 "}"
+          STMT_LIST@106..108
+            L_CURLY@106..107 "{"
+            R_CURLY@107..108 "}"
       WHITESPACE@108..113 "\n    "
       FN@113..135
         FN_KW@113..115 "fn"
@@ -152,8 +155,9 @@ SOURCE_FILE@0..170
           R_PAREN@131..132 ")"
         WHITESPACE@132..133 " "
         BLOCK_EXPR@133..135
-          L_CURLY@133..134 "{"
-          R_CURLY@134..135 "}"
+          STMT_LIST@133..135
+            L_CURLY@133..134 "{"
+            R_CURLY@134..135 "}"
       WHITESPACE@135..140 "\n    "
       FN@140..167
         FN_KW@140..142 "fn"
diff --git a/crates/syntax/test_data/parser/ok/0064_impl_fn_params.rast b/crates/syntax/test_data/parser/ok/0064_impl_fn_params.rast
index a3c6ed82e15..dbfc2f92607 100644
--- a/crates/syntax/test_data/parser/ok/0064_impl_fn_params.rast
+++ b/crates/syntax/test_data/parser/ok/0064_impl_fn_params.rast
@@ -50,8 +50,9 @@ SOURCE_FILE@0..137
           R_PAREN@41..42 ")"
         WHITESPACE@42..43 " "
         BLOCK_EXPR@43..45
-          L_CURLY@43..44 "{"
-          R_CURLY@44..45 "}"
+          STMT_LIST@43..45
+            L_CURLY@43..44 "{"
+            R_CURLY@44..45 "}"
       WHITESPACE@45..50 "\n    "
       FN@50..73
         FN_KW@50..52 "fn"
@@ -92,8 +93,9 @@ SOURCE_FILE@0..137
           R_PAREN@69..70 ")"
         WHITESPACE@70..71 " "
         BLOCK_EXPR@71..73
-          L_CURLY@71..72 "{"
-          R_CURLY@72..73 "}"
+          STMT_LIST@71..73
+            L_CURLY@71..72 "{"
+            R_CURLY@72..73 "}"
       WHITESPACE@73..78 "\n    "
       FN@78..107
         FN_KW@78..80 "fn"
@@ -123,8 +125,9 @@ SOURCE_FILE@0..137
           R_PAREN@103..104 ")"
         WHITESPACE@104..105 " "
         BLOCK_EXPR@105..107
-          L_CURLY@105..106 "{"
-          R_CURLY@106..107 "}"
+          STMT_LIST@105..107
+            L_CURLY@105..106 "{"
+            R_CURLY@106..107 "}"
       WHITESPACE@107..112 "\n    "
       FN@112..134
         FN_KW@112..114 "fn"
@@ -155,8 +158,9 @@ SOURCE_FILE@0..137
           R_PAREN@130..131 ")"
         WHITESPACE@131..132 " "
         BLOCK_EXPR@132..134
-          L_CURLY@132..133 "{"
-          R_CURLY@133..134 "}"
+          STMT_LIST@132..134
+            L_CURLY@132..133 "{"
+            R_CURLY@133..134 "}"
       WHITESPACE@134..135 "\n"
       R_CURLY@135..136 "}"
   WHITESPACE@136..137 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0065_comment_newline.rast b/crates/syntax/test_data/parser/ok/0065_comment_newline.rast
index 29bd38c051f..162830d95f3 100644
--- a/crates/syntax/test_data/parser/ok/0065_comment_newline.rast
+++ b/crates/syntax/test_data/parser/ok/0065_comment_newline.rast
@@ -11,6 +11,7 @@ SOURCE_FILE@0..26
       R_PAREN@21..22 ")"
     WHITESPACE@22..23 " "
     BLOCK_EXPR@23..25
-      L_CURLY@23..24 "{"
-      R_CURLY@24..25 "}"
+      STMT_LIST@23..25
+        L_CURLY@23..24 "{"
+        R_CURLY@24..25 "}"
   WHITESPACE@25..26 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0065_plus_after_fn_trait_bound.rast b/crates/syntax/test_data/parser/ok/0065_plus_after_fn_trait_bound.rast
index 2c699ffcb6f..9efa6ec0b6a 100644
--- a/crates/syntax/test_data/parser/ok/0065_plus_after_fn_trait_bound.rast
+++ b/crates/syntax/test_data/parser/ok/0065_plus_after_fn_trait_bound.rast
@@ -55,6 +55,7 @@ SOURCE_FILE@0..40
                     IDENT@32..36 "Send"
     WHITESPACE@36..37 " "
     BLOCK_EXPR@37..39
-      L_CURLY@37..38 "{"
-      R_CURLY@38..39 "}"
+      STMT_LIST@37..39
+        L_CURLY@37..38 "{"
+        R_CURLY@38..39 "}"
   WHITESPACE@39..40 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0066_default_modifier.rast b/crates/syntax/test_data/parser/ok/0066_default_modifier.rast
index e9b57ec3b3f..0479c5f60f5 100644
--- a/crates/syntax/test_data/parser/ok/0066_default_modifier.rast
+++ b/crates/syntax/test_data/parser/ok/0066_default_modifier.rast
@@ -58,8 +58,9 @@ SOURCE_FILE@0..294
           R_PAREN@78..79 ")"
         WHITESPACE@79..80 " "
         BLOCK_EXPR@80..82
-          L_CURLY@80..81 "{"
-          R_CURLY@81..82 "}"
+          STMT_LIST@80..82
+            L_CURLY@80..81 "{"
+            R_CURLY@81..82 "}"
       WHITESPACE@82..85 "\n  "
       FN@85..111
         DEFAULT_KW@85..92 "default"
@@ -75,8 +76,9 @@ SOURCE_FILE@0..294
           R_PAREN@107..108 ")"
         WHITESPACE@108..109 " "
         BLOCK_EXPR@109..111
-          L_CURLY@109..110 "{"
-          R_CURLY@110..111 "}"
+          STMT_LIST@109..111
+            L_CURLY@109..110 "{"
+            R_CURLY@110..111 "}"
       WHITESPACE@111..112 "\n"
       R_CURLY@112..113 "}"
   WHITESPACE@113..115 "\n\n"
@@ -150,8 +152,9 @@ SOURCE_FILE@0..294
           R_PAREN@200..201 ")"
         WHITESPACE@201..202 " "
         BLOCK_EXPR@202..204
-          L_CURLY@202..203 "{"
-          R_CURLY@203..204 "}"
+          STMT_LIST@202..204
+            L_CURLY@202..203 "{"
+            R_CURLY@203..204 "}"
       WHITESPACE@204..207 "\n  "
       FN@207..233
         DEFAULT_KW@207..214 "default"
@@ -167,8 +170,9 @@ SOURCE_FILE@0..294
           R_PAREN@229..230 ")"
         WHITESPACE@230..231 " "
         BLOCK_EXPR@231..233
-          L_CURLY@231..232 "{"
-          R_CURLY@232..233 "}"
+          STMT_LIST@231..233
+            L_CURLY@231..232 "{"
+            R_CURLY@232..233 "}"
       WHITESPACE@233..234 "\n"
       R_CURLY@234..235 "}"
   WHITESPACE@235..237 "\n\n"
diff --git a/crates/syntax/test_data/parser/ok/0067_where_for_pred.rast b/crates/syntax/test_data/parser/ok/0067_where_for_pred.rast
index 79e2b28678c..d1bf63d507b 100644
--- a/crates/syntax/test_data/parser/ok/0067_where_for_pred.rast
+++ b/crates/syntax/test_data/parser/ok/0067_where_for_pred.rast
@@ -57,9 +57,10 @@ SOURCE_FILE@0..374
       COMMA@50..51 ","
     WHITESPACE@51..52 "\n"
     BLOCK_EXPR@52..55
-      L_CURLY@52..53 "{"
-      WHITESPACE@53..54 "\n"
-      R_CURLY@54..55 "}"
+      STMT_LIST@52..55
+        L_CURLY@52..53 "{"
+        WHITESPACE@53..54 "\n"
+        R_CURLY@54..55 "}"
   WHITESPACE@55..56 "\n"
   FN@56..107
     FN_KW@56..58 "fn"
@@ -110,9 +111,10 @@ SOURCE_FILE@0..374
       COMMA@102..103 ","
     WHITESPACE@103..104 "\n"
     BLOCK_EXPR@104..107
-      L_CURLY@104..105 "{"
-      WHITESPACE@105..106 "\n"
-      R_CURLY@106..107 "}"
+      STMT_LIST@104..107
+        L_CURLY@104..105 "{"
+        WHITESPACE@105..106 "\n"
+        R_CURLY@106..107 "}"
   WHITESPACE@107..108 "\n"
   FN@108..170
     FN_KW@108..110 "fn"
@@ -180,9 +182,10 @@ SOURCE_FILE@0..374
       COMMA@165..166 ","
     WHITESPACE@166..167 "\n"
     BLOCK_EXPR@167..170
-      L_CURLY@167..168 "{"
-      WHITESPACE@168..169 "\n"
-      R_CURLY@169..170 "}"
+      STMT_LIST@167..170
+        L_CURLY@167..168 "{"
+        WHITESPACE@168..169 "\n"
+        R_CURLY@169..170 "}"
   WHITESPACE@170..171 "\n"
   FN@171..223
     FN_KW@171..173 "fn"
@@ -236,9 +239,10 @@ SOURCE_FILE@0..374
       COMMA@218..219 ","
     WHITESPACE@219..220 "\n"
     BLOCK_EXPR@220..223
-      L_CURLY@220..221 "{"
-      WHITESPACE@221..222 "\n"
-      R_CURLY@222..223 "}"
+      STMT_LIST@220..223
+        L_CURLY@220..221 "{"
+        WHITESPACE@221..222 "\n"
+        R_CURLY@222..223 "}"
   WHITESPACE@223..224 "\n"
   FN@224..300
     FN_KW@224..226 "fn"
@@ -320,9 +324,10 @@ SOURCE_FILE@0..374
       COMMA@295..296 ","
     WHITESPACE@296..297 "\n"
     BLOCK_EXPR@297..300
-      L_CURLY@297..298 "{"
-      WHITESPACE@298..299 "\n"
-      R_CURLY@299..300 "}"
+      STMT_LIST@297..300
+        L_CURLY@297..298 "{"
+        WHITESPACE@298..299 "\n"
+        R_CURLY@299..300 "}"
   WHITESPACE@300..301 "\n"
   FN@301..373
     FN_KW@301..303 "fn"
@@ -401,7 +406,8 @@ SOURCE_FILE@0..374
       COMMA@368..369 ","
     WHITESPACE@369..370 "\n"
     BLOCK_EXPR@370..373
-      L_CURLY@370..371 "{"
-      WHITESPACE@371..372 "\n"
-      R_CURLY@372..373 "}"
+      STMT_LIST@370..373
+        L_CURLY@370..371 "{"
+        WHITESPACE@371..372 "\n"
+        R_CURLY@372..373 "}"
   WHITESPACE@373..374 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0068_item_modifiers.rast b/crates/syntax/test_data/parser/ok/0068_item_modifiers.rast
index 87eebf18574..8b635d0a037 100644
--- a/crates/syntax/test_data/parser/ok/0068_item_modifiers.rast
+++ b/crates/syntax/test_data/parser/ok/0068_item_modifiers.rast
@@ -11,8 +11,9 @@ SOURCE_FILE@0..328
       R_PAREN@13..14 ")"
     WHITESPACE@14..15 " "
     BLOCK_EXPR@15..17
-      L_CURLY@15..16 "{"
-      R_CURLY@16..17 "}"
+      STMT_LIST@15..17
+        L_CURLY@15..16 "{"
+        R_CURLY@16..17 "}"
   WHITESPACE@17..18 "\n"
   FN@18..36
     ABI@18..24
@@ -27,8 +28,9 @@ SOURCE_FILE@0..328
       R_PAREN@32..33 ")"
     WHITESPACE@33..34 " "
     BLOCK_EXPR@34..36
-      L_CURLY@34..35 "{"
-      R_CURLY@35..36 "}"
+      STMT_LIST@34..36
+        L_CURLY@34..35 "{"
+        R_CURLY@35..36 "}"
   WHITESPACE@36..37 "\n"
   FN@37..54
     CONST_KW@37..42 "const"
@@ -42,8 +44,9 @@ SOURCE_FILE@0..328
       R_PAREN@50..51 ")"
     WHITESPACE@51..52 " "
     BLOCK_EXPR@52..54
-      L_CURLY@52..53 "{"
-      R_CURLY@53..54 "}"
+      STMT_LIST@52..54
+        L_CURLY@52..53 "{"
+        R_CURLY@53..54 "}"
   WHITESPACE@54..55 "\n"
   FN@55..79
     CONST_KW@55..60 "const"
@@ -59,8 +62,9 @@ SOURCE_FILE@0..328
       R_PAREN@75..76 ")"
     WHITESPACE@76..77 " "
     BLOCK_EXPR@77..79
-      L_CURLY@77..78 "{"
-      R_CURLY@78..79 "}"
+      STMT_LIST@77..79
+        L_CURLY@77..78 "{"
+        R_CURLY@78..79 "}"
   WHITESPACE@79..80 "\n"
   FN@80..109
     UNSAFE_KW@80..86 "unsafe"
@@ -79,8 +83,9 @@ SOURCE_FILE@0..328
       R_PAREN@105..106 ")"
     WHITESPACE@106..107 " "
     BLOCK_EXPR@107..109
-      L_CURLY@107..108 "{"
-      R_CURLY@108..109 "}"
+      STMT_LIST@107..109
+        L_CURLY@107..108 "{"
+        R_CURLY@108..109 "}"
   WHITESPACE@109..110 "\n"
   FN@110..128
     UNSAFE_KW@110..116 "unsafe"
@@ -94,8 +99,9 @@ SOURCE_FILE@0..328
       R_PAREN@124..125 ")"
     WHITESPACE@125..126 " "
     BLOCK_EXPR@126..128
-      L_CURLY@126..127 "{"
-      R_CURLY@127..128 "}"
+      STMT_LIST@126..128
+        L_CURLY@126..127 "{"
+        R_CURLY@127..128 "}"
   WHITESPACE@128..129 "\n"
   FN@129..153
     ASYNC_KW@129..134 "async"
@@ -111,8 +117,9 @@ SOURCE_FILE@0..328
       R_PAREN@149..150 ")"
     WHITESPACE@150..151 " "
     BLOCK_EXPR@151..153
-      L_CURLY@151..152 "{"
-      R_CURLY@152..153 "}"
+      STMT_LIST@151..153
+        L_CURLY@151..152 "{"
+        R_CURLY@152..153 "}"
   WHITESPACE@153..154 "\n"
   FN@154..178
     CONST_KW@154..159 "const"
@@ -128,8 +135,9 @@ SOURCE_FILE@0..328
       R_PAREN@174..175 ")"
     WHITESPACE@175..176 " "
     BLOCK_EXPR@176..178
-      L_CURLY@176..177 "{"
-      R_CURLY@177..178 "}"
+      STMT_LIST@176..178
+        L_CURLY@176..177 "{"
+        R_CURLY@177..178 "}"
   WHITESPACE@178..180 "\n\n"
   TRAIT@180..197
     UNSAFE_KW@180..186 "unsafe"
diff --git a/crates/syntax/test_data/parser/ok/0069_multi_trait_object.rast b/crates/syntax/test_data/parser/ok/0069_multi_trait_object.rast
index 026c776e296..7967b88f200 100644
--- a/crates/syntax/test_data/parser/ok/0069_multi_trait_object.rast
+++ b/crates/syntax/test_data/parser/ok/0069_multi_trait_object.rast
@@ -126,78 +126,79 @@ SOURCE_FILE@0..195
       R_PAREN@124..125 ")"
     WHITESPACE@125..126 " "
     BLOCK_EXPR@126..194
-      L_CURLY@126..127 "{"
-      WHITESPACE@127..132 "\n    "
-      LET_STMT@132..192
-        LET_KW@132..135 "let"
-        WHITESPACE@135..136 " "
-        IDENT_PAT@136..137
-          NAME@136..137
-            IDENT@136..137 "b"
-        WHITESPACE@137..138 " "
-        EQ@138..139 "="
-        WHITESPACE@139..140 " "
-        CAST_EXPR@140..191
-          PAREN_EXPR@140..144
-            L_PAREN@140..141 "("
-            REF_EXPR@141..143
-              AMP@141..142 "&"
-              PATH_EXPR@142..143
-                PATH@142..143
-                  PATH_SEGMENT@142..143
-                    NAME_REF@142..143
-                      IDENT@142..143 "a"
-            R_PAREN@143..144 ")"
-          WHITESPACE@144..145 " "
-          AS_KW@145..147 "as"
-          WHITESPACE@147..148 " "
-          REF_TYPE@148..191
-            AMP@148..149 "&"
-            PAREN_TYPE@149..191
-              L_PAREN@149..150 "("
-              DYN_TRAIT_TYPE@150..190
-                DYN_KW@150..153 "dyn"
-                WHITESPACE@153..154 " "
-                TYPE_BOUND_LIST@154..190
-                  TYPE_BOUND@154..182
-                    PATH_TYPE@154..182
-                      PATH@154..182
-                        PATH_SEGMENT@154..182
-                          NAME_REF@154..157
-                            IDENT@154..157 "Add"
-                          GENERIC_ARG_LIST@157..182
-                            L_ANGLE@157..158 "<"
-                            TYPE_ARG@158..163
-                              PATH_TYPE@158..163
-                                PATH@158..163
-                                  PATH_SEGMENT@158..163
-                                    NAME_REF@158..163
-                                      IDENT@158..163 "Other"
-                            COMMA@163..164 ","
-                            WHITESPACE@164..165 " "
-                            ASSOC_TYPE_ARG@165..181
-                              NAME_REF@165..171
-                                IDENT@165..171 "Output"
-                              WHITESPACE@171..172 " "
-                              EQ@172..173 "="
-                              WHITESPACE@173..174 " "
-                              PATH_TYPE@174..181
-                                PATH@174..181
-                                  PATH_SEGMENT@174..181
-                                    NAME_REF@174..181
-                                      IDENT@174..181 "Addable"
-                            R_ANGLE@181..182 ">"
-                  WHITESPACE@182..183 " "
-                  PLUS@183..184 "+"
-                  WHITESPACE@184..185 " "
-                  TYPE_BOUND@185..190
-                    PATH_TYPE@185..190
-                      PATH@185..190
-                        PATH_SEGMENT@185..190
-                          NAME_REF@185..190
-                            IDENT@185..190 "Other"
-              R_PAREN@190..191 ")"
-        SEMICOLON@191..192 ";"
-      WHITESPACE@192..193 "\n"
-      R_CURLY@193..194 "}"
+      STMT_LIST@126..194
+        L_CURLY@126..127 "{"
+        WHITESPACE@127..132 "\n    "
+        LET_STMT@132..192
+          LET_KW@132..135 "let"
+          WHITESPACE@135..136 " "
+          IDENT_PAT@136..137
+            NAME@136..137
+              IDENT@136..137 "b"
+          WHITESPACE@137..138 " "
+          EQ@138..139 "="
+          WHITESPACE@139..140 " "
+          CAST_EXPR@140..191
+            PAREN_EXPR@140..144
+              L_PAREN@140..141 "("
+              REF_EXPR@141..143
+                AMP@141..142 "&"
+                PATH_EXPR@142..143
+                  PATH@142..143
+                    PATH_SEGMENT@142..143
+                      NAME_REF@142..143
+                        IDENT@142..143 "a"
+              R_PAREN@143..144 ")"
+            WHITESPACE@144..145 " "
+            AS_KW@145..147 "as"
+            WHITESPACE@147..148 " "
+            REF_TYPE@148..191
+              AMP@148..149 "&"
+              PAREN_TYPE@149..191
+                L_PAREN@149..150 "("
+                DYN_TRAIT_TYPE@150..190
+                  DYN_KW@150..153 "dyn"
+                  WHITESPACE@153..154 " "
+                  TYPE_BOUND_LIST@154..190
+                    TYPE_BOUND@154..182
+                      PATH_TYPE@154..182
+                        PATH@154..182
+                          PATH_SEGMENT@154..182
+                            NAME_REF@154..157
+                              IDENT@154..157 "Add"
+                            GENERIC_ARG_LIST@157..182
+                              L_ANGLE@157..158 "<"
+                              TYPE_ARG@158..163
+                                PATH_TYPE@158..163
+                                  PATH@158..163
+                                    PATH_SEGMENT@158..163
+                                      NAME_REF@158..163
+                                        IDENT@158..163 "Other"
+                              COMMA@163..164 ","
+                              WHITESPACE@164..165 " "
+                              ASSOC_TYPE_ARG@165..181
+                                NAME_REF@165..171
+                                  IDENT@165..171 "Output"
+                                WHITESPACE@171..172 " "
+                                EQ@172..173 "="
+                                WHITESPACE@173..174 " "
+                                PATH_TYPE@174..181
+                                  PATH@174..181
+                                    PATH_SEGMENT@174..181
+                                      NAME_REF@174..181
+                                        IDENT@174..181 "Addable"
+                              R_ANGLE@181..182 ">"
+                    WHITESPACE@182..183 " "
+                    PLUS@183..184 "+"
+                    WHITESPACE@184..185 " "
+                    TYPE_BOUND@185..190
+                      PATH_TYPE@185..190
+                        PATH@185..190
+                          PATH_SEGMENT@185..190
+                            NAME_REF@185..190
+                              IDENT@185..190 "Other"
+                R_PAREN@190..191 ")"
+          SEMICOLON@191..192 ";"
+        WHITESPACE@192..193 "\n"
+        R_CURLY@193..194 "}"
   WHITESPACE@194..195 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0070_expr_attr_placement.rast b/crates/syntax/test_data/parser/ok/0070_expr_attr_placement.rast
index 925fa4cbf6c..b52161a401e 100644
--- a/crates/syntax/test_data/parser/ok/0070_expr_attr_placement.rast
+++ b/crates/syntax/test_data/parser/ok/0070_expr_attr_placement.rast
@@ -9,50 +9,51 @@ SOURCE_FILE@0..44
       R_PAREN@5..6 ")"
     WHITESPACE@6..7 " "
     BLOCK_EXPR@7..43
-      L_CURLY@7..8 "{"
-      WHITESPACE@8..13 "\n    "
-      PAREN_EXPR@13..41
-        L_PAREN@13..14 "("
-        BIN_EXPR@14..40
-          TRY_EXPR@14..23
-            ATTR@14..18
-              POUND@14..15 "#"
-              L_BRACK@15..16 "["
-              META@16..17
-                PATH@16..17
-                  PATH_SEGMENT@16..17
-                    NAME_REF@16..17
-                      IDENT@16..17 "a"
-              R_BRACK@17..18 "]"
-            WHITESPACE@18..19 " "
-            PATH_EXPR@19..22
-              PATH@19..22
-                PATH_SEGMENT@19..22
-                  NAME_REF@19..22
-                    IDENT@19..22 "lhs"
-            QUESTION@22..23 "?"
-          WHITESPACE@23..24 " "
-          PLUS@24..25 "+"
-          WHITESPACE@25..26 " "
-          AWAIT_EXPR@26..40
-            ATTR@26..30
-              POUND@26..27 "#"
-              L_BRACK@27..28 "["
-              META@28..29
-                PATH@28..29
-                  PATH_SEGMENT@28..29
-                    NAME_REF@28..29
-                      IDENT@28..29 "b"
-              R_BRACK@29..30 "]"
-            WHITESPACE@30..31 " "
-            PATH_EXPR@31..34
-              PATH@31..34
-                PATH_SEGMENT@31..34
-                  NAME_REF@31..34
-                    IDENT@31..34 "rhs"
-            DOT@34..35 "."
-            AWAIT_KW@35..40 "await"
-        R_PAREN@40..41 ")"
-      WHITESPACE@41..42 "\n"
-      R_CURLY@42..43 "}"
+      STMT_LIST@7..43
+        L_CURLY@7..8 "{"
+        WHITESPACE@8..13 "\n    "
+        PAREN_EXPR@13..41
+          L_PAREN@13..14 "("
+          BIN_EXPR@14..40
+            TRY_EXPR@14..23
+              ATTR@14..18
+                POUND@14..15 "#"
+                L_BRACK@15..16 "["
+                META@16..17
+                  PATH@16..17
+                    PATH_SEGMENT@16..17
+                      NAME_REF@16..17
+                        IDENT@16..17 "a"
+                R_BRACK@17..18 "]"
+              WHITESPACE@18..19 " "
+              PATH_EXPR@19..22
+                PATH@19..22
+                  PATH_SEGMENT@19..22
+                    NAME_REF@19..22
+                      IDENT@19..22 "lhs"
+              QUESTION@22..23 "?"
+            WHITESPACE@23..24 " "
+            PLUS@24..25 "+"
+            WHITESPACE@25..26 " "
+            AWAIT_EXPR@26..40
+              ATTR@26..30
+                POUND@26..27 "#"
+                L_BRACK@27..28 "["
+                META@28..29
+                  PATH@28..29
+                    PATH_SEGMENT@28..29
+                      NAME_REF@28..29
+                        IDENT@28..29 "b"
+                R_BRACK@29..30 "]"
+              WHITESPACE@30..31 " "
+              PATH_EXPR@31..34
+                PATH@31..34
+                  PATH_SEGMENT@31..34
+                    NAME_REF@31..34
+                      IDENT@31..34 "rhs"
+              DOT@34..35 "."
+              AWAIT_KW@35..40 "await"
+          R_PAREN@40..41 ")"
+        WHITESPACE@41..42 "\n"
+        R_CURLY@42..43 "}"
   WHITESPACE@43..44 "\n"
diff --git a/crates/syntax/test_data/parser/ok/0071_stmt_attr_placement.rast b/crates/syntax/test_data/parser/ok/0071_stmt_attr_placement.rast
index 3a00212e80b..075d15f249c 100644
--- a/crates/syntax/test_data/parser/ok/0071_stmt_attr_placement.rast
+++ b/crates/syntax/test_data/parser/ok/0071_stmt_attr_placement.rast
@@ -9,61 +9,63 @@ SOURCE_FILE@0..52
       R_PAREN@7..8 ")"
     WHITESPACE@8..9 " "
     BLOCK_EXPR@9..51
-      L_CURLY@9..10 "{"
-      WHITESPACE@10..15 "\n    "
-      EXPR_STMT@15..36
-        BLOCK_EXPR@15..36
-          ATTR@15..19
-            POUND@15..16 "#"
-            L_BRACK@16..17 "["
-            META@17..18
-              PATH@17..18
-                PATH_SEGMENT@17..18
-                  NAME_REF@17..18
-                    IDENT@17..18 "A"
-            R_BRACK@18..19 "]"
-          WHITESPACE@19..20 " "
-          L_CURLY@20..21 "{"
-          WHITESPACE@21..22 " "
-          TRY_EXPR@22..34
-            ATTR@22..26
-              POUND@22..23 "#"
-              L_BRACK@23..24 "["
-              META@24..25
-                PATH@24..25
-                  PATH_SEGMENT@24..25
-                    NAME_REF@24..25
-                      IDENT@24..25 "B"
-              R_BRACK@25..26 "]"
-            WHITESPACE@26..27 " "
-            MACRO_CALL@27..33
-              PATH@27..30
-                PATH_SEGMENT@27..30
-                  NAME_REF@27..30
-                    IDENT@27..30 "bar"
-              BANG@30..31 "!"
-              TOKEN_TREE@31..33
-                L_PAREN@31..32 "("
-                R_PAREN@32..33 ")"
-            QUESTION@33..34 "?"
-          WHITESPACE@34..35 " "
-          R_CURLY@35..36 "}"
-      WHITESPACE@36..41 "\n    "
-      REF_EXPR@41..49
-        ATTR@41..45
-          POUND@41..42 "#"
-          L_BRACK@42..43 "["
-          META@43..44
-            PATH@43..44
-              PATH_SEGMENT@43..44
-                NAME_REF@43..44
-                  IDENT@43..44 "C"
-          R_BRACK@44..45 "]"
-        WHITESPACE@45..46 " "
-        AMP@46..47 "&"
-        TUPLE_EXPR@47..49
-          L_PAREN@47..48 "("
-          R_PAREN@48..49 ")"
-      WHITESPACE@49..50 "\n"
-      R_CURLY@50..51 "}"
+      STMT_LIST@9..51
+        L_CURLY@9..10 "{"
+        WHITESPACE@10..15 "\n    "
+        EXPR_STMT@15..36
+          BLOCK_EXPR@15..36
+            ATTR@15..19
+              POUND@15..16 "#"
+              L_BRACK@16..17 "["
+              META@17..18
+                PATH@17..18
+                  PATH_SEGMENT@17..18
+                    NAME_REF@17..18
+                      IDENT@17..18 "A"
+              R_BRACK@18..19 "]"
+            WHITESPACE@19..20 " "
+            STMT_LIST@20..36
+              L_CURLY@20..21 "{"
+              WHITESPACE@21..22 " "
+              TRY_EXPR@22..34
+                ATTR@22..26
+                  POUND@22..23 "#"
+                  L_BRACK@23..24 "["
+                  META@24..25
+                    PATH@24..25
+                      PATH_SEGMENT@24..25
+                        NAME_REF@24..25
+                          IDENT@24..25 "B"
+                  R_BRACK@25..26 "]"
+                WHITESPACE@26..27 " "
+                MACRO_CALL@27..33
+                  PATH@27..30
+                    PATH_SEGMENT@27..30
+                      NAME_REF@27..30
+                        IDENT@27..30 "bar"
+                  BANG@30..31 "!"
+                  TOKEN_TREE@31..33
+                    L_PAREN@31..32 "("
+                    R_PAREN@32..33 ")"
+                QUESTION@33..34 "?"
+              WHITESPACE@34..35 " "
+              R_CURLY@35..36 "}"
+        WHITESPACE@36..41 "\n    "
+        REF_EXPR@41..49
+          ATTR@41..45
+            POUND@41..42 "#"
+            L_BRACK@42..43 "["
+            META@43..44
+              PATH@43..44
+                PATH_SEGMENT@43..44
+                  NAME_REF@43..44
+                    IDENT@43..44 "C"
+            R_BRACK@44..45 "]"
+          WHITESPACE@45..46 " "
+          AMP@46..47 "&"
+          TUPLE_EXPR@47..49
+            L_PAREN@47..48 "("
+            R_PAREN@48..49 ")"
+        WHITESPACE@49..50 "\n"
+        R_CURLY@50..51 "}"
   WHITESPACE@51..52 "\n"