aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax/tests/data/parser
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_syntax/tests/data/parser')
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0000_struct_field_missing_comma.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0000_struct_field_missing_comma.txt34
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0001_item_recovery_in_file.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0001_item_recovery_in_file.txt18
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0002_duplicate_shebang.rs2
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0002_duplicate_shebang.txt7
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0003_C++_semicolon.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0003_C++_semicolon.txt39
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0004_use_path_bad_segment.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0004_use_path_bad_segment.txt16
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0005_attribute_recover.rs8
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0005_attribute_recover.txt55
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0006_named_field_recovery.rs7
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0006_named_field_recovery.txt74
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0007_stray_curly_in_file.rs9
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0007_stray_curly_in_file.txt32
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0008_item_block_recovery.rs13
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0008_item_block_recovery.txt70
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0009_broken_struct_type_parameter.rs5
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0009_broken_struct_type_parameter.txt44
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0010_unsafe_lambda_block.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0010_unsafe_lambda_block.txt42
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0011_extern_struct.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0011_extern_struct.txt13
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0012_broken_lambda.txt387
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0013_invalid_type.rs7
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0013_invalid_type.txt89
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0014_where_no_bounds.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0014_where_no_bounds.txt31
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0015_curly_in_params.rs2
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0015_curly_in_params.txt24
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0016_missing_semi.rs6
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0016_missing_semi.txt43
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0017_incomplete_binexpr.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0017_incomplete_binexpr.txt46
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0018_incomplete_fn.rs8
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0018_incomplete_fn.txt131
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0019_let_recover.rs12
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0019_let_recover.txt103
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0020_fn_recover.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0020_fn_recover.txt20
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0021_incomplete_param.rs2
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0021_incomplete_param.txt34
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0022_bad_exprs.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0022_bad_exprs.txt189
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0023_mismatched_paren.rs5
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0023_mismatched_paren.txt43
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.rs7
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.txt310
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0025_nope.rs31
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0025_nope.txt203
-rw-r--r--crates/ra_syntax/tests/data/parser/fuzz-failures/0000.rs199
-rw-r--r--crates/ra_syntax/tests/data/parser/fuzz-failures/0001.rs106
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0001_const_unsafe_fn.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0001_const_unsafe_fn.txt18
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0002_const_fn.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0002_const_fn.txt16
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0003_extern_block.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0003_extern_block.txt9
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0004_extern_fn.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0004_extern_fn.txt17
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0005_extern_crate.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0005_extern_crate.txt10
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0007_unsafe_trait.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0007_unsafe_trait.txt13
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0008_unsafe_impl.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0008_unsafe_impl.txt16
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0009_unsafe_auto_trait.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0009_unsafe_auto_trait.txt15
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0010_unsafe_default_impl.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0010_unsafe_default_impl.txt18
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0011_unsafe_fn.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0011_unsafe_fn.txt16
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0012_unsafe_extern_fn.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0012_unsafe_extern_fn.txt21
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0013_unsafe_block_in_mod.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0013_unsafe_block_in_mod.txt35
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0014_type_item_type_params.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0014_type_item_type_params.txt20
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0015_type_item.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0015_type_item.txt16
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0016_type_item_where_clause.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0016_type_item_where_clause.txt32
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0017_paren_type.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0017_paren_type.txt19
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0018_unit_type.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0018_unit_type.txt14
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0019_singleton_tuple_type.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0019_singleton_tuple_type.txt20
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0020_never_type.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0020_never_type.txt13
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0021_pointer_type_no_mutability.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0021_pointer_type_no_mutability.txt17
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0022_pointer_type_mut.rs2
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0022_pointer_type_mut.txt35
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0023_array_type_missing_semi.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0023_array_type_missing_semi.txt27
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0024_array_type.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0024_array_type.txt21
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0025_slice_type.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0025_slice_type.txt17
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0026_reference_type;.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0026_reference_type;.txt50
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0027_placeholder_type.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0027_placeholder_type.txt13
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0028_fn_pointer_type.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0028_fn_pointer_type.txt55
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0029_fn_pointer_type_missing_fn.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0029_fn_pointer_type_missing_fn.txt23
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0030_fn_pointer_type_with_ret.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0030_fn_pointer_type_with_ret.txt23
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0031_for_type.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0031_for_type.txt31
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0032_path_type.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0032_path_type.txt70
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0034_bind_pat.rs8
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0034_bind_pat.txt127
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0035_ref_pat.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0035_ref_pat.txt49
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0036_placeholder_pat.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0036_placeholder_pat.txt28
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0037_crate_visibility.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0037_crate_visibility.txt53
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0038_function_ret_type.rs2
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0038_function_ret_type.txt34
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0039_path_expr.rs6
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0039_path_expr.txt95
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0040_expr_literals.rs12
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0040_expr_literals.txt135
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0041_type_param_bounds.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0041_type_param_bounds.txt36
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0042_type_param_default.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0042_type_param_default.txt22
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0043_call_expr.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0043_call_expr.txt70
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0044_ref_expr.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0044_ref_expr.txt54
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0045_block.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0045_block.txt86
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0046_default_impl.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0046_default_impl.txt16
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0047_impl_item.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0047_impl_item.txt14
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0048_impl_item_neg.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0048_impl_item_neg.txt23
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0049_trait_item_list.rs6
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0049_trait_item_list.txt69
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0050_let_stmt;.rs6
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0050_let_stmt;.txt71
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0051_method_call_expr.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0051_method_call_expr.txt62
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0052_field_expr.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0052_field_expr.txt42
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0053_block_items.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0053_block_items.txt28
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0054_field_pat_list.rs6
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0054_field_pat_list.txt126
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0055_self_param.rs7
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0055_self_param.txt116
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0056_trait_item.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0056_trait_item.txt49
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0057_auto_trait.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0057_auto_trait.txt13
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0058_type_arg.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0058_type_arg.txt40
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0059_function_where_clause.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0059_function_where_clause.txt37
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0060_function_type_params.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0060_function_type_params.txt34
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0061_struct_lit.rs5
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0061_struct_lit.txt97
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0063_impl_trait_type.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0063_impl_trait_type.txt40
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0063_lambda_expr.txt91
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0064_param_list.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0064_param_list.txt99
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0065_if_expr.rs6
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0065_if_expr.txt95
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0066_lambda_expr.rs6
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0066_lambda_expr.txt95
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0067_block_expr.rs5
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0067_block_expr.txt42
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0068_pub_expr.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0068_pub_expr.txt25
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0068_return_expr.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0068_return_expr.txt28
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0069_match_arm.rs6
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0069_match_arm.txt66
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0070_match_expr.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0070_match_expr.txt44
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0071_tuple_pat_fields.rs6
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0071_tuple_pat_fields.txt103
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0072_path_part.rs6
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0072_path_part.txt95
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0073_impl_item_list.rs6
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0073_impl_item_list.txt78
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0074_unary_expr.rs5
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0074_unary_expr.txt44
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0075_try_expr.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0075_try_expr.txt25
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0076_cond.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0076_cond.txt43
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0077_while_expr.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0077_while_expr.txt66
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0078_mod_contents.rs5
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0078_mod_contents.txt65
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0079_cast_expr.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0079_cast_expr.txt29
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0080_tuple_expr.rs5
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0080_tuple_expr.txt38
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0081_index_expr.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0081_index_expr.txt33
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0082_tuple_pat.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0082_tuple_pat.txt40
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0083_postfix_range.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0083_postfix_range.txt30
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0084_loop_expr.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0084_loop_expr.txt24
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0085_for_expr.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0085_for_expr.txt34
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0085_match_arms_commas.rs7
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0085_match_arms_commas.txt59
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0086_array_expr.rs6
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0086_array_expr.txt54
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0086_no_semi_after_block.rs9
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0086_no_semi_after_block.txt87
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0087_stmt_postfix_expr_ambiguity.rs7
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0087_stmt_postfix_expr_ambiguity.txt62
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0088_stmt_bin_expr_ambiguity.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0088_stmt_bin_expr_ambiguity.txt52
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0089_slice_pat.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0089_slice_pat.txt40
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0091_fn_decl.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0091_fn_decl.txt22
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0092_literal_pattern.rs7
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0092_literal_pattern.txt60
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0093_path_fn_trait_args.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0093_path_fn_trait_args.txt46
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0094_range_pat.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0094_range_pat.txt42
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0095_path_type_with_bounds.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0095_path_type_with_bounds.txt36
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0096_value_parameters_no_patterns.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0096_value_parameters_no_patterns.txt81
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0097_param_list_opt_patterns.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0097_param_list_opt_patterns.txt44
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0098_where_clause.rs6
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0098_where_clause.txt71
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0099_crate_keyword_vis.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0099_crate_keyword_vis.txt18
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0100_dyn_trait_type.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0100_dyn_trait_type.txt40
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0101_qual_paths.rs2
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0101_qual_paths.txt78
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0102_full_range_expr.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0102_full_range_expr.txt28
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0103_field_attrs.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0103_field_attrs.txt42
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0104_arb_self_types.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0104_arb_self_types.txt72
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0105_continue_expr.rs6
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0105_continue_expr.txt35
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0106_break_expr.rs8
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0106_break_expr.txt53
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0107_label.rs5
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0107_label.txt64
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0108_misplaced_label_err.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0108_misplaced_label_err.txt28
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0109_struct_items.rs8
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0109_struct_items.txt87
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0110_union_items.rs5
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/0110_union_items.txt46
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0000_empty.rs0
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0000_empty.txt1
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0001_struct_item.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0001_struct_item.txt37
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0002_struct_item_field.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0002_struct_item_field.txt22
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0004_file_shebang.rs1
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0004_file_shebang.txt2
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0005_fn_item.rs2
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0005_fn_item.txt15
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0006_inner_attributes.rs10
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0006_inner_attributes.txt164
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0007_extern_crate.rs2
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0007_extern_crate.txt25
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0008_mod_item.rs17
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0008_mod_item.txt90
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0009_use_item.rs2
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0009_use_item.txt21
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0010_use_path_segments.rs2
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0010_use_path_segments.txt42
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0011_outer_attribute.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0011_outer_attribute.txt32
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0012_visibility.rs5
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0012_visibility.txt102
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0013_use_path_self_super.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0013_use_path_self_super.txt57
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0014_use_tree.rs7
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0014_use_tree.txt95
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0015_use_tree.rs2
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0015_use_tree.txt65
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0016_struct_flavors.rs10
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0016_struct_flavors.txt93
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0017_attr_trailing_comma.rs2
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0017_attr_trailing_comma.txt26
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0018_struct_type_params.rs17
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0018_struct_type_params.txt257
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0019_enums.rs25
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0019_enums.txt155
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0020_type_param_bounds.rs9
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0020_type_param_bounds.txt198
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0021_extern_fn.rs8
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0021_extern_fn.txt56
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0022_empty_extern_block.rs5
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0022_empty_extern_block.txt21
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0023_static_items.rs2
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0023_static_items.txt41
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0024_const_item.rs2
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0024_const_item.txt41
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0025_extern_fn_in_block.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0025_extern_fn_in_block.txt31
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0026_const_fn_in_block.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0026_const_fn_in_block.txt30
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0027_unsafe_fn_in_block.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0027_unsafe_fn_in_block.txt41
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0028_operator_binding_power.rs14
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0028_operator_binding_power.txt185
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0029_range_forms.rs6
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0029_range_forms.txt83
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0030_traits.rs11
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0030_traits.txt93
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0031_extern.rs29
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0031_extern.txt973
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0032_where_for.rs4
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0032_where_for.txt85
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0033_label_break.rs28
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0033_label_break.txt215
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0034_macro_2.0.rs16
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0034_macro_2.0.txt317
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0034_macro_stuck.txt250
341 files changed, 12175 insertions, 0 deletions
diff --git a/crates/ra_syntax/tests/data/parser/err/0000_struct_field_missing_comma.rs b/crates/ra_syntax/tests/data/parser/err/0000_struct_field_missing_comma.rs
new file mode 100644
index 000000000..fe5030d89
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0000_struct_field_missing_comma.rs
@@ -0,0 +1,4 @@
1struct S {
2 a: u32
3 b: u32
4} \ No newline at end of file
diff --git a/crates/ra_syntax/tests/data/parser/err/0000_struct_field_missing_comma.txt b/crates/ra_syntax/tests/data/parser/err/0000_struct_field_missing_comma.txt
new file mode 100644
index 000000000..aa375fe8a
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0000_struct_field_missing_comma.txt
@@ -0,0 +1,34 @@
1ROOT@[0; 34)
2 STRUCT_DEF@[0; 34)
3 STRUCT_KW@[0; 6)
4 WHITESPACE@[6; 7)
5 NAME@[7; 8)
6 IDENT@[7; 8) "S"
7 WHITESPACE@[8; 9)
8 NAMED_FIELD_DEF_LIST@[9; 34)
9 L_CURLY@[9; 10)
10 WHITESPACE@[10; 15)
11 NAMED_FIELD_DEF@[15; 21)
12 NAME@[15; 16)
13 IDENT@[15; 16) "a"
14 COLON@[16; 17)
15 WHITESPACE@[17; 18)
16 PATH_TYPE@[18; 21)
17 PATH@[18; 21)
18 PATH_SEGMENT@[18; 21)
19 NAME_REF@[18; 21)
20 IDENT@[18; 21) "u32"
21 err: `expected COMMA`
22 WHITESPACE@[21; 26)
23 NAMED_FIELD_DEF@[26; 32)
24 NAME@[26; 27)
25 IDENT@[26; 27) "b"
26 COLON@[27; 28)
27 WHITESPACE@[28; 29)
28 PATH_TYPE@[29; 32)
29 PATH@[29; 32)
30 PATH_SEGMENT@[29; 32)
31 NAME_REF@[29; 32)
32 IDENT@[29; 32) "u32"
33 WHITESPACE@[32; 33)
34 R_CURLY@[33; 34)
diff --git a/crates/ra_syntax/tests/data/parser/err/0001_item_recovery_in_file.rs b/crates/ra_syntax/tests/data/parser/err/0001_item_recovery_in_file.rs
new file mode 100644
index 000000000..98f23de1f
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0001_item_recovery_in_file.rs
@@ -0,0 +1,3 @@
1if match
2
3struct S {} \ No newline at end of file
diff --git a/crates/ra_syntax/tests/data/parser/err/0001_item_recovery_in_file.txt b/crates/ra_syntax/tests/data/parser/err/0001_item_recovery_in_file.txt
new file mode 100644
index 000000000..771d6e1ef
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0001_item_recovery_in_file.txt
@@ -0,0 +1,18 @@
1ROOT@[0; 21)
2 ERROR@[0; 2)
3 IF_KW@[0; 2)
4 err: `expected an item`
5 WHITESPACE@[2; 3)
6 err: `expected an item`
7 ERROR@[3; 8)
8 MATCH_KW@[3; 8)
9 WHITESPACE@[8; 10)
10 STRUCT_DEF@[10; 21)
11 STRUCT_KW@[10; 16)
12 WHITESPACE@[16; 17)
13 NAME@[17; 18)
14 IDENT@[17; 18) "S"
15 WHITESPACE@[18; 19)
16 NAMED_FIELD_DEF_LIST@[19; 21)
17 L_CURLY@[19; 20)
18 R_CURLY@[20; 21)
diff --git a/crates/ra_syntax/tests/data/parser/err/0002_duplicate_shebang.rs b/crates/ra_syntax/tests/data/parser/err/0002_duplicate_shebang.rs
new file mode 100644
index 000000000..48a3a3980
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0002_duplicate_shebang.rs
@@ -0,0 +1,2 @@
1#!/use/bin/env rusti
2#!/use/bin/env rusti
diff --git a/crates/ra_syntax/tests/data/parser/err/0002_duplicate_shebang.txt b/crates/ra_syntax/tests/data/parser/err/0002_duplicate_shebang.txt
new file mode 100644
index 000000000..57fb48420
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0002_duplicate_shebang.txt
@@ -0,0 +1,7 @@
1ROOT@[0; 42)
2 SHEBANG@[0; 20)
3 WHITESPACE@[20; 21)
4 err: `expected an item`
5 ERROR@[21; 41)
6 SHEBANG@[21; 41)
7 WHITESPACE@[41; 42)
diff --git a/crates/ra_syntax/tests/data/parser/err/0003_C++_semicolon.rs b/crates/ra_syntax/tests/data/parser/err/0003_C++_semicolon.rs
new file mode 100644
index 000000000..009312270
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0003_C++_semicolon.rs
@@ -0,0 +1,4 @@
1struct S {
2 a: i32,
3 b: String,
4}; \ No newline at end of file
diff --git a/crates/ra_syntax/tests/data/parser/err/0003_C++_semicolon.txt b/crates/ra_syntax/tests/data/parser/err/0003_C++_semicolon.txt
new file mode 100644
index 000000000..b51c0573a
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0003_C++_semicolon.txt
@@ -0,0 +1,39 @@
1ROOT@[0; 40)
2 STRUCT_DEF@[0; 40)
3 STRUCT_KW@[0; 6)
4 WHITESPACE@[6; 7)
5 NAME@[7; 8)
6 IDENT@[7; 8) "S"
7 WHITESPACE@[8; 9)
8 NAMED_FIELD_DEF_LIST@[9; 39)
9 L_CURLY@[9; 10)
10 WHITESPACE@[10; 15)
11 NAMED_FIELD_DEF@[15; 21)
12 NAME@[15; 16)
13 IDENT@[15; 16) "a"
14 COLON@[16; 17)
15 WHITESPACE@[17; 18)
16 PATH_TYPE@[18; 21)
17 PATH@[18; 21)
18 PATH_SEGMENT@[18; 21)
19 NAME_REF@[18; 21)
20 IDENT@[18; 21) "i32"
21 COMMA@[21; 22)
22 WHITESPACE@[22; 27)
23 NAMED_FIELD_DEF@[27; 36)
24 NAME@[27; 28)
25 IDENT@[27; 28) "b"
26 COLON@[28; 29)
27 WHITESPACE@[29; 30)
28 PATH_TYPE@[30; 36)
29 PATH@[30; 36)
30 PATH_SEGMENT@[30; 36)
31 NAME_REF@[30; 36)
32 IDENT@[30; 36) "String"
33 COMMA@[36; 37)
34 WHITESPACE@[37; 38)
35 R_CURLY@[38; 39)
36 err: `expected item, found `;`
37consider removing this semicolon`
38 ERROR@[39; 40)
39 SEMI@[39; 40)
diff --git a/crates/ra_syntax/tests/data/parser/err/0004_use_path_bad_segment.rs b/crates/ra_syntax/tests/data/parser/err/0004_use_path_bad_segment.rs
new file mode 100644
index 000000000..060e65d06
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0004_use_path_bad_segment.rs
@@ -0,0 +1 @@
use foo::92; \ No newline at end of file
diff --git a/crates/ra_syntax/tests/data/parser/err/0004_use_path_bad_segment.txt b/crates/ra_syntax/tests/data/parser/err/0004_use_path_bad_segment.txt
new file mode 100644
index 000000000..646c84534
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0004_use_path_bad_segment.txt
@@ -0,0 +1,16 @@
1ROOT@[0; 12)
2 USE_ITEM@[0; 12)
3 USE_KW@[0; 3)
4 WHITESPACE@[3; 4)
5 USE_TREE@[4; 11)
6 PATH@[4; 11)
7 PATH@[4; 7)
8 PATH_SEGMENT@[4; 7)
9 NAME_REF@[4; 7)
10 IDENT@[4; 7) "foo"
11 COLONCOLON@[7; 9)
12 err: `expected identifier`
13 PATH_SEGMENT@[9; 11)
14 ERROR@[9; 11)
15 INT_NUMBER@[9; 11) "92"
16 SEMI@[11; 12)
diff --git a/crates/ra_syntax/tests/data/parser/err/0005_attribute_recover.rs b/crates/ra_syntax/tests/data/parser/err/0005_attribute_recover.rs
new file mode 100644
index 000000000..de7f81628
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0005_attribute_recover.rs
@@ -0,0 +1,8 @@
1#[foo(foo, +, 92)]
2fn foo() {
3}
4
5
6#[foo(
7fn foo() {
8}
diff --git a/crates/ra_syntax/tests/data/parser/err/0005_attribute_recover.txt b/crates/ra_syntax/tests/data/parser/err/0005_attribute_recover.txt
new file mode 100644
index 000000000..b3cf9b889
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0005_attribute_recover.txt
@@ -0,0 +1,55 @@
1ROOT@[0; 54)
2 FN_DEF@[0; 31)
3 ATTR@[0; 18)
4 POUND@[0; 1)
5 TOKEN_TREE@[1; 18)
6 L_BRACK@[1; 2)
7 IDENT@[2; 5) "foo"
8 TOKEN_TREE@[5; 17)
9 L_PAREN@[5; 6)
10 IDENT@[6; 9) "foo"
11 COMMA@[9; 10)
12 WHITESPACE@[10; 11)
13 PLUS@[11; 12)
14 COMMA@[12; 13)
15 WHITESPACE@[13; 14)
16 INT_NUMBER@[14; 16) "92"
17 R_PAREN@[16; 17)
18 R_BRACK@[17; 18)
19 WHITESPACE@[18; 19)
20 FN_KW@[19; 21)
21 WHITESPACE@[21; 22)
22 NAME@[22; 25)
23 IDENT@[22; 25) "foo"
24 PARAM_LIST@[25; 27)
25 L_PAREN@[25; 26)
26 R_PAREN@[26; 27)
27 WHITESPACE@[27; 28)
28 BLOCK@[28; 31)
29 L_CURLY@[28; 29)
30 WHITESPACE@[29; 30)
31 R_CURLY@[30; 31)
32 WHITESPACE@[31; 34)
33 ATTR@[34; 53)
34 POUND@[34; 35)
35 TOKEN_TREE@[35; 53)
36 L_BRACK@[35; 36)
37 IDENT@[36; 39) "foo"
38 TOKEN_TREE@[39; 53)
39 L_PAREN@[39; 40)
40 WHITESPACE@[40; 41)
41 FN_KW@[41; 43)
42 WHITESPACE@[43; 44)
43 IDENT@[44; 47) "foo"
44 TOKEN_TREE@[47; 49)
45 L_PAREN@[47; 48)
46 R_PAREN@[48; 49)
47 WHITESPACE@[49; 50)
48 TOKEN_TREE@[50; 53)
49 L_CURLY@[50; 51)
50 WHITESPACE@[51; 52)
51 R_CURLY@[52; 53)
52 err: `expected R_PAREN`
53 err: `expected R_BRACK`
54 err: `expected an item`
55 WHITESPACE@[53; 54)
diff --git a/crates/ra_syntax/tests/data/parser/err/0006_named_field_recovery.rs b/crates/ra_syntax/tests/data/parser/err/0006_named_field_recovery.rs
new file mode 100644
index 000000000..8069c111b
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0006_named_field_recovery.rs
@@ -0,0 +1,7 @@
1struct S {
2 f: u32,
3 pub 92
4 + - *
5 pub x: u32,
6 z: f64,
7}
diff --git a/crates/ra_syntax/tests/data/parser/err/0006_named_field_recovery.txt b/crates/ra_syntax/tests/data/parser/err/0006_named_field_recovery.txt
new file mode 100644
index 000000000..9abda7099
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0006_named_field_recovery.txt
@@ -0,0 +1,74 @@
1ROOT@[0; 74)
2 STRUCT_DEF@[0; 73)
3 STRUCT_KW@[0; 6)
4 WHITESPACE@[6; 7)
5 NAME@[7; 8)
6 IDENT@[7; 8) "S"
7 WHITESPACE@[8; 9)
8 NAMED_FIELD_DEF_LIST@[9; 73)
9 L_CURLY@[9; 10)
10 WHITESPACE@[10; 15)
11 NAMED_FIELD_DEF@[15; 21)
12 NAME@[15; 16)
13 IDENT@[15; 16) "f"
14 COLON@[16; 17)
15 WHITESPACE@[17; 18)
16 PATH_TYPE@[18; 21)
17 PATH@[18; 21)
18 PATH_SEGMENT@[18; 21)
19 NAME_REF@[18; 21)
20 IDENT@[18; 21) "u32"
21 COMMA@[21; 22)
22 WHITESPACE@[22; 27)
23 VISIBILITY@[27; 30)
24 PUB_KW@[27; 30)
25 WHITESPACE@[30; 31)
26 err: `expected field declaration`
27 ERROR@[31; 33)
28 INT_NUMBER@[31; 33) "92"
29 err: `expected COMMA`
30 WHITESPACE@[33; 38)
31 err: `expected field declaration`
32 ERROR@[38; 39)
33 PLUS@[38; 39)
34 err: `expected COMMA`
35 WHITESPACE@[39; 40)
36 err: `expected field declaration`
37 ERROR@[40; 41)
38 MINUS@[40; 41)
39 err: `expected COMMA`
40 WHITESPACE@[41; 42)
41 err: `expected field declaration`
42 ERROR@[42; 43)
43 STAR@[42; 43)
44 err: `expected COMMA`
45 WHITESPACE@[43; 48)
46 NAMED_FIELD_DEF@[48; 58)
47 VISIBILITY@[48; 51)
48 PUB_KW@[48; 51)
49 WHITESPACE@[51; 52)
50 NAME@[52; 53)
51 IDENT@[52; 53) "x"
52 COLON@[53; 54)
53 WHITESPACE@[54; 55)
54 PATH_TYPE@[55; 58)
55 PATH@[55; 58)
56 PATH_SEGMENT@[55; 58)
57 NAME_REF@[55; 58)
58 IDENT@[55; 58) "u32"
59 COMMA@[58; 59)
60 WHITESPACE@[59; 64)
61 NAMED_FIELD_DEF@[64; 70)
62 NAME@[64; 65)
63 IDENT@[64; 65) "z"
64 COLON@[65; 66)
65 WHITESPACE@[66; 67)
66 PATH_TYPE@[67; 70)
67 PATH@[67; 70)
68 PATH_SEGMENT@[67; 70)
69 NAME_REF@[67; 70)
70 IDENT@[67; 70) "f64"
71 COMMA@[70; 71)
72 WHITESPACE@[71; 72)
73 R_CURLY@[72; 73)
74 WHITESPACE@[73; 74)
diff --git a/crates/ra_syntax/tests/data/parser/err/0007_stray_curly_in_file.rs b/crates/ra_syntax/tests/data/parser/err/0007_stray_curly_in_file.rs
new file mode 100644
index 000000000..dc869fb78
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0007_stray_curly_in_file.rs
@@ -0,0 +1,9 @@
1}
2
3struct S;
4
5}
6
7fn foo(){}
8
9}
diff --git a/crates/ra_syntax/tests/data/parser/err/0007_stray_curly_in_file.txt b/crates/ra_syntax/tests/data/parser/err/0007_stray_curly_in_file.txt
new file mode 100644
index 000000000..802c69b31
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0007_stray_curly_in_file.txt
@@ -0,0 +1,32 @@
1ROOT@[0; 31)
2 ERROR@[0; 1)
3 R_CURLY@[0; 1)
4 err: `unmatched `}``
5 WHITESPACE@[1; 3)
6 STRUCT_DEF@[3; 12)
7 STRUCT_KW@[3; 9)
8 WHITESPACE@[9; 10)
9 NAME@[10; 11)
10 IDENT@[10; 11) "S"
11 SEMI@[11; 12)
12 WHITESPACE@[12; 14)
13 err: `unmatched `}``
14 ERROR@[14; 15)
15 R_CURLY@[14; 15)
16 WHITESPACE@[15; 17)
17 FN_DEF@[17; 27)
18 FN_KW@[17; 19)
19 WHITESPACE@[19; 20)
20 NAME@[20; 23)
21 IDENT@[20; 23) "foo"
22 PARAM_LIST@[23; 25)
23 L_PAREN@[23; 24)
24 R_PAREN@[24; 25)
25 BLOCK@[25; 27)
26 L_CURLY@[25; 26)
27 R_CURLY@[26; 27)
28 WHITESPACE@[27; 29)
29 err: `unmatched `}``
30 ERROR@[29; 30)
31 R_CURLY@[29; 30)
32 WHITESPACE@[30; 31)
diff --git a/crates/ra_syntax/tests/data/parser/err/0008_item_block_recovery.rs b/crates/ra_syntax/tests/data/parser/err/0008_item_block_recovery.rs
new file mode 100644
index 000000000..9fcac19b5
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0008_item_block_recovery.rs
@@ -0,0 +1,13 @@
1fn foo() {
2}
3
4bar() {
5 if true {
6 1
7 } else {
8 2 + 3
9 }
10}
11
12fn baz() {
13}
diff --git a/crates/ra_syntax/tests/data/parser/err/0008_item_block_recovery.txt b/crates/ra_syntax/tests/data/parser/err/0008_item_block_recovery.txt
new file mode 100644
index 000000000..95a34333b
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0008_item_block_recovery.txt
@@ -0,0 +1,70 @@
1ROOT@[0; 95)
2 FN_DEF@[0; 12)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 8)
8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9)
11 BLOCK@[9; 12)
12 L_CURLY@[9; 10)
13 WHITESPACE@[10; 11)
14 R_CURLY@[11; 12)
15 WHITESPACE@[12; 14)
16 MACRO_CALL@[14; 19)
17 PATH@[14; 17)
18 PATH_SEGMENT@[14; 17)
19 NAME_REF@[14; 17)
20 IDENT@[14; 17) "bar"
21 err: `expected EXCL`
22 TOKEN_TREE@[17; 19)
23 L_PAREN@[17; 18)
24 R_PAREN@[18; 19)
25 err: `expected SEMI`
26 WHITESPACE@[19; 20)
27 err: `expected an item`
28 ERROR@[20; 80)
29 L_CURLY@[20; 21)
30 WHITESPACE@[21; 26)
31 IF_KW@[26; 28)
32 WHITESPACE@[28; 29)
33 TRUE_KW@[29; 33)
34 WHITESPACE@[33; 34)
35 ERROR@[34; 51)
36 L_CURLY@[34; 35)
37 WHITESPACE@[35; 44)
38 INT_NUMBER@[44; 45) "1"
39 WHITESPACE@[45; 50)
40 R_CURLY@[50; 51)
41 WHITESPACE@[51; 52)
42 ELSE_KW@[52; 56)
43 WHITESPACE@[56; 57)
44 ERROR@[57; 78)
45 L_CURLY@[57; 58)
46 WHITESPACE@[58; 67)
47 INT_NUMBER@[67; 68) "2"
48 WHITESPACE@[68; 69)
49 PLUS@[69; 70)
50 WHITESPACE@[70; 71)
51 INT_NUMBER@[71; 72) "3"
52 WHITESPACE@[72; 77)
53 R_CURLY@[77; 78)
54 WHITESPACE@[78; 79)
55 R_CURLY@[79; 80)
56 WHITESPACE@[80; 82)
57 FN_DEF@[82; 94)
58 FN_KW@[82; 84)
59 WHITESPACE@[84; 85)
60 NAME@[85; 88)
61 IDENT@[85; 88) "baz"
62 PARAM_LIST@[88; 90)
63 L_PAREN@[88; 89)
64 R_PAREN@[89; 90)
65 WHITESPACE@[90; 91)
66 BLOCK@[91; 94)
67 L_CURLY@[91; 92)
68 WHITESPACE@[92; 93)
69 R_CURLY@[93; 94)
70 WHITESPACE@[94; 95)
diff --git a/crates/ra_syntax/tests/data/parser/err/0009_broken_struct_type_parameter.rs b/crates/ra_syntax/tests/data/parser/err/0009_broken_struct_type_parameter.rs
new file mode 100644
index 000000000..0dd30d0bd
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0009_broken_struct_type_parameter.rs
@@ -0,0 +1,5 @@
1struct S<90 + 2> {
2 f: u32
3}
4
5struct T;
diff --git a/crates/ra_syntax/tests/data/parser/err/0009_broken_struct_type_parameter.txt b/crates/ra_syntax/tests/data/parser/err/0009_broken_struct_type_parameter.txt
new file mode 100644
index 000000000..fa8adf881
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0009_broken_struct_type_parameter.txt
@@ -0,0 +1,44 @@
1ROOT@[0; 43)
2 STRUCT_DEF@[0; 11)
3 STRUCT_KW@[0; 6)
4 WHITESPACE@[6; 7)
5 NAME@[7; 8)
6 IDENT@[7; 8) "S"
7 TYPE_PARAM_LIST@[8; 11)
8 L_ANGLE@[8; 9)
9 err: `expected type parameter`
10 ERROR@[9; 11)
11 INT_NUMBER@[9; 11) "90"
12 err: `expected COMMA`
13 err: `expected R_ANGLE`
14 err: `expected `;`, `{`, or `(``
15 WHITESPACE@[11; 12)
16 err: `expected an item`
17 ERROR@[12; 13)
18 PLUS@[12; 13)
19 WHITESPACE@[13; 14)
20 err: `expected an item`
21 ERROR@[14; 15)
22 INT_NUMBER@[14; 15) "2"
23 err: `expected an item`
24 ERROR@[15; 16)
25 R_ANGLE@[15; 16)
26 WHITESPACE@[16; 17)
27 err: `expected an item`
28 ERROR@[17; 31)
29 L_CURLY@[17; 18)
30 WHITESPACE@[18; 23)
31 IDENT@[23; 24) "f"
32 COLON@[24; 25)
33 WHITESPACE@[25; 26)
34 IDENT@[26; 29) "u32"
35 WHITESPACE@[29; 30)
36 R_CURLY@[30; 31)
37 WHITESPACE@[31; 33)
38 STRUCT_DEF@[33; 42)
39 STRUCT_KW@[33; 39)
40 WHITESPACE@[39; 40)
41 NAME@[40; 41)
42 IDENT@[40; 41) "T"
43 SEMI@[41; 42)
44 WHITESPACE@[42; 43)
diff --git a/crates/ra_syntax/tests/data/parser/err/0010_unsafe_lambda_block.rs b/crates/ra_syntax/tests/data/parser/err/0010_unsafe_lambda_block.rs
new file mode 100644
index 000000000..985775282
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0010_unsafe_lambda_block.rs
@@ -0,0 +1,3 @@
1fn main() {
2 || -> () unsafe { () };
3}
diff --git a/crates/ra_syntax/tests/data/parser/err/0010_unsafe_lambda_block.txt b/crates/ra_syntax/tests/data/parser/err/0010_unsafe_lambda_block.txt
new file mode 100644
index 000000000..38667e030
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0010_unsafe_lambda_block.txt
@@ -0,0 +1,42 @@
1ROOT@[0; 42)
2 FN_DEF@[0; 41)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 7)
6 IDENT@[3; 7) "main"
7 PARAM_LIST@[7; 9)
8 L_PAREN@[7; 8)
9 R_PAREN@[8; 9)
10 WHITESPACE@[9; 10)
11 BLOCK@[10; 41)
12 L_CURLY@[10; 11)
13 WHITESPACE@[11; 16)
14 EXPR_STMT@[16; 39)
15 LAMBDA_EXPR@[16; 38)
16 PARAM_LIST@[16; 18)
17 PIPE@[16; 17)
18 PIPE@[17; 18)
19 WHITESPACE@[18; 19)
20 RET_TYPE@[19; 24)
21 THIN_ARROW@[19; 21)
22 WHITESPACE@[21; 22)
23 TUPLE_TYPE@[22; 24)
24 L_PAREN@[22; 23)
25 R_PAREN@[23; 24)
26 err: `expected `{``
27 WHITESPACE@[24; 25)
28 BLOCK_EXPR@[25; 38)
29 UNSAFE_KW@[25; 31)
30 WHITESPACE@[31; 32)
31 BLOCK@[32; 38)
32 L_CURLY@[32; 33)
33 WHITESPACE@[33; 34)
34 TUPLE_EXPR@[34; 36)
35 L_PAREN@[34; 35)
36 R_PAREN@[35; 36)
37 WHITESPACE@[36; 37)
38 R_CURLY@[37; 38)
39 SEMI@[38; 39)
40 WHITESPACE@[39; 40)
41 R_CURLY@[40; 41)
42 WHITESPACE@[41; 42)
diff --git a/crates/ra_syntax/tests/data/parser/err/0011_extern_struct.rs b/crates/ra_syntax/tests/data/parser/err/0011_extern_struct.rs
new file mode 100644
index 000000000..c1bd0a2d1
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0011_extern_struct.rs
@@ -0,0 +1 @@
extern struct Foo;
diff --git a/crates/ra_syntax/tests/data/parser/err/0011_extern_struct.txt b/crates/ra_syntax/tests/data/parser/err/0011_extern_struct.txt
new file mode 100644
index 000000000..0cb7447c4
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0011_extern_struct.txt
@@ -0,0 +1,13 @@
1ROOT@[0; 19)
2 ERROR@[0; 6)
3 ABI@[0; 6)
4 EXTERN_KW@[0; 6)
5 err: `expected fn, trait or impl`
6 WHITESPACE@[6; 7)
7 STRUCT_DEF@[7; 18)
8 STRUCT_KW@[7; 13)
9 WHITESPACE@[13; 14)
10 NAME@[14; 17)
11 IDENT@[14; 17) "Foo"
12 SEMI@[17; 18)
13 WHITESPACE@[18; 19)
diff --git a/crates/ra_syntax/tests/data/parser/err/0012_broken_lambda.txt b/crates/ra_syntax/tests/data/parser/err/0012_broken_lambda.txt
new file mode 100644
index 000000000..a03aa05e3
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0012_broken_lambda.txt
@@ -0,0 +1,387 @@
1ROOT@[0; 389)
2 FN_DEF@[0; 389)
3 VISIBILITY@[0; 10)
4 PUB_KW@[0; 3)
5 L_PAREN@[3; 4)
6 SUPER_KW@[4; 9)
7 R_PAREN@[9; 10)
8 WHITESPACE@[10; 11)
9 FN_KW@[11; 13)
10 WHITESPACE@[13; 14)
11 NAME@[14; 21)
12 IDENT@[14; 21) "process"
13 TYPE_PARAM_LIST@[21; 38)
14 L_ANGLE@[21; 22)
15 LIFETIME_PARAM@[22; 24)
16 LIFETIME@[22; 24) "'a"
17 COMMA@[24; 25)
18 WHITESPACE@[25; 26)
19 TYPE_PARAM@[26; 37)
20 NAME@[26; 27)
21 IDENT@[26; 27) "S"
22 COLON@[27; 28)
23 WHITESPACE@[28; 29)
24 PATH@[29; 37)
25 PATH_SEGMENT@[29; 37)
26 NAME_REF@[29; 33)
27 IDENT@[29; 33) "Sink"
28 TYPE_ARG_LIST@[33; 37)
29 L_ANGLE@[33; 34)
30 LIFETIME_ARG@[34; 36)
31 LIFETIME@[34; 36) "'a"
32 R_ANGLE@[36; 37)
33 R_ANGLE@[37; 38)
34 PARAM_LIST@[38; 93)
35 L_PAREN@[38; 39)
36 PARAM@[39; 54)
37 BIND_PAT@[39; 46)
38 NAME@[39; 46)
39 IDENT@[39; 46) "builder"
40 COLON@[46; 47)
41 WHITESPACE@[47; 48)
42 REFERENCE_TYPE@[48; 54)
43 AMP@[48; 49)
44 MUT_KW@[49; 52)
45 WHITESPACE@[52; 53)
46 PATH_TYPE@[53; 54)
47 PATH@[53; 54)
48 PATH_SEGMENT@[53; 54)
49 NAME_REF@[53; 54)
50 IDENT@[53; 54) "S"
51 COMMA@[54; 55)
52 WHITESPACE@[55; 56)
53 PARAM@[56; 72)
54 BIND_PAT@[56; 62)
55 NAME@[56; 62)
56 IDENT@[56; 62) "tokens"
57 COLON@[62; 63)
58 WHITESPACE@[63; 64)
59 REFERENCE_TYPE@[64; 72)
60 AMP@[64; 65)
61 SLICE_TYPE@[65; 72)
62 L_BRACK@[65; 66)
63 PATH_TYPE@[66; 71)
64 PATH@[66; 71)
65 PATH_SEGMENT@[66; 71)
66 NAME_REF@[66; 71)
67 IDENT@[66; 71) "Token"
68 R_BRACK@[71; 72)
69 COMMA@[72; 73)
70 WHITESPACE@[73; 74)
71 PARAM@[74; 92)
72 BIND_PAT@[74; 80)
73 NAME@[74; 80)
74 IDENT@[74; 80) "events"
75 COLON@[80; 81)
76 WHITESPACE@[81; 82)
77 PATH_TYPE@[82; 92)
78 PATH@[82; 92)
79 PATH_SEGMENT@[82; 92)
80 NAME_REF@[82; 85)
81 IDENT@[82; 85) "Vec"
82 TYPE_ARG_LIST@[85; 92)
83 L_ANGLE@[85; 86)
84 TYPE_ARG@[86; 91)
85 PATH_TYPE@[86; 91)
86 PATH@[86; 91)
87 PATH_SEGMENT@[86; 91)
88 NAME_REF@[86; 91)
89 IDENT@[86; 91) "Event"
90 R_ANGLE@[91; 92)
91 R_PAREN@[92; 93)
92 WHITESPACE@[93; 94)
93 BLOCK_EXPR@[94; 389)
94 L_CURLY@[94; 95)
95 WHITESPACE@[95; 100)
96 LET_STMT@[100; 125)
97 LET_KW@[100; 103)
98 WHITESPACE@[103; 104)
99 BIND_PAT@[104; 120)
100 MUT_KW@[104; 107)
101 WHITESPACE@[107; 108)
102 NAME@[108; 120)
103 IDENT@[108; 120) "next_tok_idx"
104 WHITESPACE@[120; 121)
105 EQ@[121; 122)
106 WHITESPACE@[122; 123)
107 LITERAL@[123; 124)
108 INT_NUMBER@[123; 124) "0"
109 SEMI@[124; 125)
110 WHITESPACE@[125; 130)
111 LET_STMT@[130; 389)
112 LET_KW@[130; 133)
113 WHITESPACE@[133; 134)
114 BIND_PAT@[134; 140)
115 NAME@[134; 140)
116 IDENT@[134; 140) "eat_ws"
117 WHITESPACE@[140; 141)
118 EQ@[141; 142)
119 WHITESPACE@[142; 143)
120 LAMBDA_EXPR@[143; 389)
121 PARAM_LIST@[143; 388)
122 PIPE@[143; 144)
123 PARAM@[144; 159)
124 BIND_PAT@[144; 147)
125 NAME@[144; 147)
126 IDENT@[144; 147) "idx"
127 COLON@[147; 148)
128 WHITESPACE@[148; 149)
129 REFERENCE_TYPE@[149; 159)
130 AMP@[149; 150)
131 MUT_KW@[150; 153)
132 WHITESPACE@[153; 154)
133 PATH_TYPE@[154; 159)
134 PATH@[154; 159)
135 PATH_SEGMENT@[154; 159)
136 NAME_REF@[154; 159)
137 IDENT@[154; 159) "usize"
138 COMMA@[159; 160)
139 WHITESPACE@[160; 161)
140 PARAM@[161; 167)
141 REF_PAT@[161; 167)
142 AMP@[161; 162)
143 MUT_KW@[162; 165)
144 WHITESPACE@[165; 166)
145 err: `expected pattern`
146 ERROR@[166; 167)
147 PIPE@[166; 167)
148 err: `expected COMMA`
149 WHITESPACE@[167; 168)
150 err: `expected pattern`
151 PARAM@[168; 169)
152 ERROR@[168; 169)
153 L_CURLY@[168; 169)
154 err: `expected COMMA`
155 WHITESPACE@[169; 178)
156 err: `expected pattern`
157 PARAM@[178; 183)
158 ERROR@[178; 183)
159 WHILE_KW@[178; 183)
160 err: `expected COMMA`
161 WHITESPACE@[183; 184)
162 err: `expected pattern`
163 PARAM@[184; 187)
164 ERROR@[184; 187)
165 LET_KW@[184; 187)
166 err: `expected COMMA`
167 WHITESPACE@[187; 188)
168 PARAM@[188; 199)
169 TUPLE_STRUCT_PAT@[188; 199)
170 PATH@[188; 192)
171 PATH_SEGMENT@[188; 192)
172 NAME_REF@[188; 192)
173 IDENT@[188; 192) "Some"
174 L_PAREN@[192; 193)
175 BIND_PAT@[193; 198)
176 NAME@[193; 198)
177 IDENT@[193; 198) "token"
178 R_PAREN@[198; 199)
179 err: `expected COMMA`
180 WHITESPACE@[199; 200)
181 err: `expected pattern`
182 PARAM@[200; 201)
183 ERROR@[200; 201)
184 EQ@[200; 201)
185 err: `expected COMMA`
186 WHITESPACE@[201; 202)
187 PARAM@[202; 208)
188 BIND_PAT@[202; 208)
189 NAME@[202; 208)
190 IDENT@[202; 208) "tokens"
191 err: `expected COMMA`
192 err: `expected pattern`
193 PARAM@[208; 209)
194 ERROR@[208; 209)
195 DOT@[208; 209)
196 err: `expected COMMA`
197 PARAM@[209; 218)
198 TUPLE_STRUCT_PAT@[209; 218)
199 PATH@[209; 212)
200 PATH_SEGMENT@[209; 212)
201 NAME_REF@[209; 212)
202 IDENT@[209; 212) "get"
203 L_PAREN@[212; 213)
204 err: `expected pattern`
205 ERROR@[213; 214)
206 STAR@[213; 214)
207 err: `expected COMMA`
208 BIND_PAT@[214; 217)
209 NAME@[214; 217)
210 IDENT@[214; 217) "idx"
211 R_PAREN@[217; 218)
212 err: `expected COMMA`
213 WHITESPACE@[218; 219)
214 err: `expected pattern`
215 PARAM@[219; 220)
216 ERROR@[219; 220)
217 L_CURLY@[219; 220)
218 err: `expected COMMA`
219 WHITESPACE@[220; 233)
220 err: `expected pattern`
221 PARAM@[233; 235)
222 ERROR@[233; 235)
223 IF_KW@[233; 235)
224 err: `expected COMMA`
225 WHITESPACE@[235; 236)
226 err: `expected pattern`
227 PARAM@[236; 237)
228 ERROR@[236; 237)
229 EXCL@[236; 237)
230 err: `expected COMMA`
231 PARAM@[237; 242)
232 BIND_PAT@[237; 242)
233 NAME@[237; 242)
234 IDENT@[237; 242) "token"
235 err: `expected COMMA`
236 err: `expected pattern`
237 PARAM@[242; 243)
238 ERROR@[242; 243)
239 DOT@[242; 243)
240 err: `expected COMMA`
241 PARAM@[243; 247)
242 BIND_PAT@[243; 247)
243 NAME@[243; 247)
244 IDENT@[243; 247) "kind"
245 err: `expected COMMA`
246 err: `expected pattern`
247 PARAM@[247; 248)
248 ERROR@[247; 248)
249 DOT@[247; 248)
250 err: `expected COMMA`
251 PARAM@[248; 259)
252 TUPLE_STRUCT_PAT@[248; 259)
253 PATH@[248; 257)
254 PATH_SEGMENT@[248; 257)
255 NAME_REF@[248; 257)
256 IDENT@[248; 257) "is_trivia"
257 L_PAREN@[257; 258)
258 R_PAREN@[258; 259)
259 err: `expected COMMA`
260 WHITESPACE@[259; 260)
261 err: `expected pattern`
262 PARAM@[260; 261)
263 ERROR@[260; 261)
264 L_CURLY@[260; 261)
265 err: `expected COMMA`
266 WHITESPACE@[261; 278)
267 PARAM@[278; 283)
268 BIND_PAT@[278; 283)
269 NAME@[278; 283)
270 IDENT@[278; 283) "break"
271 err: `expected COMMA`
272 err: `expected pattern`
273 PARAM@[283; 284)
274 ERROR@[283; 284)
275 SEMI@[283; 284)
276 err: `expected COMMA`
277 WHITESPACE@[284; 297)
278 err: `expected pattern`
279 PARAM@[297; 298)
280 ERROR@[297; 298)
281 R_CURLY@[297; 298)
282 err: `expected COMMA`
283 WHITESPACE@[298; 311)
284 PARAM@[311; 318)
285 BIND_PAT@[311; 318)
286 NAME@[311; 318)
287 IDENT@[311; 318) "builder"
288 err: `expected COMMA`
289 err: `expected pattern`
290 PARAM@[318; 319)
291 ERROR@[318; 319)
292 DOT@[318; 319)
293 err: `expected COMMA`
294 PARAM@[319; 346)
295 TUPLE_STRUCT_PAT@[319; 346)
296 PATH@[319; 323)
297 PATH_SEGMENT@[319; 323)
298 NAME_REF@[319; 323)
299 IDENT@[319; 323) "leaf"
300 L_PAREN@[323; 324)
301 BIND_PAT@[324; 329)
302 NAME@[324; 329)
303 IDENT@[324; 329) "token"
304 err: `expected COMMA`
305 err: `expected pattern`
306 ERROR@[329; 330)
307 DOT@[329; 330)
308 err: `expected COMMA`
309 BIND_PAT@[330; 334)
310 NAME@[330; 334)
311 IDENT@[330; 334) "kind"
312 COMMA@[334; 335)
313 WHITESPACE@[335; 336)
314 BIND_PAT@[336; 341)
315 NAME@[336; 341)
316 IDENT@[336; 341) "token"
317 err: `expected COMMA`
318 err: `expected pattern`
319 ERROR@[341; 342)
320 DOT@[341; 342)
321 err: `expected COMMA`
322 BIND_PAT@[342; 345)
323 NAME@[342; 345)
324 IDENT@[342; 345) "len"
325 R_PAREN@[345; 346)
326 err: `expected COMMA`
327 err: `expected pattern`
328 PARAM@[346; 347)
329 ERROR@[346; 347)
330 SEMI@[346; 347)
331 err: `expected COMMA`
332 WHITESPACE@[347; 360)
333 err: `expected pattern`
334 PARAM@[360; 361)
335 ERROR@[360; 361)
336 STAR@[360; 361)
337 err: `expected COMMA`
338 PARAM@[361; 364)
339 BIND_PAT@[361; 364)
340 NAME@[361; 364)
341 IDENT@[361; 364) "idx"
342 err: `expected COMMA`
343 WHITESPACE@[364; 365)
344 err: `expected pattern`
345 PARAM@[365; 366)
346 ERROR@[365; 366)
347 PLUS@[365; 366)
348 err: `expected COMMA`
349 err: `expected pattern`
350 PARAM@[366; 367)
351 ERROR@[366; 367)
352 EQ@[366; 367)
353 err: `expected COMMA`
354 WHITESPACE@[367; 368)
355 PARAM@[368; 369)
356 LITERAL@[368; 369)
357 INT_NUMBER@[368; 369) "1"
358 err: `expected COMMA`
359 WHITESPACE@[369; 378)
360 err: `expected pattern`
361 PARAM@[378; 379)
362 ERROR@[378; 379)
363 R_CURLY@[378; 379)
364 err: `expected COMMA`
365 WHITESPACE@[379; 384)
366 err: `expected pattern`
367 PARAM@[384; 385)
368 ERROR@[384; 385)
369 R_CURLY@[384; 385)
370 err: `expected COMMA`
371 err: `expected pattern`
372 PARAM@[385; 386)
373 ERROR@[385; 386)
374 SEMI@[385; 386)
375 err: `expected COMMA`
376 WHITESPACE@[386; 387)
377 err: `expected pattern`
378 PARAM@[387; 388)
379 ERROR@[387; 388)
380 R_CURLY@[387; 388)
381 err: `expected COMMA`
382 err: `expected PIPE`
383 WHITESPACE@[388; 389)
384 err: `expected expression`
385 err: `expected SEMI`
386 err: `expected R_CURLY`
387 ERROR@[389; 389)
diff --git a/crates/ra_syntax/tests/data/parser/err/0013_invalid_type.rs b/crates/ra_syntax/tests/data/parser/err/0013_invalid_type.rs
new file mode 100644
index 000000000..20dde3bc3
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0013_invalid_type.rs
@@ -0,0 +1,7 @@
1pub struct Cache(
2 RefCell<HashMap<
3 TypeId,
4 Box<@ Any>,
5 >>
6);
7
diff --git a/crates/ra_syntax/tests/data/parser/err/0013_invalid_type.txt b/crates/ra_syntax/tests/data/parser/err/0013_invalid_type.txt
new file mode 100644
index 000000000..e1a6b6432
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0013_invalid_type.txt
@@ -0,0 +1,89 @@
1ROOT@[0; 86)
2 STRUCT_DEF@[0; 72)
3 VISIBILITY@[0; 3)
4 PUB_KW@[0; 3)
5 WHITESPACE@[3; 4)
6 STRUCT_KW@[4; 10)
7 WHITESPACE@[10; 11)
8 NAME@[11; 16)
9 IDENT@[11; 16) "Cache"
10 POS_FIELD_LIST@[16; 72)
11 L_PAREN@[16; 17)
12 WHITESPACE@[17; 22)
13 POS_FIELD@[22; 68)
14 PATH_TYPE@[22; 68)
15 PATH@[22; 68)
16 PATH_SEGMENT@[22; 68)
17 NAME_REF@[22; 29)
18 IDENT@[22; 29) "RefCell"
19 TYPE_ARG_LIST@[29; 68)
20 L_ANGLE@[29; 30)
21 TYPE_ARG@[30; 68)
22 PATH_TYPE@[30; 68)
23 PATH@[30; 68)
24 PATH_SEGMENT@[30; 68)
25 NAME_REF@[30; 37)
26 IDENT@[30; 37) "HashMap"
27 TYPE_ARG_LIST@[37; 68)
28 L_ANGLE@[37; 38)
29 WHITESPACE@[38; 47)
30 TYPE_ARG@[47; 53)
31 PATH_TYPE@[47; 53)
32 PATH@[47; 53)
33 PATH_SEGMENT@[47; 53)
34 NAME_REF@[47; 53)
35 IDENT@[47; 53) "TypeId"
36 COMMA@[53; 54)
37 WHITESPACE@[54; 63)
38 TYPE_ARG@[63; 68)
39 PATH_TYPE@[63; 68)
40 PATH@[63; 68)
41 PATH_SEGMENT@[63; 68)
42 NAME_REF@[63; 66)
43 IDENT@[63; 66) "Box"
44 TYPE_ARG_LIST@[66; 68)
45 L_ANGLE@[66; 67)
46 err: `expected type`
47 TYPE_ARG@[67; 68)
48 ERROR@[67; 68)
49 AT@[67; 68)
50 err: `expected COMMA`
51 err: `expected R_ANGLE`
52 err: `expected COMMA`
53 err: `expected R_ANGLE`
54 err: `expected COMMA`
55 err: `expected R_ANGLE`
56 err: `expected COMMA`
57 WHITESPACE@[68; 69)
58 POS_FIELD@[69; 72)
59 PATH_TYPE@[69; 72)
60 PATH@[69; 72)
61 PATH_SEGMENT@[69; 72)
62 NAME_REF@[69; 72)
63 IDENT@[69; 72) "Any"
64 err: `expected COMMA`
65 err: `expected a type`
66 err: `expected R_PAREN`
67 err: `expected SEMI`
68 err: `expected an item`
69 ERROR@[72; 72)
70 ERROR@[72; 73)
71 R_ANGLE@[72; 73)
72 err: `expected an item`
73 ERROR@[73; 74)
74 COMMA@[73; 74)
75 WHITESPACE@[74; 79)
76 err: `expected an item`
77 ERROR@[79; 80)
78 R_ANGLE@[79; 80)
79 err: `expected an item`
80 ERROR@[80; 81)
81 R_ANGLE@[80; 81)
82 WHITESPACE@[81; 82)
83 err: `expected an item`
84 ERROR@[82; 83)
85 R_PAREN@[82; 83)
86 err: `expected an item`
87 ERROR@[83; 84)
88 SEMI@[83; 84)
89 WHITESPACE@[84; 86)
diff --git a/crates/ra_syntax/tests/data/parser/err/0014_where_no_bounds.rs b/crates/ra_syntax/tests/data/parser/err/0014_where_no_bounds.rs
new file mode 100644
index 000000000..75c1d2f98
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0014_where_no_bounds.rs
@@ -0,0 +1 @@
fn foo<T>() where T {}
diff --git a/crates/ra_syntax/tests/data/parser/err/0014_where_no_bounds.txt b/crates/ra_syntax/tests/data/parser/err/0014_where_no_bounds.txt
new file mode 100644
index 000000000..37826ce86
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0014_where_no_bounds.txt
@@ -0,0 +1,31 @@
1ROOT@[0; 23)
2 FN_DEF@[0; 22)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 TYPE_PARAM_LIST@[6; 9)
8 L_ANGLE@[6; 7)
9 TYPE_PARAM@[7; 8)
10 NAME@[7; 8)
11 IDENT@[7; 8) "T"
12 R_ANGLE@[8; 9)
13 PARAM_LIST@[9; 11)
14 L_PAREN@[9; 10)
15 R_PAREN@[10; 11)
16 WHITESPACE@[11; 12)
17 WHERE_CLAUSE@[12; 19)
18 WHERE_KW@[12; 17)
19 WHITESPACE@[17; 18)
20 WHERE_PRED@[18; 19)
21 PATH_TYPE@[18; 19)
22 PATH@[18; 19)
23 PATH_SEGMENT@[18; 19)
24 NAME_REF@[18; 19)
25 IDENT@[18; 19) "T"
26 err: `expected colon`
27 WHITESPACE@[19; 20)
28 BLOCK@[20; 22)
29 L_CURLY@[20; 21)
30 R_CURLY@[21; 22)
31 WHITESPACE@[22; 23)
diff --git a/crates/ra_syntax/tests/data/parser/err/0015_curly_in_params.rs b/crates/ra_syntax/tests/data/parser/err/0015_curly_in_params.rs
new file mode 100644
index 000000000..156e70251
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0015_curly_in_params.rs
@@ -0,0 +1,2 @@
1fn foo(}) {
2}
diff --git a/crates/ra_syntax/tests/data/parser/err/0015_curly_in_params.txt b/crates/ra_syntax/tests/data/parser/err/0015_curly_in_params.txt
new file mode 100644
index 000000000..5f736a978
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0015_curly_in_params.txt
@@ -0,0 +1,24 @@
1ROOT@[0; 14)
2 FN_DEF@[0; 7)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 7)
8 L_PAREN@[6; 7)
9 err: `expected value parameter`
10 err: `expected R_PAREN`
11 err: `expected a block`
12 err: `unmatched `}``
13 ERROR@[7; 8)
14 R_CURLY@[7; 8)
15 err: `expected an item`
16 ERROR@[8; 9)
17 R_PAREN@[8; 9)
18 WHITESPACE@[9; 10)
19 err: `expected an item`
20 ERROR@[10; 13)
21 L_CURLY@[10; 11)
22 WHITESPACE@[11; 12)
23 R_CURLY@[12; 13)
24 WHITESPACE@[13; 14)
diff --git a/crates/ra_syntax/tests/data/parser/err/0016_missing_semi.rs b/crates/ra_syntax/tests/data/parser/err/0016_missing_semi.rs
new file mode 100644
index 000000000..9ae857686
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0016_missing_semi.rs
@@ -0,0 +1,6 @@
1fn foo() {
2 foo(
3 1, 2
4 )
5 return 92;
6}
diff --git a/crates/ra_syntax/tests/data/parser/err/0016_missing_semi.txt b/crates/ra_syntax/tests/data/parser/err/0016_missing_semi.txt
new file mode 100644
index 000000000..a3163adcb
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0016_missing_semi.txt
@@ -0,0 +1,43 @@
1ROOT@[0; 56)
2 FN_DEF@[0; 55)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 8)
8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9)
11 BLOCK@[9; 55)
12 L_CURLY@[9; 10)
13 WHITESPACE@[10; 15)
14 EXPR_STMT@[15; 38)
15 CALL_EXPR@[15; 38)
16 PATH_EXPR@[15; 18)
17 PATH@[15; 18)
18 PATH_SEGMENT@[15; 18)
19 NAME_REF@[15; 18)
20 IDENT@[15; 18) "foo"
21 ARG_LIST@[18; 38)
22 L_PAREN@[18; 19)
23 WHITESPACE@[19; 28)
24 LITERAL@[28; 29)
25 INT_NUMBER@[28; 29) "1"
26 COMMA@[29; 30)
27 WHITESPACE@[30; 31)
28 LITERAL@[31; 32)
29 INT_NUMBER@[31; 32) "2"
30 WHITESPACE@[32; 37)
31 R_PAREN@[37; 38)
32 err: `expected SEMI`
33 WHITESPACE@[38; 43)
34 EXPR_STMT@[43; 53)
35 RETURN_EXPR@[43; 52)
36 RETURN_KW@[43; 49)
37 WHITESPACE@[49; 50)
38 LITERAL@[50; 52)
39 INT_NUMBER@[50; 52) "92"
40 SEMI@[52; 53)
41 WHITESPACE@[53; 54)
42 R_CURLY@[54; 55)
43 WHITESPACE@[55; 56)
diff --git a/crates/ra_syntax/tests/data/parser/err/0017_incomplete_binexpr.rs b/crates/ra_syntax/tests/data/parser/err/0017_incomplete_binexpr.rs
new file mode 100644
index 000000000..17bd49777
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0017_incomplete_binexpr.rs
@@ -0,0 +1,4 @@
1fn foo(foo: i32) {
2 let bar = 92;
3 1 +
4}
diff --git a/crates/ra_syntax/tests/data/parser/err/0017_incomplete_binexpr.txt b/crates/ra_syntax/tests/data/parser/err/0017_incomplete_binexpr.txt
new file mode 100644
index 000000000..f0be287ad
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0017_incomplete_binexpr.txt
@@ -0,0 +1,46 @@
1ROOT@[0; 47)
2 FN_DEF@[0; 46)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 16)
8 L_PAREN@[6; 7)
9 PARAM@[7; 15)
10 BIND_PAT@[7; 10)
11 NAME@[7; 10)
12 IDENT@[7; 10) "foo"
13 COLON@[10; 11)
14 WHITESPACE@[11; 12)
15 PATH_TYPE@[12; 15)
16 PATH@[12; 15)
17 PATH_SEGMENT@[12; 15)
18 NAME_REF@[12; 15)
19 IDENT@[12; 15) "i32"
20 R_PAREN@[15; 16)
21 WHITESPACE@[16; 17)
22 BLOCK@[17; 46)
23 L_CURLY@[17; 18)
24 WHITESPACE@[18; 23)
25 LET_STMT@[23; 36)
26 LET_KW@[23; 26)
27 WHITESPACE@[26; 27)
28 BIND_PAT@[27; 30)
29 NAME@[27; 30)
30 IDENT@[27; 30) "bar"
31 WHITESPACE@[30; 31)
32 EQ@[31; 32)
33 WHITESPACE@[32; 33)
34 LITERAL@[33; 35)
35 INT_NUMBER@[33; 35) "92"
36 SEMI@[35; 36)
37 WHITESPACE@[36; 41)
38 BIN_EXPR@[41; 44)
39 LITERAL@[41; 42)
40 INT_NUMBER@[41; 42) "1"
41 WHITESPACE@[42; 43)
42 PLUS@[43; 44)
43 err: `expected expression`
44 WHITESPACE@[44; 45)
45 R_CURLY@[45; 46)
46 WHITESPACE@[46; 47)
diff --git a/crates/ra_syntax/tests/data/parser/err/0018_incomplete_fn.rs b/crates/ra_syntax/tests/data/parser/err/0018_incomplete_fn.rs
new file mode 100644
index 000000000..fe604006c
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0018_incomplete_fn.rs
@@ -0,0 +1,8 @@
1impl FnScopes {
2 fn new_scope(&) -> ScopeId {
3 let res = self.scopes.len();
4 self.scopes.push(ScopeData { parent: None, entries: vec![] })
5 }
6
7 fn set_parent
8}
diff --git a/crates/ra_syntax/tests/data/parser/err/0018_incomplete_fn.txt b/crates/ra_syntax/tests/data/parser/err/0018_incomplete_fn.txt
new file mode 100644
index 000000000..c4d9f5e7e
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0018_incomplete_fn.txt
@@ -0,0 +1,131 @@
1ROOT@[0; 183)
2 IMPL_ITEM@[0; 182)
3 IMPL_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 PATH_TYPE@[5; 13)
6 PATH@[5; 13)
7 PATH_SEGMENT@[5; 13)
8 NAME_REF@[5; 13)
9 IDENT@[5; 13) "FnScopes"
10 WHITESPACE@[13; 14)
11 ITEM_LIST@[14; 182)
12 L_CURLY@[14; 15)
13 WHITESPACE@[15; 20)
14 FN_DEF@[20; 161)
15 FN_KW@[20; 22)
16 WHITESPACE@[22; 23)
17 NAME@[23; 32)
18 IDENT@[23; 32) "new_scope"
19 PARAM_LIST@[32; 35)
20 L_PAREN@[32; 33)
21 PARAM@[33; 34)
22 REF_PAT@[33; 34)
23 AMP@[33; 34)
24 err: `expected pattern`
25 err: `expected COLON`
26 err: `expected type`
27 R_PAREN@[34; 35)
28 WHITESPACE@[35; 36)
29 RET_TYPE@[36; 46)
30 THIN_ARROW@[36; 38)
31 WHITESPACE@[38; 39)
32 PATH_TYPE@[39; 46)
33 PATH@[39; 46)
34 PATH_SEGMENT@[39; 46)
35 NAME_REF@[39; 46)
36 IDENT@[39; 46) "ScopeId"
37 WHITESPACE@[46; 47)
38 BLOCK@[47; 161)
39 L_CURLY@[47; 48)
40 WHITESPACE@[48; 57)
41 LET_STMT@[57; 85)
42 LET_KW@[57; 60)
43 WHITESPACE@[60; 61)
44 BIND_PAT@[61; 64)
45 NAME@[61; 64)
46 IDENT@[61; 64) "res"
47 WHITESPACE@[64; 65)
48 EQ@[65; 66)
49 WHITESPACE@[66; 67)
50 METHOD_CALL_EXPR@[67; 84)
51 FIELD_EXPR@[67; 78)
52 PATH_EXPR@[67; 71)
53 PATH@[67; 71)
54 PATH_SEGMENT@[67; 71)
55 SELF_KW@[67; 71)
56 DOT@[71; 72)
57 NAME_REF@[72; 78)
58 IDENT@[72; 78) "scopes"
59 DOT@[78; 79)
60 NAME_REF@[79; 82)
61 IDENT@[79; 82) "len"
62 ARG_LIST@[82; 84)
63 L_PAREN@[82; 83)
64 R_PAREN@[83; 84)
65 SEMI@[84; 85)
66 WHITESPACE@[85; 94)
67 METHOD_CALL_EXPR@[94; 155)
68 FIELD_EXPR@[94; 105)
69 PATH_EXPR@[94; 98)
70 PATH@[94; 98)
71 PATH_SEGMENT@[94; 98)
72 SELF_KW@[94; 98)
73 DOT@[98; 99)
74 NAME_REF@[99; 105)
75 IDENT@[99; 105) "scopes"
76 DOT@[105; 106)
77 NAME_REF@[106; 110)
78 IDENT@[106; 110) "push"
79 ARG_LIST@[110; 155)
80 L_PAREN@[110; 111)
81 STRUCT_LIT@[111; 154)
82 PATH@[111; 120)
83 PATH_SEGMENT@[111; 120)
84 NAME_REF@[111; 120)
85 IDENT@[111; 120) "ScopeData"
86 WHITESPACE@[120; 121)
87 NAMED_FIELD_LIST@[121; 154)
88 L_CURLY@[121; 122)
89 WHITESPACE@[122; 123)
90 NAMED_FIELD@[123; 135)
91 NAME_REF@[123; 129)
92 IDENT@[123; 129) "parent"
93 COLON@[129; 130)
94 WHITESPACE@[130; 131)
95 PATH_EXPR@[131; 135)
96 PATH@[131; 135)
97 PATH_SEGMENT@[131; 135)
98 NAME_REF@[131; 135)
99 IDENT@[131; 135) "None"
100 COMMA@[135; 136)
101 WHITESPACE@[136; 137)
102 NAMED_FIELD@[137; 152)
103 NAME_REF@[137; 144)
104 IDENT@[137; 144) "entries"
105 COLON@[144; 145)
106 WHITESPACE@[145; 146)
107 MACRO_CALL@[146; 152)
108 PATH@[146; 149)
109 PATH_SEGMENT@[146; 149)
110 NAME_REF@[146; 149)
111 IDENT@[146; 149) "vec"
112 EXCL@[149; 150)
113 TOKEN_TREE@[150; 152)
114 L_BRACK@[150; 151)
115 R_BRACK@[151; 152)
116 WHITESPACE@[152; 153)
117 R_CURLY@[153; 154)
118 R_PAREN@[154; 155)
119 WHITESPACE@[155; 160)
120 R_CURLY@[160; 161)
121 WHITESPACE@[161; 167)
122 FN_DEF@[167; 180)
123 FN_KW@[167; 169)
124 WHITESPACE@[169; 170)
125 NAME@[170; 180)
126 IDENT@[170; 180) "set_parent"
127 err: `expected function arguments`
128 err: `expected a block`
129 WHITESPACE@[180; 181)
130 R_CURLY@[181; 182)
131 WHITESPACE@[182; 183)
diff --git a/crates/ra_syntax/tests/data/parser/err/0019_let_recover.rs b/crates/ra_syntax/tests/data/parser/err/0019_let_recover.rs
new file mode 100644
index 000000000..48bf3d68b
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0019_let_recover.rs
@@ -0,0 +1,12 @@
1fn foo() {
2 let foo =
3 let bar = 1;
4 let
5 let baz = 92;
6 let
7 if true {}
8 let
9 while true {}
10 let
11 loop {}
12}
diff --git a/crates/ra_syntax/tests/data/parser/err/0019_let_recover.txt b/crates/ra_syntax/tests/data/parser/err/0019_let_recover.txt
new file mode 100644
index 000000000..6e74771f1
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0019_let_recover.txt
@@ -0,0 +1,103 @@
1ROOT@[0; 139)
2 FN_DEF@[0; 138)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 8)
8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9)
11 BLOCK@[9; 138)
12 L_CURLY@[9; 10)
13 WHITESPACE@[10; 15)
14 LET_STMT@[15; 24)
15 LET_KW@[15; 18)
16 WHITESPACE@[18; 19)
17 BIND_PAT@[19; 22)
18 NAME@[19; 22)
19 IDENT@[19; 22) "foo"
20 WHITESPACE@[22; 23)
21 EQ@[23; 24)
22 err: `expected expression`
23 err: `expected SEMI`
24 WHITESPACE@[24; 29)
25 LET_STMT@[29; 41)
26 LET_KW@[29; 32)
27 WHITESPACE@[32; 33)
28 BIND_PAT@[33; 36)
29 NAME@[33; 36)
30 IDENT@[33; 36) "bar"
31 WHITESPACE@[36; 37)
32 EQ@[37; 38)
33 WHITESPACE@[38; 39)
34 LITERAL@[39; 40)
35 INT_NUMBER@[39; 40) "1"
36 SEMI@[40; 41)
37 WHITESPACE@[41; 46)
38 LET_STMT@[46; 49)
39 LET_KW@[46; 49)
40 err: `expected pattern`
41 err: `expected SEMI`
42 WHITESPACE@[49; 54)
43 LET_STMT@[54; 67)
44 LET_KW@[54; 57)
45 WHITESPACE@[57; 58)
46 BIND_PAT@[58; 61)
47 NAME@[58; 61)
48 IDENT@[58; 61) "baz"
49 WHITESPACE@[61; 62)
50 EQ@[62; 63)
51 WHITESPACE@[63; 64)
52 LITERAL@[64; 66)
53 INT_NUMBER@[64; 66) "92"
54 SEMI@[66; 67)
55 WHITESPACE@[67; 72)
56 LET_STMT@[72; 75)
57 LET_KW@[72; 75)
58 err: `expected pattern`
59 err: `expected SEMI`
60 WHITESPACE@[75; 80)
61 EXPR_STMT@[80; 90)
62 IF_EXPR@[80; 90)
63 IF_KW@[80; 82)
64 WHITESPACE@[82; 83)
65 CONDITION@[83; 87)
66 LITERAL@[83; 87)
67 TRUE_KW@[83; 87)
68 WHITESPACE@[87; 88)
69 BLOCK@[88; 90)
70 L_CURLY@[88; 89)
71 R_CURLY@[89; 90)
72 WHITESPACE@[90; 95)
73 LET_STMT@[95; 98)
74 LET_KW@[95; 98)
75 err: `expected pattern`
76 err: `expected SEMI`
77 WHITESPACE@[98; 103)
78 EXPR_STMT@[103; 116)
79 WHILE_EXPR@[103; 116)
80 WHILE_KW@[103; 108)
81 WHITESPACE@[108; 109)
82 CONDITION@[109; 113)
83 LITERAL@[109; 113)
84 TRUE_KW@[109; 113)
85 WHITESPACE@[113; 114)
86 BLOCK@[114; 116)
87 L_CURLY@[114; 115)
88 R_CURLY@[115; 116)
89 WHITESPACE@[116; 121)
90 LET_STMT@[121; 124)
91 LET_KW@[121; 124)
92 err: `expected pattern`
93 err: `expected SEMI`
94 WHITESPACE@[124; 129)
95 LOOP_EXPR@[129; 136)
96 LOOP_KW@[129; 133)
97 WHITESPACE@[133; 134)
98 BLOCK@[134; 136)
99 L_CURLY@[134; 135)
100 R_CURLY@[135; 136)
101 WHITESPACE@[136; 137)
102 R_CURLY@[137; 138)
103 WHITESPACE@[138; 139)
diff --git a/crates/ra_syntax/tests/data/parser/err/0020_fn_recover.rs b/crates/ra_syntax/tests/data/parser/err/0020_fn_recover.rs
new file mode 100644
index 000000000..3393b668b
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0020_fn_recover.rs
@@ -0,0 +1,3 @@
1fn
2
3fn foo() {}
diff --git a/crates/ra_syntax/tests/data/parser/err/0020_fn_recover.txt b/crates/ra_syntax/tests/data/parser/err/0020_fn_recover.txt
new file mode 100644
index 000000000..b5218b0fa
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0020_fn_recover.txt
@@ -0,0 +1,20 @@
1ROOT@[0; 16)
2 FN_DEF@[0; 2)
3 FN_KW@[0; 2)
4 err: `expected a name`
5 err: `expected function arguments`
6 err: `expected a block`
7 WHITESPACE@[2; 4)
8 FN_DEF@[4; 15)
9 FN_KW@[4; 6)
10 WHITESPACE@[6; 7)
11 NAME@[7; 10)
12 IDENT@[7; 10) "foo"
13 PARAM_LIST@[10; 12)
14 L_PAREN@[10; 11)
15 R_PAREN@[11; 12)
16 WHITESPACE@[12; 13)
17 BLOCK@[13; 15)
18 L_CURLY@[13; 14)
19 R_CURLY@[14; 15)
20 WHITESPACE@[15; 16)
diff --git a/crates/ra_syntax/tests/data/parser/err/0021_incomplete_param.rs b/crates/ra_syntax/tests/data/parser/err/0021_incomplete_param.rs
new file mode 100644
index 000000000..7a6c264f6
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0021_incomplete_param.rs
@@ -0,0 +1,2 @@
1fn foo(x: i32, y) {
2}
diff --git a/crates/ra_syntax/tests/data/parser/err/0021_incomplete_param.txt b/crates/ra_syntax/tests/data/parser/err/0021_incomplete_param.txt
new file mode 100644
index 000000000..8dcb58ae2
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0021_incomplete_param.txt
@@ -0,0 +1,34 @@
1ROOT@[0; 22)
2 FN_DEF@[0; 21)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 17)
8 L_PAREN@[6; 7)
9 PARAM@[7; 13)
10 BIND_PAT@[7; 8)
11 NAME@[7; 8)
12 IDENT@[7; 8) "x"
13 COLON@[8; 9)
14 WHITESPACE@[9; 10)
15 PATH_TYPE@[10; 13)
16 PATH@[10; 13)
17 PATH_SEGMENT@[10; 13)
18 NAME_REF@[10; 13)
19 IDENT@[10; 13) "i32"
20 COMMA@[13; 14)
21 WHITESPACE@[14; 15)
22 PARAM@[15; 16)
23 BIND_PAT@[15; 16)
24 NAME@[15; 16)
25 IDENT@[15; 16) "y"
26 err: `expected COLON`
27 err: `expected type`
28 R_PAREN@[16; 17)
29 WHITESPACE@[17; 18)
30 BLOCK@[18; 21)
31 L_CURLY@[18; 19)
32 WHITESPACE@[19; 20)
33 R_CURLY@[20; 21)
34 WHITESPACE@[21; 22)
diff --git a/crates/ra_syntax/tests/data/parser/err/0022_bad_exprs.rs b/crates/ra_syntax/tests/data/parser/err/0022_bad_exprs.rs
new file mode 100644
index 000000000..cd2d493a1
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0022_bad_exprs.rs
@@ -0,0 +1,3 @@
1fn a() { [1, 2, @, struct, let] }
2fn b() { foo(1, 2, @, impl, let) }
3fn c() { foo.bar(1, 2, @, ], trait, let) }
diff --git a/crates/ra_syntax/tests/data/parser/err/0022_bad_exprs.txt b/crates/ra_syntax/tests/data/parser/err/0022_bad_exprs.txt
new file mode 100644
index 000000000..287e56ac4
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0022_bad_exprs.txt
@@ -0,0 +1,189 @@
1ROOT@[0; 112)
2 FN_DEF@[0; 33)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 4)
6 IDENT@[3; 4) "a"
7 PARAM_LIST@[4; 6)
8 L_PAREN@[4; 5)
9 R_PAREN@[5; 6)
10 WHITESPACE@[6; 7)
11 BLOCK@[7; 33)
12 L_CURLY@[7; 8)
13 WHITESPACE@[8; 9)
14 EXPR_STMT@[9; 15)
15 ARRAY_EXPR@[9; 15)
16 L_BRACK@[9; 10)
17 LITERAL@[10; 11)
18 INT_NUMBER@[10; 11) "1"
19 COMMA@[11; 12)
20 WHITESPACE@[12; 13)
21 LITERAL@[13; 14)
22 INT_NUMBER@[13; 14) "2"
23 COMMA@[14; 15)
24 err: `expected expression`
25 err: `expected R_BRACK`
26 err: `expected SEMI`
27 WHITESPACE@[15; 16)
28 err: `expected expression`
29 EXPR_STMT@[16; 17)
30 ERROR@[16; 17)
31 AT@[16; 17)
32 err: `expected SEMI`
33 err: `expected expression`
34 EXPR_STMT@[17; 18)
35 ERROR@[17; 18)
36 COMMA@[17; 18)
37 err: `expected SEMI`
38 WHITESPACE@[18; 19)
39 STRUCT_DEF@[19; 26)
40 STRUCT_KW@[19; 25)
41 err: `expected a name`
42 ERROR@[25; 26)
43 COMMA@[25; 26)
44 err: `expected `;`, `{`, or `(``
45 WHITESPACE@[26; 27)
46 LET_STMT@[27; 31)
47 LET_KW@[27; 30)
48 err: `expected pattern`
49 ERROR@[30; 31)
50 R_BRACK@[30; 31)
51 err: `expected SEMI`
52 WHITESPACE@[31; 32)
53 R_CURLY@[32; 33)
54 WHITESPACE@[33; 34)
55 FN_DEF@[34; 68)
56 FN_KW@[34; 36)
57 WHITESPACE@[36; 37)
58 NAME@[37; 38)
59 IDENT@[37; 38) "b"
60 PARAM_LIST@[38; 40)
61 L_PAREN@[38; 39)
62 R_PAREN@[39; 40)
63 WHITESPACE@[40; 41)
64 BLOCK@[41; 68)
65 L_CURLY@[41; 42)
66 WHITESPACE@[42; 43)
67 EXPR_STMT@[43; 52)
68 CALL_EXPR@[43; 52)
69 PATH_EXPR@[43; 46)
70 PATH@[43; 46)
71 PATH_SEGMENT@[43; 46)
72 NAME_REF@[43; 46)
73 IDENT@[43; 46) "foo"
74 ARG_LIST@[46; 52)
75 L_PAREN@[46; 47)
76 LITERAL@[47; 48)
77 INT_NUMBER@[47; 48) "1"
78 COMMA@[48; 49)
79 WHITESPACE@[49; 50)
80 LITERAL@[50; 51)
81 INT_NUMBER@[50; 51) "2"
82 COMMA@[51; 52)
83 err: `expected expression`
84 err: `expected SEMI`
85 WHITESPACE@[52; 53)
86 err: `expected expression`
87 EXPR_STMT@[53; 54)
88 ERROR@[53; 54)
89 AT@[53; 54)
90 err: `expected SEMI`
91 err: `expected expression`
92 EXPR_STMT@[54; 55)
93 ERROR@[54; 55)
94 COMMA@[54; 55)
95 err: `expected SEMI`
96 WHITESPACE@[55; 56)
97 IMPL_ITEM@[56; 60)
98 IMPL_KW@[56; 60)
99 err: `expected type`
100 err: `expected `{``
101 err: `expected expression`
102 EXPR_STMT@[60; 61)
103 ERROR@[60; 61)
104 COMMA@[60; 61)
105 err: `expected SEMI`
106 WHITESPACE@[61; 62)
107 LET_STMT@[62; 65)
108 LET_KW@[62; 65)
109 err: `expected pattern`
110 err: `expected SEMI`
111 err: `expected expression`
112 ERROR@[65; 66)
113 R_PAREN@[65; 66)
114 WHITESPACE@[66; 67)
115 R_CURLY@[67; 68)
116 WHITESPACE@[68; 69)
117 FN_DEF@[69; 111)
118 FN_KW@[69; 71)
119 WHITESPACE@[71; 72)
120 NAME@[72; 73)
121 IDENT@[72; 73) "c"
122 PARAM_LIST@[73; 75)
123 L_PAREN@[73; 74)
124 R_PAREN@[74; 75)
125 WHITESPACE@[75; 76)
126 BLOCK@[76; 111)
127 L_CURLY@[76; 77)
128 WHITESPACE@[77; 78)
129 EXPR_STMT@[78; 91)
130 METHOD_CALL_EXPR@[78; 91)
131 PATH_EXPR@[78; 81)
132 PATH@[78; 81)
133 PATH_SEGMENT@[78; 81)
134 NAME_REF@[78; 81)
135 IDENT@[78; 81) "foo"
136 DOT@[81; 82)
137 NAME_REF@[82; 85)
138 IDENT@[82; 85) "bar"
139 ARG_LIST@[85; 91)
140 L_PAREN@[85; 86)
141 LITERAL@[86; 87)
142 INT_NUMBER@[86; 87) "1"
143 COMMA@[87; 88)
144 WHITESPACE@[88; 89)
145 LITERAL@[89; 90)
146 INT_NUMBER@[89; 90) "2"
147 COMMA@[90; 91)
148 err: `expected expression`
149 err: `expected SEMI`
150 WHITESPACE@[91; 92)
151 err: `expected expression`
152 EXPR_STMT@[92; 93)
153 ERROR@[92; 93)
154 AT@[92; 93)
155 err: `expected SEMI`
156 err: `expected expression`
157 EXPR_STMT@[93; 94)
158 ERROR@[93; 94)
159 COMMA@[93; 94)
160 err: `expected SEMI`
161 WHITESPACE@[94; 95)
162 err: `expected expression`
163 EXPR_STMT@[95; 96)
164 ERROR@[95; 96)
165 R_BRACK@[95; 96)
166 err: `expected SEMI`
167 err: `expected expression`
168 EXPR_STMT@[96; 97)
169 ERROR@[96; 97)
170 COMMA@[96; 97)
171 err: `expected SEMI`
172 WHITESPACE@[97; 98)
173 TRAIT_DEF@[98; 104)
174 TRAIT_KW@[98; 103)
175 err: `expected a name`
176 ERROR@[103; 104)
177 COMMA@[103; 104)
178 err: `expected `{``
179 WHITESPACE@[104; 105)
180 LET_STMT@[105; 108)
181 LET_KW@[105; 108)
182 err: `expected pattern`
183 err: `expected SEMI`
184 err: `expected expression`
185 ERROR@[108; 109)
186 R_PAREN@[108; 109)
187 WHITESPACE@[109; 110)
188 R_CURLY@[110; 111)
189 WHITESPACE@[111; 112)
diff --git a/crates/ra_syntax/tests/data/parser/err/0023_mismatched_paren.rs b/crates/ra_syntax/tests/data/parser/err/0023_mismatched_paren.rs
new file mode 100644
index 000000000..0206d563e
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0023_mismatched_paren.rs
@@ -0,0 +1,5 @@
1fn main() {
2 foo! (
3 bar, "baz", 1, 2.0
4 } //~ ERROR incorrect close delimiter
5}
diff --git a/crates/ra_syntax/tests/data/parser/err/0023_mismatched_paren.txt b/crates/ra_syntax/tests/data/parser/err/0023_mismatched_paren.txt
new file mode 100644
index 000000000..2df81b12b
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0023_mismatched_paren.txt
@@ -0,0 +1,43 @@
1ROOT@[0; 94)
2 FN_DEF@[0; 55)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 7)
6 IDENT@[3; 7) "main"
7 PARAM_LIST@[7; 9)
8 L_PAREN@[7; 8)
9 R_PAREN@[8; 9)
10 WHITESPACE@[9; 10)
11 BLOCK@[10; 55)
12 L_CURLY@[10; 11)
13 WHITESPACE@[11; 16)
14 MACRO_CALL@[16; 49)
15 PATH@[16; 19)
16 PATH_SEGMENT@[16; 19)
17 NAME_REF@[16; 19)
18 IDENT@[16; 19) "foo"
19 EXCL@[19; 20)
20 WHITESPACE@[20; 21)
21 TOKEN_TREE@[21; 49)
22 L_PAREN@[21; 22)
23 WHITESPACE@[22; 31)
24 IDENT@[31; 34) "bar"
25 COMMA@[34; 35)
26 WHITESPACE@[35; 36)
27 STRING@[36; 41)
28 COMMA@[41; 42)
29 WHITESPACE@[42; 43)
30 INT_NUMBER@[43; 44) "1"
31 COMMA@[44; 45)
32 WHITESPACE@[45; 46)
33 FLOAT_NUMBER@[46; 49) "2.0"
34 err: `unmatched `}``
35 WHITESPACE@[49; 54)
36 R_CURLY@[54; 55)
37 WHITESPACE@[55; 56)
38 COMMENT@[56; 91)
39 WHITESPACE@[91; 92)
40 err: `unmatched `}``
41 ERROR@[92; 93)
42 R_CURLY@[92; 93)
43 WHITESPACE@[93; 94)
diff --git a/crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.rs b/crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.rs
new file mode 100644
index 000000000..6c2e95c02
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.rs
@@ -0,0 +1,7 @@
1fn f<T: (Copy) + (?Sized) + (for<'a> Trait<'a>)>() {}
2
3fn main() {
4 let _: Box<(Copy) + (?Sized) + (for<'a> Trait<'a>)>;
5 let _: Box<(?Sized) + (for<'a> Trait<'a>) + (Copy)>;
6 let _: Box<(for<'a> Trait<'a>) + (Copy) + (?Sized)>;
7}
diff --git a/crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.txt b/crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.txt
new file mode 100644
index 000000000..195c12e08
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0024_many_type_parens.txt
@@ -0,0 +1,310 @@
1ROOT@[0; 240)
2 FN_DEF@[0; 53)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 4)
6 IDENT@[3; 4) "f"
7 TYPE_PARAM_LIST@[4; 48)
8 L_ANGLE@[4; 5)
9 TYPE_PARAM@[5; 47)
10 NAME@[5; 6)
11 IDENT@[5; 6) "T"
12 COLON@[6; 7)
13 WHITESPACE@[7; 8)
14 L_PAREN@[8; 9)
15 PATH_TYPE@[9; 13)
16 PATH@[9; 13)
17 PATH_SEGMENT@[9; 13)
18 NAME_REF@[9; 13)
19 IDENT@[9; 13) "Copy"
20 R_PAREN@[13; 14)
21 WHITESPACE@[14; 15)
22 PLUS@[15; 16)
23 WHITESPACE@[16; 17)
24 L_PAREN@[17; 18)
25 QUESTION@[18; 19)
26 PATH_TYPE@[19; 24)
27 PATH@[19; 24)
28 PATH_SEGMENT@[19; 24)
29 NAME_REF@[19; 24)
30 IDENT@[19; 24) "Sized"
31 R_PAREN@[24; 25)
32 WHITESPACE@[25; 26)
33 PLUS@[26; 27)
34 WHITESPACE@[27; 28)
35 L_PAREN@[28; 29)
36 FOR_TYPE@[29; 46)
37 FOR_KW@[29; 32)
38 TYPE_PARAM_LIST@[32; 36)
39 L_ANGLE@[32; 33)
40 LIFETIME_PARAM@[33; 35)
41 LIFETIME@[33; 35) "'a"
42 R_ANGLE@[35; 36)
43 WHITESPACE@[36; 37)
44 PATH_TYPE@[37; 46)
45 PATH@[37; 46)
46 PATH_SEGMENT@[37; 46)
47 NAME_REF@[37; 42)
48 IDENT@[37; 42) "Trait"
49 TYPE_ARG_LIST@[42; 46)
50 L_ANGLE@[42; 43)
51 LIFETIME_ARG@[43; 45)
52 LIFETIME@[43; 45) "'a"
53 R_ANGLE@[45; 46)
54 R_PAREN@[46; 47)
55 R_ANGLE@[47; 48)
56 PARAM_LIST@[48; 50)
57 L_PAREN@[48; 49)
58 R_PAREN@[49; 50)
59 WHITESPACE@[50; 51)
60 BLOCK@[51; 53)
61 L_CURLY@[51; 52)
62 R_CURLY@[52; 53)
63 WHITESPACE@[53; 55)
64 FN_DEF@[55; 239)
65 FN_KW@[55; 57)
66 WHITESPACE@[57; 58)
67 NAME@[58; 62)
68 IDENT@[58; 62) "main"
69 PARAM_LIST@[62; 64)
70 L_PAREN@[62; 63)
71 R_PAREN@[63; 64)
72 WHITESPACE@[64; 65)
73 BLOCK@[65; 239)
74 L_CURLY@[65; 66)
75 WHITESPACE@[66; 71)
76 LET_STMT@[71; 121)
77 LET_KW@[71; 74)
78 WHITESPACE@[74; 75)
79 PLACEHOLDER_PAT@[75; 76)
80 UNDERSCORE@[75; 76)
81 COLON@[76; 77)
82 WHITESPACE@[77; 78)
83 PATH_TYPE@[78; 121)
84 PATH@[78; 88)
85 PATH_SEGMENT@[78; 88)
86 NAME_REF@[78; 81)
87 IDENT@[78; 81) "Box"
88 TYPE_ARG_LIST@[81; 88)
89 L_ANGLE@[81; 82)
90 TYPE_ARG@[82; 88)
91 PAREN_TYPE@[82; 88)
92 L_PAREN@[82; 83)
93 PATH_TYPE@[83; 87)
94 PATH@[83; 87)
95 PATH_SEGMENT@[83; 87)
96 NAME_REF@[83; 87)
97 IDENT@[83; 87) "Copy"
98 R_PAREN@[87; 88)
99 err: `expected COMMA`
100 err: `expected R_ANGLE`
101 WHITESPACE@[88; 89)
102 PLUS@[89; 90)
103 WHITESPACE@[90; 91)
104 L_PAREN@[91; 92)
105 QUESTION@[92; 93)
106 PATH_TYPE@[93; 98)
107 PATH@[93; 98)
108 PATH_SEGMENT@[93; 98)
109 NAME_REF@[93; 98)
110 IDENT@[93; 98) "Sized"
111 R_PAREN@[98; 99)
112 WHITESPACE@[99; 100)
113 PLUS@[100; 101)
114 WHITESPACE@[101; 102)
115 L_PAREN@[102; 103)
116 FOR_TYPE@[103; 120)
117 FOR_KW@[103; 106)
118 TYPE_PARAM_LIST@[106; 110)
119 L_ANGLE@[106; 107)
120 LIFETIME_PARAM@[107; 109)
121 LIFETIME@[107; 109) "'a"
122 R_ANGLE@[109; 110)
123 WHITESPACE@[110; 111)
124 PATH_TYPE@[111; 120)
125 PATH@[111; 120)
126 PATH_SEGMENT@[111; 120)
127 NAME_REF@[111; 116)
128 IDENT@[111; 116) "Trait"
129 TYPE_ARG_LIST@[116; 120)
130 L_ANGLE@[116; 117)
131 LIFETIME_ARG@[117; 119)
132 LIFETIME@[117; 119) "'a"
133 R_ANGLE@[119; 120)
134 R_PAREN@[120; 121)
135 err: `expected SEMI`
136 err: `expected expression`
137 EXPR_STMT@[121; 123)
138 ERROR@[121; 122)
139 R_ANGLE@[121; 122)
140 SEMI@[122; 123)
141 WHITESPACE@[123; 128)
142 LET_STMT@[128; 141)
143 LET_KW@[128; 131)
144 WHITESPACE@[131; 132)
145 PLACEHOLDER_PAT@[132; 133)
146 UNDERSCORE@[132; 133)
147 COLON@[133; 134)
148 WHITESPACE@[134; 135)
149 PATH_TYPE@[135; 141)
150 PATH@[135; 141)
151 PATH_SEGMENT@[135; 141)
152 NAME_REF@[135; 138)
153 IDENT@[135; 138) "Box"
154 TYPE_ARG_LIST@[138; 141)
155 L_ANGLE@[138; 139)
156 TYPE_ARG@[139; 141)
157 PAREN_TYPE@[139; 141)
158 L_PAREN@[139; 140)
159 err: `expected type`
160 ERROR@[140; 141)
161 QUESTION@[140; 141)
162 err: `expected R_PAREN`
163 err: `expected COMMA`
164 err: `expected R_ANGLE`
165 err: `expected SEMI`
166 EXPR_STMT@[141; 146)
167 PATH_EXPR@[141; 146)
168 PATH@[141; 146)
169 PATH_SEGMENT@[141; 146)
170 NAME_REF@[141; 146)
171 IDENT@[141; 146) "Sized"
172 err: `expected SEMI`
173 err: `expected expression`
174 EXPR_STMT@[146; 147)
175 ERROR@[146; 147)
176 R_PAREN@[146; 147)
177 err: `expected SEMI`
178 WHITESPACE@[147; 148)
179 err: `expected expression`
180 EXPR_STMT@[148; 149)
181 ERROR@[148; 149)
182 PLUS@[148; 149)
183 err: `expected SEMI`
184 WHITESPACE@[149; 150)
185 EXPR_STMT@[150; 151)
186 PAREN_EXPR@[150; 151)
187 L_PAREN@[150; 151)
188 err: `expected expression`
189 err: `expected R_PAREN`
190 err: `expected SEMI`
191 EXPR_STMT@[151; 157)
192 FOR_EXPR@[151; 157)
193 FOR_KW@[151; 154)
194 err: `expected pattern`
195 ERROR@[154; 155)
196 L_ANGLE@[154; 155)
197 err: `expected IN_KW`
198 err: `expected expression`
199 ERROR@[155; 157)
200 LIFETIME@[155; 157) "'a"
201 err: `expected a block`
202 err: `expected expression`
203 EXPR_STMT@[157; 158)
204 ERROR@[157; 158)
205 R_ANGLE@[157; 158)
206 err: `expected SEMI`
207 WHITESPACE@[158; 159)
208 EXPR_STMT@[159; 180)
209 BIN_EXPR@[159; 180)
210 BIN_EXPR@[159; 178)
211 BIN_EXPR@[159; 169)
212 BIN_EXPR@[159; 167)
213 PATH_EXPR@[159; 164)
214 PATH@[159; 164)
215 PATH_SEGMENT@[159; 164)
216 NAME_REF@[159; 164)
217 IDENT@[159; 164) "Trait"
218 L_ANGLE@[164; 165)
219 err: `expected expression`
220 ERROR@[165; 167)
221 LIFETIME@[165; 167) "'a"
222 R_ANGLE@[167; 168)
223 err: `expected expression`
224 ERROR@[168; 169)
225 R_PAREN@[168; 169)
226 WHITESPACE@[169; 170)
227 PLUS@[170; 171)
228 WHITESPACE@[171; 172)
229 PAREN_EXPR@[172; 178)
230 L_PAREN@[172; 173)
231 PATH_EXPR@[173; 177)
232 PATH@[173; 177)
233 PATH_SEGMENT@[173; 177)
234 NAME_REF@[173; 177)
235 IDENT@[173; 177) "Copy"
236 R_PAREN@[177; 178)
237 R_ANGLE@[178; 179)
238 err: `expected expression`
239 ERROR@[179; 180)
240 SEMI@[179; 180)
241 err: `expected SEMI`
242 WHITESPACE@[180; 185)
243 LET_STMT@[185; 235)
244 LET_KW@[185; 188)
245 WHITESPACE@[188; 189)
246 PLACEHOLDER_PAT@[189; 190)
247 UNDERSCORE@[189; 190)
248 COLON@[190; 191)
249 WHITESPACE@[191; 192)
250 PATH_TYPE@[192; 235)
251 PATH@[192; 215)
252 PATH_SEGMENT@[192; 215)
253 NAME_REF@[192; 195)
254 IDENT@[192; 195) "Box"
255 TYPE_ARG_LIST@[195; 215)
256 L_ANGLE@[195; 196)
257 TYPE_ARG@[196; 215)
258 PAREN_TYPE@[196; 215)
259 L_PAREN@[196; 197)
260 FOR_TYPE@[197; 214)
261 FOR_KW@[197; 200)
262 TYPE_PARAM_LIST@[200; 204)
263 L_ANGLE@[200; 201)
264 LIFETIME_PARAM@[201; 203)
265 LIFETIME@[201; 203) "'a"
266 R_ANGLE@[203; 204)
267 WHITESPACE@[204; 205)
268 PATH_TYPE@[205; 214)
269 PATH@[205; 214)
270 PATH_SEGMENT@[205; 214)
271 NAME_REF@[205; 210)
272 IDENT@[205; 210) "Trait"
273 TYPE_ARG_LIST@[210; 214)
274 L_ANGLE@[210; 211)
275 LIFETIME_ARG@[211; 213)
276 LIFETIME@[211; 213) "'a"
277 R_ANGLE@[213; 214)
278 R_PAREN@[214; 215)
279 err: `expected COMMA`
280 err: `expected R_ANGLE`
281 WHITESPACE@[215; 216)
282 PLUS@[216; 217)
283 WHITESPACE@[217; 218)
284 L_PAREN@[218; 219)
285 PATH_TYPE@[219; 223)
286 PATH@[219; 223)
287 PATH_SEGMENT@[219; 223)
288 NAME_REF@[219; 223)
289 IDENT@[219; 223) "Copy"
290 R_PAREN@[223; 224)
291 WHITESPACE@[224; 225)
292 PLUS@[225; 226)
293 WHITESPACE@[226; 227)
294 L_PAREN@[227; 228)
295 QUESTION@[228; 229)
296 PATH_TYPE@[229; 234)
297 PATH@[229; 234)
298 PATH_SEGMENT@[229; 234)
299 NAME_REF@[229; 234)
300 IDENT@[229; 234) "Sized"
301 R_PAREN@[234; 235)
302 err: `expected SEMI`
303 err: `expected expression`
304 EXPR_STMT@[235; 237)
305 ERROR@[235; 236)
306 R_ANGLE@[235; 236)
307 SEMI@[236; 237)
308 WHITESPACE@[237; 238)
309 R_CURLY@[238; 239)
310 WHITESPACE@[239; 240)
diff --git a/crates/ra_syntax/tests/data/parser/err/0025_nope.rs b/crates/ra_syntax/tests/data/parser/err/0025_nope.rs
new file mode 100644
index 000000000..28726ed51
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0025_nope.rs
@@ -0,0 +1,31 @@
1fn main() {
2 enum Test {
3 Var1,
4 Var2(String),
5 Var3 {
6 abc: {}, //~ ERROR: expected type, found `{`
7 },
8 }
9
10 // recover...
11 let a = 1;
12 enum Test2 {
13 Fine,
14 }
15
16 enum Test3 {
17 StillFine {
18 def: i32,
19 },
20 }
21
22 {
23 // fail again
24 enum Test4 {
25 Nope(i32 {}) //~ ERROR: found `{`
26 //~^ ERROR: found `{`
27 }
28 }
29 // still recover later
30 let bad_syntax = _; //~ ERROR: expected expression, found reserved identifier `_`
31}
diff --git a/crates/ra_syntax/tests/data/parser/err/0025_nope.txt b/crates/ra_syntax/tests/data/parser/err/0025_nope.txt
new file mode 100644
index 000000000..c30b8585f
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/err/0025_nope.txt
@@ -0,0 +1,203 @@
1ROOT@[0; 575)
2 FN_DEF@[0; 574)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 7)
6 IDENT@[3; 7) "main"
7 PARAM_LIST@[7; 9)
8 L_PAREN@[7; 8)
9 R_PAREN@[8; 9)
10 WHITESPACE@[9; 10)
11 BLOCK@[10; 574)
12 L_CURLY@[10; 11)
13 WHITESPACE@[11; 16)
14 ENUM_DEF@[16; 152)
15 ENUM_KW@[16; 20)
16 WHITESPACE@[20; 21)
17 NAME@[21; 25)
18 IDENT@[21; 25) "Test"
19 WHITESPACE@[25; 26)
20 ENUM_VARIANT_LIST@[26; 152)
21 L_CURLY@[26; 27)
22 WHITESPACE@[27; 36)
23 ENUM_VARIANT@[36; 40)
24 NAME@[36; 40)
25 IDENT@[36; 40) "Var1"
26 COMMA@[40; 41)
27 WHITESPACE@[41; 50)
28 ENUM_VARIANT@[50; 62)
29 NAME@[50; 54)
30 IDENT@[50; 54) "Var2"
31 POS_FIELD_LIST@[54; 62)
32 L_PAREN@[54; 55)
33 POS_FIELD@[55; 61)
34 PATH_TYPE@[55; 61)
35 PATH@[55; 61)
36 PATH_SEGMENT@[55; 61)
37 NAME_REF@[55; 61)
38 IDENT@[55; 61) "String"
39 R_PAREN@[61; 62)
40 COMMA@[62; 63)
41 WHITESPACE@[63; 72)
42 ENUM_VARIANT@[72; 145)
43 NAME@[72; 76)
44 IDENT@[72; 76) "Var3"
45 WHITESPACE@[76; 77)
46 NAMED_FIELD_DEF_LIST@[77; 145)
47 L_CURLY@[77; 78)
48 WHITESPACE@[78; 91)
49 NAMED_FIELD_DEF@[91; 95)
50 NAME@[91; 94)
51 IDENT@[91; 94) "abc"
52 COLON@[94; 95)
53 err: `expected type`
54 err: `expected COMMA`
55 WHITESPACE@[95; 96)
56 err: `expected field`
57 ERROR@[96; 98)
58 L_CURLY@[96; 97)
59 R_CURLY@[97; 98)
60 err: `expected field declaration`
61 ERROR@[98; 99)
62 COMMA@[98; 99)
63 WHITESPACE@[99; 100)
64 COMMENT@[100; 135)
65 WHITESPACE@[135; 144)
66 R_CURLY@[144; 145)
67 COMMA@[145; 146)
68 WHITESPACE@[146; 151)
69 R_CURLY@[151; 152)
70 WHITESPACE@[152; 158)
71 COMMENT@[158; 171)
72 WHITESPACE@[171; 176)
73 LET_STMT@[176; 186)
74 LET_KW@[176; 179)
75 WHITESPACE@[179; 180)
76 BIND_PAT@[180; 181)
77 NAME@[180; 181)
78 IDENT@[180; 181) "a"
79 WHITESPACE@[181; 182)
80 EQ@[182; 183)
81 WHITESPACE@[183; 184)
82 LITERAL@[184; 185)
83 INT_NUMBER@[184; 185) "1"
84 SEMI@[185; 186)
85 WHITESPACE@[186; 191)
86 ENUM_DEF@[191; 223)
87 ENUM_KW@[191; 195)
88 WHITESPACE@[195; 196)
89 NAME@[196; 201)
90 IDENT@[196; 201) "Test2"
91 WHITESPACE@[201; 202)
92 ENUM_VARIANT_LIST@[202; 223)
93 L_CURLY@[202; 203)
94 WHITESPACE@[203; 212)
95 ENUM_VARIANT@[212; 216)
96 NAME@[212; 216)
97 IDENT@[212; 216) "Fine"
98 COMMA@[216; 217)
99 WHITESPACE@[217; 222)
100 R_CURLY@[222; 223)
101 WHITESPACE@[223; 229)
102 ENUM_DEF@[229; 300)
103 ENUM_KW@[229; 233)
104 WHITESPACE@[233; 234)
105 NAME@[234; 239)
106 IDENT@[234; 239) "Test3"
107 WHITESPACE@[239; 240)
108 ENUM_VARIANT_LIST@[240; 300)
109 L_CURLY@[240; 241)
110 WHITESPACE@[241; 250)
111 ENUM_VARIANT@[250; 293)
112 NAME@[250; 259)
113 IDENT@[250; 259) "StillFine"
114 WHITESPACE@[259; 260)
115 NAMED_FIELD_DEF_LIST@[260; 293)
116 L_CURLY@[260; 261)
117 WHITESPACE@[261; 274)
118 NAMED_FIELD_DEF@[274; 282)
119 NAME@[274; 277)
120 IDENT@[274; 277) "def"
121 COLON@[277; 278)
122 WHITESPACE@[278; 279)
123 PATH_TYPE@[279; 282)
124 PATH@[279; 282)
125 PATH_SEGMENT@[279; 282)
126 NAME_REF@[279; 282)
127 IDENT@[279; 282) "i32"
128 COMMA@[282; 283)
129 WHITESPACE@[283; 292)
130 R_CURLY@[292; 293)
131 COMMA@[293; 294)
132 WHITESPACE@[294; 299)
133 R_CURLY@[299; 300)
134 WHITESPACE@[300; 306)
135 EXPR_STMT@[306; 459)
136 BLOCK_EXPR@[306; 459)
137 BLOCK@[306; 459)
138 L_CURLY@[306; 307)
139 WHITESPACE@[307; 316)
140 COMMENT@[316; 329)
141 WHITESPACE@[329; 338)
142 ENUM_DEF@[338; 453)
143 ENUM_KW@[338; 342)
144 WHITESPACE@[342; 343)
145 NAME@[343; 348)
146 IDENT@[343; 348) "Test4"
147 WHITESPACE@[348; 349)
148 ENUM_VARIANT_LIST@[349; 453)
149 L_CURLY@[349; 350)
150 WHITESPACE@[350; 363)
151 ENUM_VARIANT@[363; 372)
152 NAME@[363; 367)
153 IDENT@[363; 367) "Nope"
154 POS_FIELD_LIST@[367; 372)
155 L_PAREN@[367; 368)
156 POS_FIELD@[368; 371)
157 PATH_TYPE@[368; 371)
158 PATH@[368; 371)
159 PATH_SEGMENT@[368; 371)
160 NAME_REF@[368; 371)
161 IDENT@[368; 371) "i32"
162 err: `expected COMMA`
163 WHITESPACE@[371; 372)
164 err: `expected a type`
165 err: `expected R_PAREN`
166 err: `expected COMMA`
167 err: `expected enum variant`
168 ERROR@[372; 372)
169 ERROR@[372; 374)
170 L_CURLY@[372; 373)
171 R_CURLY@[373; 374)
172 err: `expected enum variant`
173 ERROR@[374; 375)
174 R_PAREN@[374; 375)
175 WHITESPACE@[375; 376)
176 COMMENT@[376; 396)
177 WHITESPACE@[396; 422)
178 COMMENT@[422; 443)
179 WHITESPACE@[443; 452)
180 R_CURLY@[452; 453)
181 WHITESPACE@[453; 458)
182 R_CURLY@[458; 459)
183 WHITESPACE@[459; 464)
184 COMMENT@[464; 486)
185 WHITESPACE@[486; 491)
186 LET_STMT@[491; 510)
187 LET_KW@[491; 494)
188 WHITESPACE@[494; 495)
189 BIND_PAT@[495; 505)
190 NAME@[495; 505)
191 IDENT@[495; 505) "bad_syntax"
192 WHITESPACE@[505; 506)
193 EQ@[506; 507)
194 WHITESPACE@[507; 508)
195 err: `expected expression`
196 ERROR@[508; 509)
197 UNDERSCORE@[508; 509)
198 SEMI@[509; 510)
199 WHITESPACE@[510; 511)
200 COMMENT@[511; 572)
201 WHITESPACE@[572; 573)
202 R_CURLY@[573; 574)
203 WHITESPACE@[574; 575)
diff --git a/crates/ra_syntax/tests/data/parser/fuzz-failures/0000.rs b/crates/ra_syntax/tests/data/parser/fuzz-failures/0000.rs
new file mode 100644
index 000000000..53c93d9e9
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/fuzz-failures/0000.rs
@@ -0,0 +1,199 @@
1//! An experimental implementation of [Rust RFC#2256 lrs);
2 let root = SyntaxNode::new_owned(root);
3 validate_block_structure(root.borrowed());
4 File { root }
5 }
6 pub fn parse(text: &str) -> File {
7 let tokens = tokenize(&text);
8 let (green, errors) = parser_impl::parse_with::<yellow::GreenBuilder>(
9 text, &tokens, grammar::root,
10 );
11 File::new(green, errors)
12 }
13 pub fn reparse(&self, edit: &AtomEdit) -> File {
14 self.incremental_reparse(edit).unwrap_or_else(|| self.full_reparse(edit))
15 }
16 pub fn incremental_reparse(&self, edit: &AtomEdit) -> Option<File> {
17 let (node, reparser) = find_reparsable_node(self.syntax(), edit.delete)?;
18 let text = replace_range(
19 node.text().to_string(),
20 edit.delete - node.range().start(),
21 &edit.insert,
22 );
23 let tokens = tokenize(&text);
24 if !is_balanced(&tokens) {
25 return None;
26 }
27 let (green, new_errors) = parser_impl::parse_with::<yellow::GreenBuilder>(
28 &te2t, &tokens, reparser,
29 );
30 let green_root = node.replace_with(green);
31 let errors = merge_errors(self.errors(), new_errors, node, edit);
32 Some(File::new(green_root, errors))
33 }
34 fn full_reparse(&self, edit: &AtomEdit) -> File {
35 let text = replace_range(self.syntax().text().to_string(), edit.delete, &edit.insert);
36 File::parse(&text)
37 }
38 pub fn ast(&self) -> ast::Root {
39 ast::Root::cast(self.syntax()).unwrap()
40 }
41 pub fn syntax(&self) -> SyntaxNodeRef {
42 self.root.brroowed()
43 }
44 mp_tree(root),
45 );
46 assert!(
47 node.next_sibling().is_none() && pair.prev_sibling().is_none(),
48 "\nfloating curlys at {:?}\nfile:\n{}\nerror:\n{}\n",
49 node,
50 root.text(),
51 node.text(),
52 );
53 }
54 }
55 _ => (),
56 }
57 }
58}
59
60#[derive(Debug, Clone)]
61pub struct AtomEdit {
62 pub delete: TextRange,
63 pub insert: String,
64}
65
66impl AtomEdit {
67 pub fn replace(range: TextRange, replace_with: String) -> AtomEdit {
68 AtomEdit { delete: range, insert: replace_with }
69 }
70
71 pub fn delete(range: TextRange) -> AtomEdit {
72 AtomEdit::replace(range, String::new())
73 }
74
75 pub fn insert(offset: TextUnit, text: String) -> AtomEdit {
76 AtomEdit::replace(TextRange::offset_len(offset, 0.into()), text)
77 }
78}
79
80fn find_reparsable_node(node: SyntaxNodeRef, range: TextRange) -> Option<(SyntaxNodeRef, fn(&mut Parser))> {
81 let node = algo::find_covering_node(node, range);
82 return algo::ancestors(node)
83 .filter_map(|node| reparser(node).map(|r| (node, r)))
84 .next();
85
86 fn reparser(node: SyntaxNodeRef) -> Option<fn(&mut Parser)> {
87 let res = match node.kind() {
88 BLOCK => grammar::block,
89 NAMED_FIELD_DEF_LIST => grammar::named_field_def_list,
90 _ => return None,
91 };
92 Some(res)
93 }
94}
95
96pub /*(meh)*/ fn replace_range(mut text: String, range: TextRange, replace_with: &str) -> String {
97 let start = u32::from(range.start()) as usize;
98 let end = u32::from(range.end()) as usize;
99 text.replace_range(start..end, replace_with);
100 text
101}
102
103fn is_balanced(tokens: &[Token]) -> bool {
104 if tokens.len() == 0
105 || tokens.first().unwrap().kind != L_CURLY
106 || tokens.last().unwrap().kind != R_CURLY {
107 return false
108 }
109 let mut balance = 0usize;
110 for t in tokens.iter() {
111 match t.kind {
112 L_CURLYt {
113 pub delete: TextRange,
114 pub insert: String,
115}
116
117impl AtomEdit {
118 pub fn replace(range: TextRange, replace_with: String) -> AtomEdit {
119 AtomEdit { delete: range, insert: replace_with }
120 }
121
122 pub fn delete(range: TextRange) -> AtomEdit {
123 AtomEdit::replace(range, String::new())
124 }
125
126 pub fn insert(offset: TextUnit, text: String) -> AtomEdit {
127 AtomEdit::replace(TextRange::offset_len(offset, 0.into()), text)
128 }
129}
130
131fn find_reparsable_node(node: SyntaxNodeRef, range: TextRange) -> Option<(SyntaxNodeRef, fn(&mut Parser))> {
132 let node = algo::find_covering_node(node, range);
133 return algo::ancestors(node)
134 .filter_map(|node| reparser(node).map(|r| (node, r)))
135 .next();
136
137 fn reparser(node: SyntaxNodeRef) -> Option<fn(&mut Parser)> {
138 let res = match node.kind() {
139 ;
140 let end = u32::from(range.end()) as usize;
141 text.replaT => grammar::named_field_def_list,
142 _ => return None,
143 };
144 Some(res)
145 }
146}
147
148pub /*(meh)*/ fn replace_range(mut text: String, range: TextRange, replace_with: &str) -> String {
149 let start = u32::from(range.start()) as usize;
150 let end = u32::from(range.end()) as usize;
151 text.replace_range(start..end, replace_with);
152 text
153}
154
155fn is_balanced(tokens: &[Token]) -> bool {
156 if tokens.len() == 0
157 || tokens.first().unwrap().kind != L_CURLY
158 || tokens.last().unwrap().kind != R_CURLY {
159 return false
160 }
161 let mut balance = 0usize;
162 for t in tokens.iter() {
163 match t.kind {
164 L_CURLY => balance += 1,
165 R_CURLY => balance = match balance.checked_sub(1) {
166 Some(b) => b,
167 None => return false,
168 },
169 _ => (),
170 }
171 }
172 balance == 0
173}
174
175fn merge_errors(
176 old_errors: Vec<SyntaxError>,
177 new_errors: Vec<SyntaxError>,
178 old_node: SyntaxNodeRef,
179 edit: &AtomEdit,
180) -> Vec<SyntaxError> {
181 let mut res = Vec::new();
182 for e in old_errors {
183 if e.offset < old_node.range().start() {
184 res.push(e)
185 } else if e.offset > old_node.range().end() {
186 res.push(SyntaxError {
187 msg: e.msg,
188 offset: e.offset + TextUnit::of_str(&edit.insert) - edit.delete.len(),
189 })
190 }
191 }
192 for e in new_errors {
193 res.push(SyntaxError {
194 msg: e.msg,
195 offset: e.offset + old_node.range().start(),
196 })
197 }
198 res
199}
diff --git a/crates/ra_syntax/tests/data/parser/fuzz-failures/0001.rs b/crates/ra_syntax/tests/data/parser/fuzz-failures/0001.rs
new file mode 100644
index 000000000..099cc5f84
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/fuzz-failures/0001.rs
@@ -0,0 +1,106 @@
1use ra_syntax::{
2 File, TextRange, SyntaxNodeRef, TextUnit,
3 SyntaxKind::*,
4 algo::{find_leaf_at_offset, LeafAtOffset, find_covering_node, ancestors, Direction, siblings},
5};
6
7pub fn extend_selection(file: &File, range: TextRange) -> Option<TextRange> {
8 let syntax = file.syntax();
9 extend(syntax.borrowed(), range)
10}
11
12pub(crate) fn extend(root: SyntaxNodeRef, range: TextRange) -> Option<TextRange> {
13 if range.is_empty() {
14 let offset = range.start();
15 let mut leaves = find_leaf_at_offset(root, offset);
16 if leaves.clone().all(|it| it.kind() == WHITESPACE) {
17 return Some(extend_ws(root, leaves.next()?, offset));
18 }
19 let leaf = match leaves {
20 LeafAtOffset::None => return None,
21 LeafAtOffset::Single(l) => l,
22 LeafAtOffset::Between(l, r) => pick_best(l, r),
23 };
24 return Some(leaf.range());
25 };
26 let node = find_covering_node(root, range);
27 if node.kind() == COMMENT && range == node.range() {
28 if let Some(range) = extend_comments(node) {
29 return Some(range);
30 }
31 }
32
33 match ancestors(node).skip_while(|n| n.range() == range).next() {
34 None => None,
35 Some(parent) => Some(parent.range()),
36 }
37}
38
39fn extend_ws(root: SyntaxNodeRef, ws: SyntaxNodeRef, offset: TextUnit) -> TextRange {
40 let ws_text = ws.leaf_text().unwrap();
41 let suffix = TextRange::from_to(offset, ws.range().end()) - ws.range().start();
42 let prefix = TextRange::from_to(ws.range().start(), offset) - ws.range().start();
43 let ws_suffix = &ws_text.as_str()[suffix];
44 let ws_prefix = &ws_text.as_str()[prefix];
45 if ws_text.contains("\n") && !ws_suffix.contains("\n") {
46 if let Some(node) = ws.next_sibling() {
47 let start = match ws_prefix.rfind('\n') {
48 Some(idx) => ws.range().start() + TextUnit::from((idx + 1) as u32),
49 None => node.range().start()
50 };
51 let end = if root.text().char_at(node.range().end()) == Some('\n') {
52 node.range().end() + TextUnit::of_char('\n')
53 } else {
54 node.range().end()
55 };
56 return TextRange::from_to(start, end);
57 }
58 }
59 ws.range()
60}
61
62fn pick_best<'a>(l: SyntaxNodeRef<'a>, r: Syntd[axNodeRef<'a>) -> SyntaxNodeRef<'a> {
63 return if priority(r) > priority(l) { r } else { l };
64 fn priority(n: SyntaxNodeRef) -> usize {
65 match n.kind() {
66 WHITESPACE => 0,
67 IDENT | SELF_KW | SUPER_KW | CRATE_KW => 2,
68 _ => 1,
69 }
70 }
71}
72
73fn extend_comments(node: SyntaxNodeRef) -> Option<TextRange> {
74 let left = adj_com[ments(node, Direction::Backward);
75 let right = adj_comments(node, Direction::Forward);
76 if left != right {
77 Some(TextRange::from_to(
78 left.range().start(),
79 right.range().end(),
80 ))
81 } else {
82 None
83 }
84}
85
86fn adj_comments(node: SyntaxNodeRef, dir: Direction) -> SyntaxNodeRef {
87 let mut res = node;
88 for node in siblings(node, dir) {
89 match node.kind() {
90 COMMENT => res = node,
91 WHITESPACE if !node.leaf_text().unwrap().as_str().contains("\n\n") => (),
92 _ => break
93 }
94 }
95 res
96}
97
98#[cfg(test)]
99mod tests {
100 use super::*;
101 use test_utils::extract_offset;
102
103 fn do_check(before: &str, afters: &[&str]) {
104 let (cursor, before) = extract_offset(before);
105 let file = File::parse(&before);
106 let mut range = TextRange::of
diff --git a/crates/ra_syntax/tests/data/parser/inline/0001_const_unsafe_fn.rs b/crates/ra_syntax/tests/data/parser/inline/0001_const_unsafe_fn.rs
new file mode 100644
index 000000000..31a1e435f
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0001_const_unsafe_fn.rs
@@ -0,0 +1 @@
const unsafe fn foo() {}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0001_const_unsafe_fn.txt b/crates/ra_syntax/tests/data/parser/inline/0001_const_unsafe_fn.txt
new file mode 100644
index 000000000..956532981
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0001_const_unsafe_fn.txt
@@ -0,0 +1,18 @@
1ROOT@[0; 25)
2 FN_DEF@[0; 24)
3 CONST_KW@[0; 5)
4 WHITESPACE@[5; 6)
5 UNSAFE_KW@[6; 12)
6 WHITESPACE@[12; 13)
7 FN_KW@[13; 15)
8 WHITESPACE@[15; 16)
9 NAME@[16; 19)
10 IDENT@[16; 19) "foo"
11 PARAM_LIST@[19; 21)
12 L_PAREN@[19; 20)
13 R_PAREN@[20; 21)
14 WHITESPACE@[21; 22)
15 BLOCK@[22; 24)
16 L_CURLY@[22; 23)
17 R_CURLY@[23; 24)
18 WHITESPACE@[24; 25)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0002_const_fn.rs b/crates/ra_syntax/tests/data/parser/inline/0002_const_fn.rs
new file mode 100644
index 000000000..8c84d9cd7
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0002_const_fn.rs
@@ -0,0 +1 @@
const fn foo() {}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0002_const_fn.txt b/crates/ra_syntax/tests/data/parser/inline/0002_const_fn.txt
new file mode 100644
index 000000000..bda875fc5
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0002_const_fn.txt
@@ -0,0 +1,16 @@
1ROOT@[0; 18)
2 FN_DEF@[0; 17)
3 CONST_KW@[0; 5)
4 WHITESPACE@[5; 6)
5 FN_KW@[6; 8)
6 WHITESPACE@[8; 9)
7 NAME@[9; 12)
8 IDENT@[9; 12) "foo"
9 PARAM_LIST@[12; 14)
10 L_PAREN@[12; 13)
11 R_PAREN@[13; 14)
12 WHITESPACE@[14; 15)
13 BLOCK@[15; 17)
14 L_CURLY@[15; 16)
15 R_CURLY@[16; 17)
16 WHITESPACE@[17; 18)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0003_extern_block.rs b/crates/ra_syntax/tests/data/parser/inline/0003_extern_block.rs
new file mode 100644
index 000000000..26a9ccd1e
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0003_extern_block.rs
@@ -0,0 +1 @@
extern {}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0003_extern_block.txt b/crates/ra_syntax/tests/data/parser/inline/0003_extern_block.txt
new file mode 100644
index 000000000..2c2bbd035
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0003_extern_block.txt
@@ -0,0 +1,9 @@
1ROOT@[0; 10)
2 EXTERN_BLOCK@[0; 9)
3 ABI@[0; 6)
4 EXTERN_KW@[0; 6)
5 WHITESPACE@[6; 7)
6 EXTERN_ITEM_LIST@[7; 9)
7 L_CURLY@[7; 8)
8 R_CURLY@[8; 9)
9 WHITESPACE@[9; 10)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0004_extern_fn.rs b/crates/ra_syntax/tests/data/parser/inline/0004_extern_fn.rs
new file mode 100644
index 000000000..394a049f0
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0004_extern_fn.rs
@@ -0,0 +1 @@
extern fn foo() {}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0004_extern_fn.txt b/crates/ra_syntax/tests/data/parser/inline/0004_extern_fn.txt
new file mode 100644
index 000000000..f6e769475
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0004_extern_fn.txt
@@ -0,0 +1,17 @@
1ROOT@[0; 19)
2 FN_DEF@[0; 18)
3 ABI@[0; 6)
4 EXTERN_KW@[0; 6)
5 WHITESPACE@[6; 7)
6 FN_KW@[7; 9)
7 WHITESPACE@[9; 10)
8 NAME@[10; 13)
9 IDENT@[10; 13) "foo"
10 PARAM_LIST@[13; 15)
11 L_PAREN@[13; 14)
12 R_PAREN@[14; 15)
13 WHITESPACE@[15; 16)
14 BLOCK@[16; 18)
15 L_CURLY@[16; 17)
16 R_CURLY@[17; 18)
17 WHITESPACE@[18; 19)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0005_extern_crate.rs b/crates/ra_syntax/tests/data/parser/inline/0005_extern_crate.rs
new file mode 100644
index 000000000..49af74e1b
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0005_extern_crate.rs
@@ -0,0 +1 @@
extern crate foo;
diff --git a/crates/ra_syntax/tests/data/parser/inline/0005_extern_crate.txt b/crates/ra_syntax/tests/data/parser/inline/0005_extern_crate.txt
new file mode 100644
index 000000000..fc025b0f3
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0005_extern_crate.txt
@@ -0,0 +1,10 @@
1ROOT@[0; 18)
2 EXTERN_CRATE_ITEM@[0; 17)
3 EXTERN_KW@[0; 6)
4 WHITESPACE@[6; 7)
5 CRATE_KW@[7; 12)
6 WHITESPACE@[12; 13)
7 NAME@[13; 16)
8 IDENT@[13; 16) "foo"
9 SEMI@[16; 17)
10 WHITESPACE@[17; 18)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0007_unsafe_trait.rs b/crates/ra_syntax/tests/data/parser/inline/0007_unsafe_trait.rs
new file mode 100644
index 000000000..04e021550
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0007_unsafe_trait.rs
@@ -0,0 +1 @@
unsafe trait T {}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0007_unsafe_trait.txt b/crates/ra_syntax/tests/data/parser/inline/0007_unsafe_trait.txt
new file mode 100644
index 000000000..fb97cc042
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0007_unsafe_trait.txt
@@ -0,0 +1,13 @@
1ROOT@[0; 18)
2 TRAIT_DEF@[0; 17)
3 UNSAFE_KW@[0; 6)
4 WHITESPACE@[6; 7)
5 TRAIT_KW@[7; 12)
6 WHITESPACE@[12; 13)
7 NAME@[13; 14)
8 IDENT@[13; 14) "T"
9 WHITESPACE@[14; 15)
10 ITEM_LIST@[15; 17)
11 L_CURLY@[15; 16)
12 R_CURLY@[16; 17)
13 WHITESPACE@[17; 18)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0008_unsafe_impl.rs b/crates/ra_syntax/tests/data/parser/inline/0008_unsafe_impl.rs
new file mode 100644
index 000000000..41055f41d
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0008_unsafe_impl.rs
@@ -0,0 +1 @@
unsafe impl Foo {}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0008_unsafe_impl.txt b/crates/ra_syntax/tests/data/parser/inline/0008_unsafe_impl.txt
new file mode 100644
index 000000000..fa596394f
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0008_unsafe_impl.txt
@@ -0,0 +1,16 @@
1ROOT@[0; 19)
2 IMPL_ITEM@[0; 18)
3 UNSAFE_KW@[0; 6)
4 WHITESPACE@[6; 7)
5 IMPL_KW@[7; 11)
6 WHITESPACE@[11; 12)
7 PATH_TYPE@[12; 15)
8 PATH@[12; 15)
9 PATH_SEGMENT@[12; 15)
10 NAME_REF@[12; 15)
11 IDENT@[12; 15) "Foo"
12 WHITESPACE@[15; 16)
13 ITEM_LIST@[16; 18)
14 L_CURLY@[16; 17)
15 R_CURLY@[17; 18)
16 WHITESPACE@[18; 19)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0009_unsafe_auto_trait.rs b/crates/ra_syntax/tests/data/parser/inline/0009_unsafe_auto_trait.rs
new file mode 100644
index 000000000..03d29f324
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0009_unsafe_auto_trait.rs
@@ -0,0 +1 @@
unsafe auto trait T {}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0009_unsafe_auto_trait.txt b/crates/ra_syntax/tests/data/parser/inline/0009_unsafe_auto_trait.txt
new file mode 100644
index 000000000..e642bbf80
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0009_unsafe_auto_trait.txt
@@ -0,0 +1,15 @@
1ROOT@[0; 23)
2 TRAIT_DEF@[0; 22)
3 UNSAFE_KW@[0; 6)
4 WHITESPACE@[6; 7)
5 AUTO_KW@[7; 11)
6 WHITESPACE@[11; 12)
7 TRAIT_KW@[12; 17)
8 WHITESPACE@[17; 18)
9 NAME@[18; 19)
10 IDENT@[18; 19) "T"
11 WHITESPACE@[19; 20)
12 ITEM_LIST@[20; 22)
13 L_CURLY@[20; 21)
14 R_CURLY@[21; 22)
15 WHITESPACE@[22; 23)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0010_unsafe_default_impl.rs b/crates/ra_syntax/tests/data/parser/inline/0010_unsafe_default_impl.rs
new file mode 100644
index 000000000..9cd6c57bd
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0010_unsafe_default_impl.rs
@@ -0,0 +1 @@
unsafe default impl Foo {}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0010_unsafe_default_impl.txt b/crates/ra_syntax/tests/data/parser/inline/0010_unsafe_default_impl.txt
new file mode 100644
index 000000000..99d33a902
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0010_unsafe_default_impl.txt
@@ -0,0 +1,18 @@
1ROOT@[0; 27)
2 IMPL_ITEM@[0; 26)
3 UNSAFE_KW@[0; 6)
4 WHITESPACE@[6; 7)
5 DEFAULT_KW@[7; 14)
6 WHITESPACE@[14; 15)
7 IMPL_KW@[15; 19)
8 WHITESPACE@[19; 20)
9 PATH_TYPE@[20; 23)
10 PATH@[20; 23)
11 PATH_SEGMENT@[20; 23)
12 NAME_REF@[20; 23)
13 IDENT@[20; 23) "Foo"
14 WHITESPACE@[23; 24)
15 ITEM_LIST@[24; 26)
16 L_CURLY@[24; 25)
17 R_CURLY@[25; 26)
18 WHITESPACE@[26; 27)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0011_unsafe_fn.rs b/crates/ra_syntax/tests/data/parser/inline/0011_unsafe_fn.rs
new file mode 100644
index 000000000..33cfc4cd7
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0011_unsafe_fn.rs
@@ -0,0 +1 @@
unsafe fn foo() {}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0011_unsafe_fn.txt b/crates/ra_syntax/tests/data/parser/inline/0011_unsafe_fn.txt
new file mode 100644
index 000000000..39ec53b26
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0011_unsafe_fn.txt
@@ -0,0 +1,16 @@
1ROOT@[0; 19)
2 FN_DEF@[0; 18)
3 UNSAFE_KW@[0; 6)
4 WHITESPACE@[6; 7)
5 FN_KW@[7; 9)
6 WHITESPACE@[9; 10)
7 NAME@[10; 13)
8 IDENT@[10; 13) "foo"
9 PARAM_LIST@[13; 15)
10 L_PAREN@[13; 14)
11 R_PAREN@[14; 15)
12 WHITESPACE@[15; 16)
13 BLOCK@[16; 18)
14 L_CURLY@[16; 17)
15 R_CURLY@[17; 18)
16 WHITESPACE@[18; 19)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0012_unsafe_extern_fn.rs b/crates/ra_syntax/tests/data/parser/inline/0012_unsafe_extern_fn.rs
new file mode 100644
index 000000000..1295c2cd2
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0012_unsafe_extern_fn.rs
@@ -0,0 +1 @@
unsafe extern "C" fn foo() {}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0012_unsafe_extern_fn.txt b/crates/ra_syntax/tests/data/parser/inline/0012_unsafe_extern_fn.txt
new file mode 100644
index 000000000..54e296ed6
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0012_unsafe_extern_fn.txt
@@ -0,0 +1,21 @@
1ROOT@[0; 30)
2 FN_DEF@[0; 29)
3 UNSAFE_KW@[0; 6)
4 WHITESPACE@[6; 7)
5 ABI@[7; 17)
6 EXTERN_KW@[7; 13)
7 WHITESPACE@[13; 14)
8 STRING@[14; 17)
9 WHITESPACE@[17; 18)
10 FN_KW@[18; 20)
11 WHITESPACE@[20; 21)
12 NAME@[21; 24)
13 IDENT@[21; 24) "foo"
14 PARAM_LIST@[24; 26)
15 L_PAREN@[24; 25)
16 R_PAREN@[25; 26)
17 WHITESPACE@[26; 27)
18 BLOCK@[27; 29)
19 L_CURLY@[27; 28)
20 R_CURLY@[28; 29)
21 WHITESPACE@[29; 30)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0013_unsafe_block_in_mod.rs b/crates/ra_syntax/tests/data/parser/inline/0013_unsafe_block_in_mod.rs
new file mode 100644
index 000000000..26141e904
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0013_unsafe_block_in_mod.rs
@@ -0,0 +1 @@
fn foo(){} unsafe { } fn bar(){}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0013_unsafe_block_in_mod.txt b/crates/ra_syntax/tests/data/parser/inline/0013_unsafe_block_in_mod.txt
new file mode 100644
index 000000000..9825e5ace
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0013_unsafe_block_in_mod.txt
@@ -0,0 +1,35 @@
1ROOT@[0; 33)
2 FN_DEF@[0; 10)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 8)
8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8)
10 BLOCK@[8; 10)
11 L_CURLY@[8; 9)
12 R_CURLY@[9; 10)
13 WHITESPACE@[10; 11)
14 err: `expected an item`
15 ERROR@[11; 17)
16 UNSAFE_KW@[11; 17)
17 WHITESPACE@[17; 18)
18 err: `expected an item`
19 ERROR@[18; 21)
20 L_CURLY@[18; 19)
21 WHITESPACE@[19; 20)
22 R_CURLY@[20; 21)
23 WHITESPACE@[21; 22)
24 FN_DEF@[22; 32)
25 FN_KW@[22; 24)
26 WHITESPACE@[24; 25)
27 NAME@[25; 28)
28 IDENT@[25; 28) "bar"
29 PARAM_LIST@[28; 30)
30 L_PAREN@[28; 29)
31 R_PAREN@[29; 30)
32 BLOCK@[30; 32)
33 L_CURLY@[30; 31)
34 R_CURLY@[31; 32)
35 WHITESPACE@[32; 33)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0014_type_item_type_params.rs b/crates/ra_syntax/tests/data/parser/inline/0014_type_item_type_params.rs
new file mode 100644
index 000000000..defd110c4
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0014_type_item_type_params.rs
@@ -0,0 +1 @@
type Result<T> = ();
diff --git a/crates/ra_syntax/tests/data/parser/inline/0014_type_item_type_params.txt b/crates/ra_syntax/tests/data/parser/inline/0014_type_item_type_params.txt
new file mode 100644
index 000000000..bf65e8a37
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0014_type_item_type_params.txt
@@ -0,0 +1,20 @@
1ROOT@[0; 21)
2 TYPE_DEF@[0; 20)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 11)
6 IDENT@[5; 11) "Result"
7 TYPE_PARAM_LIST@[11; 14)
8 L_ANGLE@[11; 12)
9 TYPE_PARAM@[12; 13)
10 NAME@[12; 13)
11 IDENT@[12; 13) "T"
12 R_ANGLE@[13; 14)
13 WHITESPACE@[14; 15)
14 EQ@[15; 16)
15 WHITESPACE@[16; 17)
16 TUPLE_TYPE@[17; 19)
17 L_PAREN@[17; 18)
18 R_PAREN@[18; 19)
19 SEMI@[19; 20)
20 WHITESPACE@[20; 21)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0015_type_item.rs b/crates/ra_syntax/tests/data/parser/inline/0015_type_item.rs
new file mode 100644
index 000000000..04c0344fa
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0015_type_item.rs
@@ -0,0 +1 @@
type Foo = Bar;
diff --git a/crates/ra_syntax/tests/data/parser/inline/0015_type_item.txt b/crates/ra_syntax/tests/data/parser/inline/0015_type_item.txt
new file mode 100644
index 000000000..71048bcc5
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0015_type_item.txt
@@ -0,0 +1,16 @@
1ROOT@[0; 16)
2 TYPE_DEF@[0; 15)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 8)
6 IDENT@[5; 8) "Foo"
7 WHITESPACE@[8; 9)
8 EQ@[9; 10)
9 WHITESPACE@[10; 11)
10 PATH_TYPE@[11; 14)
11 PATH@[11; 14)
12 PATH_SEGMENT@[11; 14)
13 NAME_REF@[11; 14)
14 IDENT@[11; 14) "Bar"
15 SEMI@[14; 15)
16 WHITESPACE@[15; 16)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0016_type_item_where_clause.rs b/crates/ra_syntax/tests/data/parser/inline/0016_type_item_where_clause.rs
new file mode 100644
index 000000000..a602d07f0
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0016_type_item_where_clause.rs
@@ -0,0 +1 @@
type Foo where Foo: Copy = ();
diff --git a/crates/ra_syntax/tests/data/parser/inline/0016_type_item_where_clause.txt b/crates/ra_syntax/tests/data/parser/inline/0016_type_item_where_clause.txt
new file mode 100644
index 000000000..c3fca013e
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0016_type_item_where_clause.txt
@@ -0,0 +1,32 @@
1ROOT@[0; 31)
2 TYPE_DEF@[0; 30)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 8)
6 IDENT@[5; 8) "Foo"
7 WHITESPACE@[8; 9)
8 WHERE_CLAUSE@[9; 24)
9 WHERE_KW@[9; 14)
10 WHITESPACE@[14; 15)
11 WHERE_PRED@[15; 24)
12 PATH_TYPE@[15; 18)
13 PATH@[15; 18)
14 PATH_SEGMENT@[15; 18)
15 NAME_REF@[15; 18)
16 IDENT@[15; 18) "Foo"
17 COLON@[18; 19)
18 WHITESPACE@[19; 20)
19 PATH_TYPE@[20; 24)
20 PATH@[20; 24)
21 PATH_SEGMENT@[20; 24)
22 NAME_REF@[20; 24)
23 IDENT@[20; 24) "Copy"
24 err: `expected COMMA`
25 WHITESPACE@[24; 25)
26 EQ@[25; 26)
27 WHITESPACE@[26; 27)
28 TUPLE_TYPE@[27; 29)
29 L_PAREN@[27; 28)
30 R_PAREN@[28; 29)
31 SEMI@[29; 30)
32 WHITESPACE@[30; 31)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0017_paren_type.rs b/crates/ra_syntax/tests/data/parser/inline/0017_paren_type.rs
new file mode 100644
index 000000000..6e1b25101
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0017_paren_type.rs
@@ -0,0 +1 @@
type T = (i32);
diff --git a/crates/ra_syntax/tests/data/parser/inline/0017_paren_type.txt b/crates/ra_syntax/tests/data/parser/inline/0017_paren_type.txt
new file mode 100644
index 000000000..97e73fea1
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0017_paren_type.txt
@@ -0,0 +1,19 @@
1ROOT@[0; 16)
2 TYPE_DEF@[0; 15)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 6)
6 IDENT@[5; 6) "T"
7 WHITESPACE@[6; 7)
8 EQ@[7; 8)
9 WHITESPACE@[8; 9)
10 PAREN_TYPE@[9; 14)
11 L_PAREN@[9; 10)
12 PATH_TYPE@[10; 13)
13 PATH@[10; 13)
14 PATH_SEGMENT@[10; 13)
15 NAME_REF@[10; 13)
16 IDENT@[10; 13) "i32"
17 R_PAREN@[13; 14)
18 SEMI@[14; 15)
19 WHITESPACE@[15; 16)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0018_unit_type.rs b/crates/ra_syntax/tests/data/parser/inline/0018_unit_type.rs
new file mode 100644
index 000000000..c039cf7d3
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0018_unit_type.rs
@@ -0,0 +1 @@
type T = ();
diff --git a/crates/ra_syntax/tests/data/parser/inline/0018_unit_type.txt b/crates/ra_syntax/tests/data/parser/inline/0018_unit_type.txt
new file mode 100644
index 000000000..5d04d42fc
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0018_unit_type.txt
@@ -0,0 +1,14 @@
1ROOT@[0; 13)
2 TYPE_DEF@[0; 12)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 6)
6 IDENT@[5; 6) "T"
7 WHITESPACE@[6; 7)
8 EQ@[7; 8)
9 WHITESPACE@[8; 9)
10 TUPLE_TYPE@[9; 11)
11 L_PAREN@[9; 10)
12 R_PAREN@[10; 11)
13 SEMI@[11; 12)
14 WHITESPACE@[12; 13)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0019_singleton_tuple_type.rs b/crates/ra_syntax/tests/data/parser/inline/0019_singleton_tuple_type.rs
new file mode 100644
index 000000000..cb66bad24
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0019_singleton_tuple_type.rs
@@ -0,0 +1 @@
type T = (i32,);
diff --git a/crates/ra_syntax/tests/data/parser/inline/0019_singleton_tuple_type.txt b/crates/ra_syntax/tests/data/parser/inline/0019_singleton_tuple_type.txt
new file mode 100644
index 000000000..2cd8be9ab
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0019_singleton_tuple_type.txt
@@ -0,0 +1,20 @@
1ROOT@[0; 17)
2 TYPE_DEF@[0; 16)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 6)
6 IDENT@[5; 6) "T"
7 WHITESPACE@[6; 7)
8 EQ@[7; 8)
9 WHITESPACE@[8; 9)
10 TUPLE_TYPE@[9; 15)
11 L_PAREN@[9; 10)
12 PATH_TYPE@[10; 13)
13 PATH@[10; 13)
14 PATH_SEGMENT@[10; 13)
15 NAME_REF@[10; 13)
16 IDENT@[10; 13) "i32"
17 COMMA@[13; 14)
18 R_PAREN@[14; 15)
19 SEMI@[15; 16)
20 WHITESPACE@[16; 17)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0020_never_type.rs b/crates/ra_syntax/tests/data/parser/inline/0020_never_type.rs
new file mode 100644
index 000000000..de399fcf4
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0020_never_type.rs
@@ -0,0 +1 @@
type Never = !;
diff --git a/crates/ra_syntax/tests/data/parser/inline/0020_never_type.txt b/crates/ra_syntax/tests/data/parser/inline/0020_never_type.txt
new file mode 100644
index 000000000..6205d9669
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0020_never_type.txt
@@ -0,0 +1,13 @@
1ROOT@[0; 16)
2 TYPE_DEF@[0; 15)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 10)
6 IDENT@[5; 10) "Never"
7 WHITESPACE@[10; 11)
8 EQ@[11; 12)
9 WHITESPACE@[12; 13)
10 NEVER_TYPE@[13; 14)
11 EXCL@[13; 14)
12 SEMI@[14; 15)
13 WHITESPACE@[15; 16)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0021_pointer_type_no_mutability.rs b/crates/ra_syntax/tests/data/parser/inline/0021_pointer_type_no_mutability.rs
new file mode 100644
index 000000000..fae705131
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0021_pointer_type_no_mutability.rs
@@ -0,0 +1 @@
type T = *();
diff --git a/crates/ra_syntax/tests/data/parser/inline/0021_pointer_type_no_mutability.txt b/crates/ra_syntax/tests/data/parser/inline/0021_pointer_type_no_mutability.txt
new file mode 100644
index 000000000..23e68557a
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0021_pointer_type_no_mutability.txt
@@ -0,0 +1,17 @@
1ROOT@[0; 14)
2 TYPE_DEF@[0; 13)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 6)
6 IDENT@[5; 6) "T"
7 WHITESPACE@[6; 7)
8 EQ@[7; 8)
9 WHITESPACE@[8; 9)
10 POINTER_TYPE@[9; 12)
11 STAR@[9; 10)
12 err: `expected mut or const in raw pointer type (use `*mut T` or `*const T` as appropriate)`
13 TUPLE_TYPE@[10; 12)
14 L_PAREN@[10; 11)
15 R_PAREN@[11; 12)
16 SEMI@[12; 13)
17 WHITESPACE@[13; 14)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0022_pointer_type_mut.rs b/crates/ra_syntax/tests/data/parser/inline/0022_pointer_type_mut.rs
new file mode 100644
index 000000000..04b2bb9ba
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0022_pointer_type_mut.rs
@@ -0,0 +1,2 @@
1type M = *mut ();
2type C = *mut ();
diff --git a/crates/ra_syntax/tests/data/parser/inline/0022_pointer_type_mut.txt b/crates/ra_syntax/tests/data/parser/inline/0022_pointer_type_mut.txt
new file mode 100644
index 000000000..33f5ad8b4
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0022_pointer_type_mut.txt
@@ -0,0 +1,35 @@
1ROOT@[0; 36)
2 TYPE_DEF@[0; 17)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 6)
6 IDENT@[5; 6) "M"
7 WHITESPACE@[6; 7)
8 EQ@[7; 8)
9 WHITESPACE@[8; 9)
10 POINTER_TYPE@[9; 16)
11 STAR@[9; 10)
12 MUT_KW@[10; 13)
13 WHITESPACE@[13; 14)
14 TUPLE_TYPE@[14; 16)
15 L_PAREN@[14; 15)
16 R_PAREN@[15; 16)
17 SEMI@[16; 17)
18 WHITESPACE@[17; 18)
19 TYPE_DEF@[18; 35)
20 TYPE_KW@[18; 22)
21 WHITESPACE@[22; 23)
22 NAME@[23; 24)
23 IDENT@[23; 24) "C"
24 WHITESPACE@[24; 25)
25 EQ@[25; 26)
26 WHITESPACE@[26; 27)
27 POINTER_TYPE@[27; 34)
28 STAR@[27; 28)
29 MUT_KW@[28; 31)
30 WHITESPACE@[31; 32)
31 TUPLE_TYPE@[32; 34)
32 L_PAREN@[32; 33)
33 R_PAREN@[33; 34)
34 SEMI@[34; 35)
35 WHITESPACE@[35; 36)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0023_array_type_missing_semi.rs b/crates/ra_syntax/tests/data/parser/inline/0023_array_type_missing_semi.rs
new file mode 100644
index 000000000..a94851443
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0023_array_type_missing_semi.rs
@@ -0,0 +1 @@
type T = [() 92];
diff --git a/crates/ra_syntax/tests/data/parser/inline/0023_array_type_missing_semi.txt b/crates/ra_syntax/tests/data/parser/inline/0023_array_type_missing_semi.txt
new file mode 100644
index 000000000..90bdc5d2e
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0023_array_type_missing_semi.txt
@@ -0,0 +1,27 @@
1ROOT@[0; 18)
2 TYPE_DEF@[0; 12)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 6)
6 IDENT@[5; 6) "T"
7 WHITESPACE@[6; 7)
8 EQ@[7; 8)
9 WHITESPACE@[8; 9)
10 SLICE_TYPE@[9; 12)
11 L_BRACK@[9; 10)
12 TUPLE_TYPE@[10; 12)
13 L_PAREN@[10; 11)
14 R_PAREN@[11; 12)
15 err: `expected `;` or `]``
16 err: `expected SEMI`
17 WHITESPACE@[12; 13)
18 err: `expected an item`
19 ERROR@[13; 15)
20 INT_NUMBER@[13; 15) "92"
21 err: `expected an item`
22 ERROR@[15; 16)
23 R_BRACK@[15; 16)
24 err: `expected an item`
25 ERROR@[16; 17)
26 SEMI@[16; 17)
27 WHITESPACE@[17; 18)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0024_array_type.rs b/crates/ra_syntax/tests/data/parser/inline/0024_array_type.rs
new file mode 100644
index 000000000..27eb22f22
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0024_array_type.rs
@@ -0,0 +1 @@
type T = [(); 92];
diff --git a/crates/ra_syntax/tests/data/parser/inline/0024_array_type.txt b/crates/ra_syntax/tests/data/parser/inline/0024_array_type.txt
new file mode 100644
index 000000000..809c86974
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0024_array_type.txt
@@ -0,0 +1,21 @@
1ROOT@[0; 19)
2 TYPE_DEF@[0; 18)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 6)
6 IDENT@[5; 6) "T"
7 WHITESPACE@[6; 7)
8 EQ@[7; 8)
9 WHITESPACE@[8; 9)
10 ARRAY_TYPE@[9; 17)
11 L_BRACK@[9; 10)
12 TUPLE_TYPE@[10; 12)
13 L_PAREN@[10; 11)
14 R_PAREN@[11; 12)
15 SEMI@[12; 13)
16 WHITESPACE@[13; 14)
17 LITERAL@[14; 16)
18 INT_NUMBER@[14; 16) "92"
19 R_BRACK@[16; 17)
20 SEMI@[17; 18)
21 WHITESPACE@[18; 19)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0025_slice_type.rs b/crates/ra_syntax/tests/data/parser/inline/0025_slice_type.rs
new file mode 100644
index 000000000..4da1af827
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0025_slice_type.rs
@@ -0,0 +1 @@
type T = [()];
diff --git a/crates/ra_syntax/tests/data/parser/inline/0025_slice_type.txt b/crates/ra_syntax/tests/data/parser/inline/0025_slice_type.txt
new file mode 100644
index 000000000..978530a6a
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0025_slice_type.txt
@@ -0,0 +1,17 @@
1ROOT@[0; 15)
2 TYPE_DEF@[0; 14)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 6)
6 IDENT@[5; 6) "T"
7 WHITESPACE@[6; 7)
8 EQ@[7; 8)
9 WHITESPACE@[8; 9)
10 SLICE_TYPE@[9; 13)
11 L_BRACK@[9; 10)
12 TUPLE_TYPE@[10; 12)
13 L_PAREN@[10; 11)
14 R_PAREN@[11; 12)
15 R_BRACK@[12; 13)
16 SEMI@[13; 14)
17 WHITESPACE@[14; 15)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0026_reference_type;.rs b/crates/ra_syntax/tests/data/parser/inline/0026_reference_type;.rs
new file mode 100644
index 000000000..3ac0badab
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0026_reference_type;.rs
@@ -0,0 +1,3 @@
1type A = &();
2type B = &'static ();
3type C = &mut ();
diff --git a/crates/ra_syntax/tests/data/parser/inline/0026_reference_type;.txt b/crates/ra_syntax/tests/data/parser/inline/0026_reference_type;.txt
new file mode 100644
index 000000000..ff27ce5dd
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0026_reference_type;.txt
@@ -0,0 +1,50 @@
1ROOT@[0; 54)
2 TYPE_DEF@[0; 13)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 6)
6 IDENT@[5; 6) "A"
7 WHITESPACE@[6; 7)
8 EQ@[7; 8)
9 WHITESPACE@[8; 9)
10 REFERENCE_TYPE@[9; 12)
11 AMP@[9; 10)
12 TUPLE_TYPE@[10; 12)
13 L_PAREN@[10; 11)
14 R_PAREN@[11; 12)
15 SEMI@[12; 13)
16 WHITESPACE@[13; 14)
17 TYPE_DEF@[14; 35)
18 TYPE_KW@[14; 18)
19 WHITESPACE@[18; 19)
20 NAME@[19; 20)
21 IDENT@[19; 20) "B"
22 WHITESPACE@[20; 21)
23 EQ@[21; 22)
24 WHITESPACE@[22; 23)
25 REFERENCE_TYPE@[23; 34)
26 AMP@[23; 24)
27 LIFETIME@[24; 31) "'static"
28 WHITESPACE@[31; 32)
29 TUPLE_TYPE@[32; 34)
30 L_PAREN@[32; 33)
31 R_PAREN@[33; 34)
32 SEMI@[34; 35)
33 WHITESPACE@[35; 36)
34 TYPE_DEF@[36; 53)
35 TYPE_KW@[36; 40)
36 WHITESPACE@[40; 41)
37 NAME@[41; 42)
38 IDENT@[41; 42) "C"
39 WHITESPACE@[42; 43)
40 EQ@[43; 44)
41 WHITESPACE@[44; 45)
42 REFERENCE_TYPE@[45; 52)
43 AMP@[45; 46)
44 MUT_KW@[46; 49)
45 WHITESPACE@[49; 50)
46 TUPLE_TYPE@[50; 52)
47 L_PAREN@[50; 51)
48 R_PAREN@[51; 52)
49 SEMI@[52; 53)
50 WHITESPACE@[53; 54)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0027_placeholder_type.rs b/crates/ra_syntax/tests/data/parser/inline/0027_placeholder_type.rs
new file mode 100644
index 000000000..7952dbd57
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0027_placeholder_type.rs
@@ -0,0 +1 @@
type Placeholder = _;
diff --git a/crates/ra_syntax/tests/data/parser/inline/0027_placeholder_type.txt b/crates/ra_syntax/tests/data/parser/inline/0027_placeholder_type.txt
new file mode 100644
index 000000000..538e4e69c
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0027_placeholder_type.txt
@@ -0,0 +1,13 @@
1ROOT@[0; 22)
2 TYPE_DEF@[0; 21)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 16)
6 IDENT@[5; 16) "Placeholder"
7 WHITESPACE@[16; 17)
8 EQ@[17; 18)
9 WHITESPACE@[18; 19)
10 PLACEHOLDER_TYPE@[19; 20)
11 UNDERSCORE@[19; 20)
12 SEMI@[20; 21)
13 WHITESPACE@[21; 22)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0028_fn_pointer_type.rs b/crates/ra_syntax/tests/data/parser/inline/0028_fn_pointer_type.rs
new file mode 100644
index 000000000..c9bf3bdb4
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0028_fn_pointer_type.rs
@@ -0,0 +1,3 @@
1type A = fn();
2type B = unsafe fn();
3type C = unsafe extern "C" fn();
diff --git a/crates/ra_syntax/tests/data/parser/inline/0028_fn_pointer_type.txt b/crates/ra_syntax/tests/data/parser/inline/0028_fn_pointer_type.txt
new file mode 100644
index 000000000..4dba83eb5
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0028_fn_pointer_type.txt
@@ -0,0 +1,55 @@
1ROOT@[0; 70)
2 TYPE_DEF@[0; 14)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 6)
6 IDENT@[5; 6) "A"
7 WHITESPACE@[6; 7)
8 EQ@[7; 8)
9 WHITESPACE@[8; 9)
10 FN_POINTER_TYPE@[9; 13)
11 FN_KW@[9; 11)
12 PARAM_LIST@[11; 13)
13 L_PAREN@[11; 12)
14 R_PAREN@[12; 13)
15 SEMI@[13; 14)
16 WHITESPACE@[14; 15)
17 TYPE_DEF@[15; 36)
18 TYPE_KW@[15; 19)
19 WHITESPACE@[19; 20)
20 NAME@[20; 21)
21 IDENT@[20; 21) "B"
22 WHITESPACE@[21; 22)
23 EQ@[22; 23)
24 WHITESPACE@[23; 24)
25 FN_POINTER_TYPE@[24; 35)
26 UNSAFE_KW@[24; 30)
27 WHITESPACE@[30; 31)
28 FN_KW@[31; 33)
29 PARAM_LIST@[33; 35)
30 L_PAREN@[33; 34)
31 R_PAREN@[34; 35)
32 SEMI@[35; 36)
33 WHITESPACE@[36; 37)
34 TYPE_DEF@[37; 69)
35 TYPE_KW@[37; 41)
36 WHITESPACE@[41; 42)
37 NAME@[42; 43)
38 IDENT@[42; 43) "C"
39 WHITESPACE@[43; 44)
40 EQ@[44; 45)
41 WHITESPACE@[45; 46)
42 FN_POINTER_TYPE@[46; 68)
43 UNSAFE_KW@[46; 52)
44 WHITESPACE@[52; 53)
45 ABI@[53; 63)
46 EXTERN_KW@[53; 59)
47 WHITESPACE@[59; 60)
48 STRING@[60; 63)
49 WHITESPACE@[63; 64)
50 FN_KW@[64; 66)
51 PARAM_LIST@[66; 68)
52 L_PAREN@[66; 67)
53 R_PAREN@[67; 68)
54 SEMI@[68; 69)
55 WHITESPACE@[69; 70)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0029_fn_pointer_type_missing_fn.rs b/crates/ra_syntax/tests/data/parser/inline/0029_fn_pointer_type_missing_fn.rs
new file mode 100644
index 000000000..f014914ff
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0029_fn_pointer_type_missing_fn.rs
@@ -0,0 +1 @@
type F = unsafe ();
diff --git a/crates/ra_syntax/tests/data/parser/inline/0029_fn_pointer_type_missing_fn.txt b/crates/ra_syntax/tests/data/parser/inline/0029_fn_pointer_type_missing_fn.txt
new file mode 100644
index 000000000..fa0771ab1
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0029_fn_pointer_type_missing_fn.txt
@@ -0,0 +1,23 @@
1ROOT@[0; 20)
2 TYPE_DEF@[0; 15)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 6)
6 IDENT@[5; 6) "F"
7 WHITESPACE@[6; 7)
8 EQ@[7; 8)
9 WHITESPACE@[8; 9)
10 UNSAFE_KW@[9; 15)
11 err: `expected `fn``
12 err: `expected SEMI`
13 WHITESPACE@[15; 16)
14 err: `expected an item`
15 ERROR@[16; 17)
16 L_PAREN@[16; 17)
17 err: `expected an item`
18 ERROR@[17; 18)
19 R_PAREN@[17; 18)
20 err: `expected an item`
21 ERROR@[18; 19)
22 SEMI@[18; 19)
23 WHITESPACE@[19; 20)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0030_fn_pointer_type_with_ret.rs b/crates/ra_syntax/tests/data/parser/inline/0030_fn_pointer_type_with_ret.rs
new file mode 100644
index 000000000..e3ba5e87f
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0030_fn_pointer_type_with_ret.rs
@@ -0,0 +1 @@
type F = fn() -> ();
diff --git a/crates/ra_syntax/tests/data/parser/inline/0030_fn_pointer_type_with_ret.txt b/crates/ra_syntax/tests/data/parser/inline/0030_fn_pointer_type_with_ret.txt
new file mode 100644
index 000000000..203839636
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0030_fn_pointer_type_with_ret.txt
@@ -0,0 +1,23 @@
1ROOT@[0; 21)
2 TYPE_DEF@[0; 20)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 6)
6 IDENT@[5; 6) "F"
7 WHITESPACE@[6; 7)
8 EQ@[7; 8)
9 WHITESPACE@[8; 9)
10 FN_POINTER_TYPE@[9; 19)
11 FN_KW@[9; 11)
12 PARAM_LIST@[11; 13)
13 L_PAREN@[11; 12)
14 R_PAREN@[12; 13)
15 WHITESPACE@[13; 14)
16 RET_TYPE@[14; 19)
17 THIN_ARROW@[14; 16)
18 WHITESPACE@[16; 17)
19 TUPLE_TYPE@[17; 19)
20 L_PAREN@[17; 18)
21 R_PAREN@[18; 19)
22 SEMI@[19; 20)
23 WHITESPACE@[20; 21)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0031_for_type.rs b/crates/ra_syntax/tests/data/parser/inline/0031_for_type.rs
new file mode 100644
index 000000000..4d6a18c6b
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0031_for_type.rs
@@ -0,0 +1 @@
type A = for<'a> fn() -> ();
diff --git a/crates/ra_syntax/tests/data/parser/inline/0031_for_type.txt b/crates/ra_syntax/tests/data/parser/inline/0031_for_type.txt
new file mode 100644
index 000000000..f6b962b2c
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0031_for_type.txt
@@ -0,0 +1,31 @@
1ROOT@[0; 29)
2 TYPE_DEF@[0; 28)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 6)
6 IDENT@[5; 6) "A"
7 WHITESPACE@[6; 7)
8 EQ@[7; 8)
9 WHITESPACE@[8; 9)
10 FOR_TYPE@[9; 27)
11 FOR_KW@[9; 12)
12 TYPE_PARAM_LIST@[12; 16)
13 L_ANGLE@[12; 13)
14 LIFETIME_PARAM@[13; 15)
15 LIFETIME@[13; 15) "'a"
16 R_ANGLE@[15; 16)
17 WHITESPACE@[16; 17)
18 FN_POINTER_TYPE@[17; 27)
19 FN_KW@[17; 19)
20 PARAM_LIST@[19; 21)
21 L_PAREN@[19; 20)
22 R_PAREN@[20; 21)
23 WHITESPACE@[21; 22)
24 RET_TYPE@[22; 27)
25 THIN_ARROW@[22; 24)
26 WHITESPACE@[24; 25)
27 TUPLE_TYPE@[25; 27)
28 L_PAREN@[25; 26)
29 R_PAREN@[26; 27)
30 SEMI@[27; 28)
31 WHITESPACE@[28; 29)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0032_path_type.rs b/crates/ra_syntax/tests/data/parser/inline/0032_path_type.rs
new file mode 100644
index 000000000..bf94f32e1
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0032_path_type.rs
@@ -0,0 +1,4 @@
1type A = Foo;
2type B = ::Foo;
3type C = self::Foo;
4type D = super::Foo;
diff --git a/crates/ra_syntax/tests/data/parser/inline/0032_path_type.txt b/crates/ra_syntax/tests/data/parser/inline/0032_path_type.txt
new file mode 100644
index 000000000..b0a110a2c
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0032_path_type.txt
@@ -0,0 +1,70 @@
1ROOT@[0; 71)
2 TYPE_DEF@[0; 13)
3 TYPE_KW@[0; 4)
4 WHITESPACE@[4; 5)
5 NAME@[5; 6)
6 IDENT@[5; 6) "A"
7 WHITESPACE@[6; 7)
8 EQ@[7; 8)
9 WHITESPACE@[8; 9)
10 PATH_TYPE@[9; 12)
11 PATH@[9; 12)
12 PATH_SEGMENT@[9; 12)
13 NAME_REF@[9; 12)
14 IDENT@[9; 12) "Foo"
15 SEMI@[12; 13)
16 WHITESPACE@[13; 14)
17 TYPE_DEF@[14; 29)
18 TYPE_KW@[14; 18)
19 WHITESPACE@[18; 19)
20 NAME@[19; 20)
21 IDENT@[19; 20) "B"
22 WHITESPACE@[20; 21)
23 EQ@[21; 22)
24 WHITESPACE@[22; 23)
25 PATH_TYPE@[23; 28)
26 PATH@[23; 28)
27 PATH_SEGMENT@[23; 28)
28 COLONCOLON@[23; 25)
29 NAME_REF@[25; 28)
30 IDENT@[25; 28) "Foo"
31 SEMI@[28; 29)
32 WHITESPACE@[29; 30)
33 TYPE_DEF@[30; 49)
34 TYPE_KW@[30; 34)
35 WHITESPACE@[34; 35)
36 NAME@[35; 36)
37 IDENT@[35; 36) "C"
38 WHITESPACE@[36; 37)
39 EQ@[37; 38)
40 WHITESPACE@[38; 39)
41 PATH_TYPE@[39; 48)
42 PATH@[39; 48)
43 PATH@[39; 43)
44 PATH_SEGMENT@[39; 43)
45 SELF_KW@[39; 43)
46 COLONCOLON@[43; 45)
47 PATH_SEGMENT@[45; 48)
48 NAME_REF@[45; 48)
49 IDENT@[45; 48) "Foo"
50 SEMI@[48; 49)
51 WHITESPACE@[49; 50)
52 TYPE_DEF@[50; 70)
53 TYPE_KW@[50; 54)
54 WHITESPACE@[54; 55)
55 NAME@[55; 56)
56 IDENT@[55; 56) "D"
57 WHITESPACE@[56; 57)
58 EQ@[57; 58)
59 WHITESPACE@[58; 59)
60 PATH_TYPE@[59; 69)
61 PATH@[59; 69)
62 PATH@[59; 64)
63 PATH_SEGMENT@[59; 64)
64 SUPER_KW@[59; 64)
65 COLONCOLON@[64; 66)
66 PATH_SEGMENT@[66; 69)
67 NAME_REF@[66; 69)
68 IDENT@[66; 69) "Foo"
69 SEMI@[69; 70)
70 WHITESPACE@[70; 71)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0034_bind_pat.rs b/crates/ra_syntax/tests/data/parser/inline/0034_bind_pat.rs
new file mode 100644
index 000000000..820a9e72c
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0034_bind_pat.rs
@@ -0,0 +1,8 @@
1fn main() {
2 let a = ();
3 let mut b = ();
4 let ref c = ();
5 let ref mut d = ();
6 let e @ _ = ();
7 let ref mut f @ g @ _ = ();
8}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0034_bind_pat.txt b/crates/ra_syntax/tests/data/parser/inline/0034_bind_pat.txt
new file mode 100644
index 000000000..9adc89b7c
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0034_bind_pat.txt
@@ -0,0 +1,127 @@
1ROOT@[0; 146)
2 FN_DEF@[0; 145)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 7)
6 IDENT@[3; 7) "main"
7 PARAM_LIST@[7; 9)
8 L_PAREN@[7; 8)
9 R_PAREN@[8; 9)
10 WHITESPACE@[9; 10)
11 BLOCK@[10; 145)
12 L_CURLY@[10; 11)
13 WHITESPACE@[11; 16)
14 LET_STMT@[16; 27)
15 LET_KW@[16; 19)
16 WHITESPACE@[19; 20)
17 BIND_PAT@[20; 21)
18 NAME@[20; 21)
19 IDENT@[20; 21) "a"
20 WHITESPACE@[21; 22)
21 EQ@[22; 23)
22 WHITESPACE@[23; 24)
23 TUPLE_EXPR@[24; 26)
24 L_PAREN@[24; 25)
25 R_PAREN@[25; 26)
26 SEMI@[26; 27)
27 WHITESPACE@[27; 32)
28 LET_STMT@[32; 47)
29 LET_KW@[32; 35)
30 WHITESPACE@[35; 36)
31 BIND_PAT@[36; 41)
32 MUT_KW@[36; 39)
33 WHITESPACE@[39; 40)
34 NAME@[40; 41)
35 IDENT@[40; 41) "b"
36 WHITESPACE@[41; 42)
37 EQ@[42; 43)
38 WHITESPACE@[43; 44)
39 TUPLE_EXPR@[44; 46)
40 L_PAREN@[44; 45)
41 R_PAREN@[45; 46)
42 SEMI@[46; 47)
43 WHITESPACE@[47; 52)
44 LET_STMT@[52; 67)
45 LET_KW@[52; 55)
46 WHITESPACE@[55; 56)
47 BIND_PAT@[56; 61)
48 REF_KW@[56; 59)
49 WHITESPACE@[59; 60)
50 NAME@[60; 61)
51 IDENT@[60; 61) "c"
52 WHITESPACE@[61; 62)
53 EQ@[62; 63)
54 WHITESPACE@[63; 64)
55 TUPLE_EXPR@[64; 66)
56 L_PAREN@[64; 65)
57 R_PAREN@[65; 66)
58 SEMI@[66; 67)
59 WHITESPACE@[67; 72)
60 LET_STMT@[72; 91)
61 LET_KW@[72; 75)
62 WHITESPACE@[75; 76)
63 BIND_PAT@[76; 85)
64 REF_KW@[76; 79)
65 WHITESPACE@[79; 80)
66 MUT_KW@[80; 83)
67 WHITESPACE@[83; 84)
68 NAME@[84; 85)
69 IDENT@[84; 85) "d"
70 WHITESPACE@[85; 86)
71 EQ@[86; 87)
72 WHITESPACE@[87; 88)
73 TUPLE_EXPR@[88; 90)
74 L_PAREN@[88; 89)
75 R_PAREN@[89; 90)
76 SEMI@[90; 91)
77 WHITESPACE@[91; 96)
78 LET_STMT@[96; 111)
79 LET_KW@[96; 99)
80 WHITESPACE@[99; 100)
81 BIND_PAT@[100; 105)
82 NAME@[100; 101)
83 IDENT@[100; 101) "e"
84 WHITESPACE@[101; 102)
85 AT@[102; 103)
86 WHITESPACE@[103; 104)
87 PLACEHOLDER_PAT@[104; 105)
88 UNDERSCORE@[104; 105)
89 WHITESPACE@[105; 106)
90 EQ@[106; 107)
91 WHITESPACE@[107; 108)
92 TUPLE_EXPR@[108; 110)
93 L_PAREN@[108; 109)
94 R_PAREN@[109; 110)
95 SEMI@[110; 111)
96 WHITESPACE@[111; 116)
97 LET_STMT@[116; 143)
98 LET_KW@[116; 119)
99 WHITESPACE@[119; 120)
100 BIND_PAT@[120; 137)
101 REF_KW@[120; 123)
102 WHITESPACE@[123; 124)
103 MUT_KW@[124; 127)
104 WHITESPACE@[127; 128)
105 NAME@[128; 129)
106 IDENT@[128; 129) "f"
107 WHITESPACE@[129; 130)
108 AT@[130; 131)
109 WHITESPACE@[131; 132)
110 BIND_PAT@[132; 137)
111 NAME@[132; 133)
112 IDENT@[132; 133) "g"
113 WHITESPACE@[133; 134)
114 AT@[134; 135)
115 WHITESPACE@[135; 136)
116 PLACEHOLDER_PAT@[136; 137)
117 UNDERSCORE@[136; 137)
118 WHITESPACE@[137; 138)
119 EQ@[138; 139)
120 WHITESPACE@[139; 140)
121 TUPLE_EXPR@[140; 142)
122 L_PAREN@[140; 141)
123 R_PAREN@[141; 142)
124 SEMI@[142; 143)
125 WHITESPACE@[143; 144)
126 R_CURLY@[144; 145)
127 WHITESPACE@[145; 146)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0035_ref_pat.rs b/crates/ra_syntax/tests/data/parser/inline/0035_ref_pat.rs
new file mode 100644
index 000000000..de41f5cae
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0035_ref_pat.rs
@@ -0,0 +1,4 @@
1fn main() {
2 let &a = ();
3 let &mut b = ();
4}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0035_ref_pat.txt b/crates/ra_syntax/tests/data/parser/inline/0035_ref_pat.txt
new file mode 100644
index 000000000..a625637cd
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0035_ref_pat.txt
@@ -0,0 +1,49 @@
1ROOT@[0; 52)
2 FN_DEF@[0; 51)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 7)
6 IDENT@[3; 7) "main"
7 PARAM_LIST@[7; 9)
8 L_PAREN@[7; 8)
9 R_PAREN@[8; 9)
10 WHITESPACE@[9; 10)
11 BLOCK@[10; 51)
12 L_CURLY@[10; 11)
13 WHITESPACE@[11; 16)
14 LET_STMT@[16; 28)
15 LET_KW@[16; 19)
16 WHITESPACE@[19; 20)
17 REF_PAT@[20; 22)
18 AMP@[20; 21)
19 BIND_PAT@[21; 22)
20 NAME@[21; 22)
21 IDENT@[21; 22) "a"
22 WHITESPACE@[22; 23)
23 EQ@[23; 24)
24 WHITESPACE@[24; 25)
25 TUPLE_EXPR@[25; 27)
26 L_PAREN@[25; 26)
27 R_PAREN@[26; 27)
28 SEMI@[27; 28)
29 WHITESPACE@[28; 33)
30 LET_STMT@[33; 49)
31 LET_KW@[33; 36)
32 WHITESPACE@[36; 37)
33 REF_PAT@[37; 43)
34 AMP@[37; 38)
35 MUT_KW@[38; 41)
36 WHITESPACE@[41; 42)
37 BIND_PAT@[42; 43)
38 NAME@[42; 43)
39 IDENT@[42; 43) "b"
40 WHITESPACE@[43; 44)
41 EQ@[44; 45)
42 WHITESPACE@[45; 46)
43 TUPLE_EXPR@[46; 48)
44 L_PAREN@[46; 47)
45 R_PAREN@[47; 48)
46 SEMI@[48; 49)
47 WHITESPACE@[49; 50)
48 R_CURLY@[50; 51)
49 WHITESPACE@[51; 52)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0036_placeholder_pat.rs b/crates/ra_syntax/tests/data/parser/inline/0036_placeholder_pat.rs
new file mode 100644
index 000000000..4d719c433
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0036_placeholder_pat.rs
@@ -0,0 +1 @@
fn main() { let _ = (); }
diff --git a/crates/ra_syntax/tests/data/parser/inline/0036_placeholder_pat.txt b/crates/ra_syntax/tests/data/parser/inline/0036_placeholder_pat.txt
new file mode 100644
index 000000000..e89ff4e7c
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0036_placeholder_pat.txt
@@ -0,0 +1,28 @@
1ROOT@[0; 26)
2 FN_DEF@[0; 25)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 7)
6 IDENT@[3; 7) "main"
7 PARAM_LIST@[7; 9)
8 L_PAREN@[7; 8)
9 R_PAREN@[8; 9)
10 WHITESPACE@[9; 10)
11 BLOCK@[10; 25)
12 L_CURLY@[10; 11)
13 WHITESPACE@[11; 12)
14 LET_STMT@[12; 23)
15 LET_KW@[12; 15)
16 WHITESPACE@[15; 16)
17 PLACEHOLDER_PAT@[16; 17)
18 UNDERSCORE@[16; 17)
19 WHITESPACE@[17; 18)
20 EQ@[18; 19)
21 WHITESPACE@[19; 20)
22 TUPLE_EXPR@[20; 22)
23 L_PAREN@[20; 21)
24 R_PAREN@[21; 22)
25 SEMI@[22; 23)
26 WHITESPACE@[23; 24)
27 R_CURLY@[24; 25)
28 WHITESPACE@[25; 26)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0037_crate_visibility.rs b/crates/ra_syntax/tests/data/parser/inline/0037_crate_visibility.rs
new file mode 100644
index 000000000..faeefde94
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0037_crate_visibility.rs
@@ -0,0 +1,4 @@
1pub(crate) struct S;
2pub(self) struct S;
3pub(self) struct S;
4pub(self) struct S;
diff --git a/crates/ra_syntax/tests/data/parser/inline/0037_crate_visibility.txt b/crates/ra_syntax/tests/data/parser/inline/0037_crate_visibility.txt
new file mode 100644
index 000000000..3b5fbf95d
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0037_crate_visibility.txt
@@ -0,0 +1,53 @@
1ROOT@[0; 81)
2 STRUCT_DEF@[0; 20)
3 VISIBILITY@[0; 10)
4 PUB_KW@[0; 3)
5 L_PAREN@[3; 4)
6 CRATE_KW@[4; 9)
7 R_PAREN@[9; 10)
8 WHITESPACE@[10; 11)
9 STRUCT_KW@[11; 17)
10 WHITESPACE@[17; 18)
11 NAME@[18; 19)
12 IDENT@[18; 19) "S"
13 SEMI@[19; 20)
14 WHITESPACE@[20; 21)
15 STRUCT_DEF@[21; 40)
16 VISIBILITY@[21; 30)
17 PUB_KW@[21; 24)
18 L_PAREN@[24; 25)
19 SELF_KW@[25; 29)
20 R_PAREN@[29; 30)
21 WHITESPACE@[30; 31)
22 STRUCT_KW@[31; 37)
23 WHITESPACE@[37; 38)
24 NAME@[38; 39)
25 IDENT@[38; 39) "S"
26 SEMI@[39; 40)
27 WHITESPACE@[40; 41)
28 STRUCT_DEF@[41; 60)
29 VISIBILITY@[41; 50)
30 PUB_KW@[41; 44)
31 L_PAREN@[44; 45)
32 SELF_KW@[45; 49)
33 R_PAREN@[49; 50)
34 WHITESPACE@[50; 51)
35 STRUCT_KW@[51; 57)
36 WHITESPACE@[57; 58)
37 NAME@[58; 59)
38 IDENT@[58; 59) "S"
39 SEMI@[59; 60)
40 WHITESPACE@[60; 61)
41 STRUCT_DEF@[61; 80)
42 VISIBILITY@[61; 70)
43 PUB_KW@[61; 64)
44 L_PAREN@[64; 65)
45 SELF_KW@[65; 69)
46 R_PAREN@[69; 70)
47 WHITESPACE@[70; 71)
48 STRUCT_KW@[71; 77)
49 WHITESPACE@[77; 78)
50 NAME@[78; 79)
51 IDENT@[78; 79) "S"
52 SEMI@[79; 80)
53 WHITESPACE@[80; 81)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0038_function_ret_type.rs b/crates/ra_syntax/tests/data/parser/inline/0038_function_ret_type.rs
new file mode 100644
index 000000000..d22d8cada
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0038_function_ret_type.rs
@@ -0,0 +1,2 @@
1fn foo() {}
2fn bar() -> () {}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0038_function_ret_type.txt b/crates/ra_syntax/tests/data/parser/inline/0038_function_ret_type.txt
new file mode 100644
index 000000000..a3d235ce1
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0038_function_ret_type.txt
@@ -0,0 +1,34 @@
1ROOT@[0; 30)
2 FN_DEF@[0; 11)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 8)
8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9)
11 BLOCK@[9; 11)
12 L_CURLY@[9; 10)
13 R_CURLY@[10; 11)
14 WHITESPACE@[11; 12)
15 FN_DEF@[12; 29)
16 FN_KW@[12; 14)
17 WHITESPACE@[14; 15)
18 NAME@[15; 18)
19 IDENT@[15; 18) "bar"
20 PARAM_LIST@[18; 20)
21 L_PAREN@[18; 19)
22 R_PAREN@[19; 20)
23 WHITESPACE@[20; 21)
24 RET_TYPE@[21; 26)
25 THIN_ARROW@[21; 23)
26 WHITESPACE@[23; 24)
27 TUPLE_TYPE@[24; 26)
28 L_PAREN@[24; 25)
29 R_PAREN@[25; 26)
30 WHITESPACE@[26; 27)
31 BLOCK@[27; 29)
32 L_CURLY@[27; 28)
33 R_CURLY@[28; 29)
34 WHITESPACE@[29; 30)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0039_path_expr.rs b/crates/ra_syntax/tests/data/parser/inline/0039_path_expr.rs
new file mode 100644
index 000000000..333ebabef
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0039_path_expr.rs
@@ -0,0 +1,6 @@
1fn foo() {
2 let _ = a;
3 let _ = a::b;
4 let _ = ::a::<b>;
5 let _ = format!();
6}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0039_path_expr.txt b/crates/ra_syntax/tests/data/parser/inline/0039_path_expr.txt
new file mode 100644
index 000000000..618afc0a9
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0039_path_expr.txt
@@ -0,0 +1,95 @@
1ROOT@[0; 91)
2 FN_DEF@[0; 90)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 8)
8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9)
11 BLOCK@[9; 90)
12 L_CURLY@[9; 10)
13 WHITESPACE@[10; 15)
14 LET_STMT@[15; 25)
15 LET_KW@[15; 18)
16 WHITESPACE@[18; 19)
17 PLACEHOLDER_PAT@[19; 20)
18 UNDERSCORE@[19; 20)
19 WHITESPACE@[20; 21)
20 EQ@[21; 22)
21 WHITESPACE@[22; 23)
22 PATH_EXPR@[23; 24)
23 PATH@[23; 24)
24 PATH_SEGMENT@[23; 24)
25 NAME_REF@[23; 24)
26 IDENT@[23; 24) "a"
27 SEMI@[24; 25)
28 WHITESPACE@[25; 30)
29 LET_STMT@[30; 43)
30 LET_KW@[30; 33)
31 WHITESPACE@[33; 34)
32 PLACEHOLDER_PAT@[34; 35)
33 UNDERSCORE@[34; 35)
34 WHITESPACE@[35; 36)
35 EQ@[36; 37)
36 WHITESPACE@[37; 38)
37 PATH_EXPR@[38; 42)
38 PATH@[38; 42)
39 PATH@[38; 39)
40 PATH_SEGMENT@[38; 39)
41 NAME_REF@[38; 39)
42 IDENT@[38; 39) "a"
43 COLONCOLON@[39; 41)
44 PATH_SEGMENT@[41; 42)
45 NAME_REF@[41; 42)
46 IDENT@[41; 42) "b"
47 SEMI@[42; 43)
48 WHITESPACE@[43; 48)
49 LET_STMT@[48; 65)
50 LET_KW@[48; 51)
51 WHITESPACE@[51; 52)
52 PLACEHOLDER_PAT@[52; 53)
53 UNDERSCORE@[52; 53)
54 WHITESPACE@[53; 54)
55 EQ@[54; 55)
56 WHITESPACE@[55; 56)
57 PATH_EXPR@[56; 64)
58 PATH@[56; 64)
59 PATH_SEGMENT@[56; 64)
60 COLONCOLON@[56; 58)
61 NAME_REF@[58; 59)
62 IDENT@[58; 59) "a"
63 TYPE_ARG_LIST@[59; 64)
64 COLONCOLON@[59; 61)
65 L_ANGLE@[61; 62)
66 TYPE_ARG@[62; 63)
67 PATH_TYPE@[62; 63)
68 PATH@[62; 63)
69 PATH_SEGMENT@[62; 63)
70 NAME_REF@[62; 63)
71 IDENT@[62; 63) "b"
72 R_ANGLE@[63; 64)
73 SEMI@[64; 65)
74 WHITESPACE@[65; 70)
75 LET_STMT@[70; 88)
76 LET_KW@[70; 73)
77 WHITESPACE@[73; 74)
78 PLACEHOLDER_PAT@[74; 75)
79 UNDERSCORE@[74; 75)
80 WHITESPACE@[75; 76)
81 EQ@[76; 77)
82 WHITESPACE@[77; 78)
83 MACRO_CALL@[78; 87)
84 PATH@[78; 84)
85 PATH_SEGMENT@[78; 84)
86 NAME_REF@[78; 84)
87 IDENT@[78; 84) "format"
88 EXCL@[84; 85)
89 TOKEN_TREE@[85; 87)
90 L_PAREN@[85; 86)
91 R_PAREN@[86; 87)
92 SEMI@[87; 88)
93 WHITESPACE@[88; 89)
94 R_CURLY@[89; 90)
95 WHITESPACE@[90; 91)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0040_expr_literals.rs b/crates/ra_syntax/tests/data/parser/inline/0040_expr_literals.rs
new file mode 100644
index 000000000..2e11a5a6e
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0040_expr_literals.rs
@@ -0,0 +1,12 @@
1fn foo() {
2 let _ = true;
3 let _ = false;
4 let _ = 1;
5 let _ = 2.0;
6 let _ = b'a';
7 let _ = 'b';
8 let _ = "c";
9 let _ = r"d";
10 let _ = b"e";
11 let _ = br"f";
12}
diff --git a/crates/ra_syntax/tests/data/parser/inline/0040_expr_literals.txt b/crates/ra_syntax/tests/data/parser/inline/0040_expr_literals.txt
new file mode 100644
index 000000000..8105ee25a
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0040_expr_literals.txt
@@ -0,0 +1,135 @@
1ROOT@[0; 189)
2 FN_DEF@[0; 188)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 6)
6 IDENT@[3; 6) "foo"
7 PARAM_LIST@[6; 8)
8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9)
11 BLOCK@[9; 188)
12 L_CURLY@[9; 10)
13 WHITESPACE@[10; 15)
14 LET_STMT@[15; 28)
15 LET_KW@[15; 18)
16 WHITESPACE@[18; 19)
17 PLACEHOLDER_PAT@[19; 20)
18 UNDERSCORE@[19; 20)
19 WHITESPACE@[20; 21)
20 EQ@[21; 22)
21 WHITESPACE@[22; 23)
22 LITERAL@[23; 27)
23 TRUE_KW@[23; 27)
24 SEMI@[27; 28)
25 WHITESPACE@[28; 33)
26 LET_STMT@[33; 47)
27 LET_KW@[33; 36)
28 WHITESPACE@[36; 37)
29 PLACEHOLDER_PAT@[37; 38)
30 UNDERSCORE@[37; 38)
31 WHITESPACE@[38; 39)
32 EQ@[39; 40)
33 WHITESPACE@[40; 41)
34 LITERAL@[41; 46)
35 FALSE_KW@[41; 46)
36 SEMI@[46; 47)
37 WHITESPACE@[47; 52)
38 LET_STMT@[52; 62)
39 LET_KW@[52; 55)
40 WHITESPACE@[55; 56)
41 PLACEHOLDER_PAT@[56; 57)
42 UNDERSCORE@[56; 57)
43 WHITESPACE@[57; 58)
44 EQ@[58; 59)
45 WHITESPACE@[59; 60)
46 LITERAL@[60; 61)
47 INT_NUMBER@[60; 61) "1"
48 SEMI@[61; 62)
49 WHITESPACE@[62; 67)
50 LET_STMT@[67; 79)
51 LET_KW@[67; 70)
52 WHITESPACE@[70; 71)
53 PLACEHOLDER_PAT@[71; 72)
54 UNDERSCORE@[71; 72)
55 WHITESPACE@[72; 73)
56 EQ@[73; 74)
57 WHITESPACE@[74; 75)
58 LITERAL@[75; 78)
59 FLOAT_NUMBER@[75; 78) "2.0"
60 SEMI@[78; 79)
61 WHITESPACE@[79; 84)
62 LET_STMT@[84; 97)
63 LET_KW@[84; 87)
64 WHITESPACE@[87; 88)
65 PLACEHOLDER_PAT@[88; 89)
66 UNDERSCORE@[88; 89)
67 WHITESPACE@[89; 90)
68 EQ@[90; 91)
69 WHITESPACE@[91; 92)
70 LITERAL@[92; 96)
71 BYTE@[92; 96)
72 SEMI@[96; 97)
73 WHITESPACE@[97; 102)
74 LET_STMT@[102; 114)
75 LET_KW@[102; 105)
76 WHITESPACE@[105; 106)
77 PLACEHOLDER_PAT@[106; 107)
78 UNDERSCORE@[106; 107)
79 WHITESPACE@[107; 108)
80 EQ@[108; 109)
81 WHITESPACE@[109; 110)
82 LITERAL@[110; 113)
83 CHAR@[110; 113)
84 SEMI@[113; 114)
85 WHITESPACE@[114; 119)
86 LET_STMT@[119; 131)
87 LET_KW@[119; 122)
88 WHITESPACE@[122; 123)
89 PLACEHOLDER_PAT@[123; 124)
90 UNDERSCORE@[123; 124)
91 WHITESPACE@[124; 125)
92 EQ@[125; 126)
93 WHITESPACE@[126; 127)
94 LITERAL@[127; 130)
95 STRING@[127; 130)
96 SEMI@[130; 131)
97 WHITESPACE@[131; 136)
98 LET_STMT@[136; 149)
99 LET_KW@[136; 139)
100 WHITESPACE@[139; 140)
101 PLACEHOLDER_PAT@[140; 141)
102 UNDERSCORE@[140; 141)
103 WHITESPACE@[141; 142)
104 EQ@[142; 143)
105 WHITESPACE@[143; 144)
106 LITERAL@[144; 148)
107 RAW_STRING@[144; 148)
108 SEMI@[148; 149)
109 WHITESPACE@[149; 154)
110 LET_STMT@[154; 167)
111 LET_KW@[154; 157)
112 WHITESPACE@[157; 158)
113 PLACEHOLDER_PAT@[158; 159)
114 UNDERSCORE@[158; 159)
115 WHITESPACE@[159; 160)
116 EQ@[160; 161)
117 WHITESPACE@[161; 162)
118 LITERAL@[162; 166)
119 BYTE_STRING@[162; 166)
120 SEMI@[166; 167)
121 WHITESPACE@[167; 172)
122 LET_STMT@[172; 186)
123 LET_KW@[172; 175)
124 WHITESPACE@[175; 176)
125 PLACEHOLDER_PAT@[176; 177)
126 UNDERSCORE@[176; 177)
127 WHITESPACE@[177; 178)
128 EQ@[178; 179)
129 WHITESPACE@[179; 180)
130 LITERAL@[180; 185)
131 RAW_BYTE_STRING@[180; 185)
132 SEMI@[185; 186)
133 WHITESPACE@[186; 187)
134 R_CURLY@[187; 188)
135 WHITESPACE@[188; 189)
diff --git a/crates/ra_syntax/tests/data/parser/inline/0041_type_param_bounds.rs b/crates/ra_syntax/tests/data/parser/inline/0041_type_param_bounds.rs
new file mode 100644
index 000000000..919bde0ee
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0041_type_param_bounds.rs
@@ -0,0 +1 @@
struct S<T: 'a + ?Sized + (Copy)>;
diff --git a/crates/ra_syntax/tests/data/parser/inline/0041_type_param_bounds.txt b/crates/ra_syntax/tests/data/parser/inline/0041_type_param_bounds.txt
new file mode 100644
index 000000000..549b571c2
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/0041_type_param_bounds.txt
@@ -0,0 +1,36 @@
1ROOT@[0; 35)
2 STRUCT_DEF@[0; 34)
3 STRUCT_KW@[0; 6)
4 WHITESPACE@[6; 7)
5 NAME@[7; 8)
6</