aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax/tests
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_syntax/tests')
-rw-r--r--crates/ra_syntax/tests/data/lexer/00012_block_comment.rs4
-rw-r--r--crates/ra_syntax/tests/data/lexer/00012_block_comment.txt7
-rw-r--r--crates/ra_syntax/tests/data/lexer/0001_hello.rs1
-rw-r--r--crates/ra_syntax/tests/data/lexer/0001_hello.txt3
-rw-r--r--crates/ra_syntax/tests/data/lexer/0002_whitespace.rs4
-rw-r--r--crates/ra_syntax/tests/data/lexer/0002_whitespace.txt12
-rw-r--r--crates/ra_syntax/tests/data/lexer/0003_ident.rs1
-rw-r--r--crates/ra_syntax/tests/data/lexer/0003_ident.txt14
-rw-r--r--crates/ra_syntax/tests/data/lexer/0004_numbers.rs9
-rw-r--r--crates/ra_syntax/tests/data/lexer/0004_numbers.txt67
-rw-r--r--crates/ra_syntax/tests/data/lexer/0005_symbols.rs6
-rw-r--r--crates/ra_syntax/tests/data/lexer/0005_symbols.txt68
-rw-r--r--crates/ra_syntax/tests/data/lexer/0006_chars.rs1
-rw-r--r--crates/ra_syntax/tests/data/lexer/0006_chars.txt16
-rw-r--r--crates/ra_syntax/tests/data/lexer/0007_lifetimes.rs1
-rw-r--r--crates/ra_syntax/tests/data/lexer/0007_lifetimes.txt8
-rw-r--r--crates/ra_syntax/tests/data/lexer/0008_byte_strings.rs3
-rw-r--r--crates/ra_syntax/tests/data/lexer/0008_byte_strings.txt22
-rw-r--r--crates/ra_syntax/tests/data/lexer/0009_strings.rs2
-rw-r--r--crates/ra_syntax/tests/data/lexer/0009_strings.txt8
-rw-r--r--crates/ra_syntax/tests/data/lexer/0010_comments.rs3
-rw-r--r--crates/ra_syntax/tests/data/lexer/0010_comments.txt6
-rw-r--r--crates/ra_syntax/tests/data/lexer/0011_keywords.rs3
-rw-r--r--crates/ra_syntax/tests/data/lexer/0011_keywords.txt62
-rw-r--r--crates/ra_syntax/tests/data/lexer/0013_raw_strings.rs1
-rw-r--r--crates/ra_syntax/tests/data/lexer/0013_raw_strings.txt2
-rw-r--r--crates/ra_syntax/tests/data/lexer/0014_unclosed_char.rs1
-rw-r--r--crates/ra_syntax/tests/data/lexer/0014_unclosed_char.txt1
-rw-r--r--crates/ra_syntax/tests/data/lexer/0015_unclosed_string.rs1
-rw-r--r--crates/ra_syntax/tests/data/lexer/0015_unclosed_string.txt1
-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
-rw-r--r--crates/ra_syntax/tests/test.rs151
372 files changed, 12664 insertions, 0 deletions
diff --git a/crates/ra_syntax/tests/data/lexer/00012_block_comment.rs b/crates/ra_syntax/tests/data/lexer/00012_block_comment.rs
new file mode 100644
index 000000000..708aac197
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/00012_block_comment.rs
@@ -0,0 +1,4 @@
1/* */
2/**/
3/* /* */ */
4/*
diff --git a/crates/ra_syntax/tests/data/lexer/00012_block_comment.txt b/crates/ra_syntax/tests/data/lexer/00012_block_comment.txt
new file mode 100644
index 000000000..9958b2518
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/00012_block_comment.txt
@@ -0,0 +1,7 @@
1COMMENT 5 "/* */"
2WHITESPACE 1 "\n"
3COMMENT 4 "/**/"
4WHITESPACE 1 "\n"
5COMMENT 11 "/* /* */ */"
6WHITESPACE 1 "\n"
7COMMENT 3 "/*\n"
diff --git a/crates/ra_syntax/tests/data/lexer/0001_hello.rs b/crates/ra_syntax/tests/data/lexer/0001_hello.rs
new file mode 100644
index 000000000..95d09f2b1
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0001_hello.rs
@@ -0,0 +1 @@
hello world \ No newline at end of file
diff --git a/crates/ra_syntax/tests/data/lexer/0001_hello.txt b/crates/ra_syntax/tests/data/lexer/0001_hello.txt
new file mode 100644
index 000000000..27a5940a9
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0001_hello.txt
@@ -0,0 +1,3 @@
1IDENT 5 "hello"
2WHITESPACE 1 " "
3IDENT 5 "world"
diff --git a/crates/ra_syntax/tests/data/lexer/0002_whitespace.rs b/crates/ra_syntax/tests/data/lexer/0002_whitespace.rs
new file mode 100644
index 000000000..08fce1418
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0002_whitespace.rs
@@ -0,0 +1,4 @@
1a b c
2d
3
4e f
diff --git a/crates/ra_syntax/tests/data/lexer/0002_whitespace.txt b/crates/ra_syntax/tests/data/lexer/0002_whitespace.txt
new file mode 100644
index 000000000..01d260918
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0002_whitespace.txt
@@ -0,0 +1,12 @@
1IDENT 1 "a"
2WHITESPACE 1 " "
3IDENT 1 "b"
4WHITESPACE 2 " "
5IDENT 1 "c"
6WHITESPACE 1 "\n"
7IDENT 1 "d"
8WHITESPACE 2 "\n\n"
9IDENT 1 "e"
10WHITESPACE 1 "\t"
11IDENT 1 "f"
12WHITESPACE 1 "\n"
diff --git a/crates/ra_syntax/tests/data/lexer/0003_ident.rs b/crates/ra_syntax/tests/data/lexer/0003_ident.rs
new file mode 100644
index 000000000..c05c9c009
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0003_ident.rs
@@ -0,0 +1 @@
foo foo_ _foo _ __ x привет
diff --git a/crates/ra_syntax/tests/data/lexer/0003_ident.txt b/crates/ra_syntax/tests/data/lexer/0003_ident.txt
new file mode 100644
index 000000000..4a0d5c053
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0003_ident.txt
@@ -0,0 +1,14 @@
1IDENT 3 "foo"
2WHITESPACE 1 " "
3IDENT 4 "foo_"
4WHITESPACE 1 " "
5IDENT 4 "_foo"
6WHITESPACE 1 " "
7UNDERSCORE 1 "_"
8WHITESPACE 1 " "
9IDENT 2 "__"
10WHITESPACE 1 " "
11IDENT 1 "x"
12WHITESPACE 1 " "
13IDENT 12 "привет"
14WHITESPACE 1 "\n"
diff --git a/crates/ra_syntax/tests/data/lexer/0004_numbers.rs b/crates/ra_syntax/tests/data/lexer/0004_numbers.rs
new file mode 100644
index 000000000..dc974b553
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0004_numbers.rs
@@ -0,0 +1,9 @@
10 0b 0o 0x 00 0_ 0. 0e 0E 0z
201790 0b1790 0o1790 0x1790aAbBcCdDeEfF 001279 0_1279 0.1279 0e1279 0E1279
30..2
40.foo()
50e+1
60.e+1
70.0E-2
80___0.10000____0000e+111__
91i64 92.0f32 11__s \ No newline at end of file
diff --git a/crates/ra_syntax/tests/data/lexer/0004_numbers.txt b/crates/ra_syntax/tests/data/lexer/0004_numbers.txt
new file mode 100644
index 000000000..4b5fd9f71
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0004_numbers.txt
@@ -0,0 +1,67 @@
1INT_NUMBER 1 "0"
2WHITESPACE 1 " "
3INT_NUMBER 2 "0b"
4WHITESPACE 1 " "
5INT_NUMBER 2 "0o"
6WHITESPACE 1 " "
7INT_NUMBER 2 "0x"
8WHITESPACE 1 " "
9INT_NUMBER 2 "00"
10WHITESPACE 1 " "
11INT_NUMBER 2 "0_"
12WHITESPACE 1 " "
13FLOAT_NUMBER 2 "0."
14WHITESPACE 1 " "
15INT_NUMBER 2 "0e"
16WHITESPACE 1 " "
17INT_NUMBER 2 "0E"
18WHITESPACE 1 " "
19INT_NUMBER 2 "0z"
20WHITESPACE 1 "\n"
21INT_NUMBER 5 "01790"
22WHITESPACE 1 " "
23INT_NUMBER 6 "0b1790"
24WHITESPACE 1 " "
25INT_NUMBER 6 "0o1790"
26WHITESPACE 1 " "
27INT_NUMBER 18 "0x1790aAbBcCdDeEfF"
28WHITESPACE 1 " "
29INT_NUMBER 6 "001279"
30WHITESPACE 1 " "
31INT_NUMBER 6 "0_1279"
32WHITESPACE 1 " "
33FLOAT_NUMBER 6 "0.1279"
34WHITESPACE 1 " "
35INT_NUMBER 6 "0e1279"
36WHITESPACE 1 " "
37INT_NUMBER 6 "0E1279"
38WHITESPACE 1 "\n"
39INT_NUMBER 1 "0"
40DOTDOT 2 ".."
41INT_NUMBER 1 "2"
42WHITESPACE 1 "\n"
43INT_NUMBER 1 "0"
44DOT 1 "."
45IDENT 3 "foo"
46L_PAREN 1 "("
47R_PAREN 1 ")"
48WHITESPACE 1 "\n"
49INT_NUMBER 2 "0e"
50PLUS 1 "+"
51INT_NUMBER 1 "1"
52WHITESPACE 1 "\n"
53INT_NUMBER 1 "0"
54DOT 1 "."
55IDENT 1 "e"
56PLUS 1 "+"
57INT_NUMBER 1 "1"
58WHITESPACE 1 "\n"
59FLOAT_NUMBER 6 "0.0E-2"
60WHITESPACE 1 "\n"
61FLOAT_NUMBER 26 "0___0.10000____0000e+111__"
62WHITESPACE 1 "\n"
63INT_NUMBER 4 "1i64"
64WHITESPACE 1 " "
65FLOAT_NUMBER 7 "92.0f32"
66WHITESPACE 1 " "
67INT_NUMBER 5 "11__s"
diff --git a/crates/ra_syntax/tests/data/lexer/0005_symbols.rs b/crates/ra_syntax/tests/data/lexer/0005_symbols.rs
new file mode 100644
index 000000000..487569b5a
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0005_symbols.rs
@@ -0,0 +1,6 @@
1; , ( ) { } [ ] < > @ # ~ ? $ & | + * / ^ %
2. .. ... ..=
3: ::
4= =>
5! !=
6- ->
diff --git a/crates/ra_syntax/tests/data/lexer/0005_symbols.txt b/crates/ra_syntax/tests/data/lexer/0005_symbols.txt
new file mode 100644
index 000000000..a6bc83a6f
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0005_symbols.txt
@@ -0,0 +1,68 @@
1SEMI 1 ";"
2WHITESPACE 1 " "
3COMMA 1 ","
4WHITESPACE 1 " "
5L_PAREN 1 "("
6WHITESPACE 1 " "
7R_PAREN 1 ")"
8WHITESPACE 1 " "
9L_CURLY 1 "{"
10WHITESPACE 1 " "
11R_CURLY 1 "}"
12WHITESPACE 1 " "
13L_BRACK 1 "["
14WHITESPACE 1 " "
15R_BRACK 1 "]"
16WHITESPACE 1 " "
17L_ANGLE 1 "<"
18WHITESPACE 1 " "
19R_ANGLE 1 ">"
20WHITESPACE 1 " "
21AT 1 "@"
22WHITESPACE 1 " "
23POUND 1 "#"
24WHITESPACE 1 " "
25TILDE 1 "~"
26WHITESPACE 1 " "
27QUESTION 1 "?"
28WHITESPACE 1 " "
29DOLLAR 1 "$"
30WHITESPACE 1 " "
31AMP 1 "&"
32WHITESPACE 1 " "
33PIPE 1 "|"
34WHITESPACE 1 " "
35PLUS 1 "+"
36WHITESPACE 1 " "
37STAR 1 "*"
38WHITESPACE 1 " "
39SLASH 1 "/"
40WHITESPACE 1 " "
41CARET 1 "^"
42WHITESPACE 1 " "
43PERCENT 1 "%"
44WHITESPACE 1 "\n"
45DOT 1 "."
46WHITESPACE 1 " "
47DOTDOT 2 ".."
48WHITESPACE 1 " "
49DOTDOTDOT 3 "..."
50WHITESPACE 1 " "
51DOTDOTEQ 3 "..="
52WHITESPACE 1 "\n"
53COLON 1 ":"
54WHITESPACE 1 " "
55COLONCOLON 2 "::"
56WHITESPACE 1 "\n"
57EQ 1 "="
58WHITESPACE 1 " "
59FAT_ARROW 2 "=>"
60WHITESPACE 1 "\n"
61EXCL 1 "!"
62WHITESPACE 1 " "
63NEQ 2 "!="
64WHITESPACE 1 "\n"
65MINUS 1 "-"
66WHITESPACE 1 " "
67THIN_ARROW 2 "->"
68WHITESPACE 1 "\n"
diff --git a/crates/ra_syntax/tests/data/lexer/0006_chars.rs b/crates/ra_syntax/tests/data/lexer/0006_chars.rs
new file mode 100644
index 000000000..454ee0a5f
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0006_chars.rs
@@ -0,0 +1 @@
'x' ' ' '0' 'hello' '\x7f' '\n' '\\' '\''
diff --git a/crates/ra_syntax/tests/data/lexer/0006_chars.txt b/crates/ra_syntax/tests/data/lexer/0006_chars.txt
new file mode 100644
index 000000000..950954fbc
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0006_chars.txt
@@ -0,0 +1,16 @@
1CHAR 3 "\'x\'"
2WHITESPACE 1 " "
3CHAR 3 "\' \'"
4WHITESPACE 1 " "
5CHAR 3 "\'0\'"
6WHITESPACE 1 " "
7CHAR 7 "\'hello\'"
8WHITESPACE 1 " "
9CHAR 6 "\'\\x7f\'"
10WHITESPACE 1 " "
11CHAR 4 "\'\\n\'"
12WHITESPACE 1 " "
13CHAR 4 "\'\\\\\'"
14WHITESPACE 1 " "
15CHAR 4 "\'\\\'\'"
16WHITESPACE 1 "\n"
diff --git a/crates/ra_syntax/tests/data/lexer/0007_lifetimes.rs b/crates/ra_syntax/tests/data/lexer/0007_lifetimes.rs
new file mode 100644
index 000000000..b764f1dce
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0007_lifetimes.rs
@@ -0,0 +1 @@
'a 'foo 'foo_bar_baz '_
diff --git a/crates/ra_syntax/tests/data/lexer/0007_lifetimes.txt b/crates/ra_syntax/tests/data/lexer/0007_lifetimes.txt
new file mode 100644
index 000000000..005c29100
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0007_lifetimes.txt
@@ -0,0 +1,8 @@
1LIFETIME 2 "\'a"
2WHITESPACE 1 " "
3LIFETIME 4 "\'foo"
4WHITESPACE 1 " "
5LIFETIME 12 "\'foo_bar_baz"
6WHITESPACE 1 " "
7LIFETIME 2 "\'_"
8WHITESPACE 1 "\n"
diff --git a/crates/ra_syntax/tests/data/lexer/0008_byte_strings.rs b/crates/ra_syntax/tests/data/lexer/0008_byte_strings.rs
new file mode 100644
index 000000000..b54930f5e
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0008_byte_strings.rs
@@ -0,0 +1,3 @@
1b'' b'x' b"foo" br""
2b''suf b""ix br""br
3b'\n' b'\\' b'\'' b'hello'
diff --git a/crates/ra_syntax/tests/data/lexer/0008_byte_strings.txt b/crates/ra_syntax/tests/data/lexer/0008_byte_strings.txt
new file mode 100644
index 000000000..bc03b51a8
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0008_byte_strings.txt
@@ -0,0 +1,22 @@
1BYTE 3 "b\'\'"
2WHITESPACE 1 " "
3BYTE 4 "b\'x\'"
4WHITESPACE 1 " "
5BYTE_STRING 6 "b\"foo\""
6WHITESPACE 1 " "
7RAW_BYTE_STRING 4 "br\"\""
8WHITESPACE 1 "\n"
9BYTE 6 "b\'\'suf"
10WHITESPACE 1 " "
11BYTE_STRING 5 "b\"\"ix"
12WHITESPACE 1 " "
13RAW_BYTE_STRING 6 "br\"\"br"
14WHITESPACE 1 "\n"
15BYTE 5 "b\'\\n\'"
16WHITESPACE 1 " "
17BYTE 5 "b\'\\\\\'"
18WHITESPACE 1 " "
19BYTE 5 "b\'\\\'\'"
20WHITESPACE 1 " "
21BYTE 8 "b\'hello\'"
22WHITESPACE 1 "\n"
diff --git a/crates/ra_syntax/tests/data/lexer/0009_strings.rs b/crates/ra_syntax/tests/data/lexer/0009_strings.rs
new file mode 100644
index 000000000..4ddb5bffc
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0009_strings.rs
@@ -0,0 +1,2 @@
1"hello" r"world" "\n\"\\no escape" "multi
2line"
diff --git a/crates/ra_syntax/tests/data/lexer/0009_strings.txt b/crates/ra_syntax/tests/data/lexer/0009_strings.txt
new file mode 100644
index 000000000..4cb4d711d
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0009_strings.txt
@@ -0,0 +1,8 @@
1STRING 7 "\"hello\""
2WHITESPACE 1 " "
3RAW_STRING 8 "r\"world\""
4WHITESPACE 1 " "
5STRING 17 "\"\\n\\\"\\\\no escape\""
6WHITESPACE 1 " "
7STRING 12 "\"multi\nline\""
8WHITESPACE 1 "\n"
diff --git a/crates/ra_syntax/tests/data/lexer/0010_comments.rs b/crates/ra_syntax/tests/data/lexer/0010_comments.rs
new file mode 100644
index 000000000..71bdd1f9c
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0010_comments.rs
@@ -0,0 +1,3 @@
1#!/usr/bin/env bash
2// hello
3//! World
diff --git a/crates/ra_syntax/tests/data/lexer/0010_comments.txt b/crates/ra_syntax/tests/data/lexer/0010_comments.txt
new file mode 100644
index 000000000..3c997de3f
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0010_comments.txt
@@ -0,0 +1,6 @@
1SHEBANG 19 "#!/usr/bin/env bash"
2WHITESPACE 1 "\n"
3COMMENT 8 "// hello"
4WHITESPACE 1 "\n"
5COMMENT 9 "//! World"
6WHITESPACE 1 "\n"
diff --git a/crates/ra_syntax/tests/data/lexer/0011_keywords.rs b/crates/ra_syntax/tests/data/lexer/0011_keywords.rs
new file mode 100644
index 000000000..e6bf64d4d
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0011_keywords.rs
@@ -0,0 +1,3 @@
1fn use struct trait enum impl true false as extern crate
2mod pub self super in where for loop while if match const
3static mut type ref let else move return
diff --git a/crates/ra_syntax/tests/data/lexer/0011_keywords.txt b/crates/ra_syntax/tests/data/lexer/0011_keywords.txt
new file mode 100644
index 000000000..d6a1abe8a
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0011_keywords.txt
@@ -0,0 +1,62 @@
1FN_KW 2 "fn"
2WHITESPACE 1 " "
3USE_KW 3 "use"
4WHITESPACE 1 " "
5STRUCT_KW 6 "struct"
6WHITESPACE 1 " "
7TRAIT_KW 5 "trait"
8WHITESPACE 1 " "
9ENUM_KW 4 "enum"
10WHITESPACE 1 " "
11IMPL_KW 4 "impl"
12WHITESPACE 1 " "
13TRUE_KW 4 "true"
14WHITESPACE 1 " "
15FALSE_KW 5 "false"
16WHITESPACE 1 " "
17AS_KW 2 "as"
18WHITESPACE 1 " "
19EXTERN_KW 6 "extern"
20WHITESPACE 1 " "
21CRATE_KW 5 "crate"
22WHITESPACE 1 "\n"
23MOD_KW 3 "mod"
24WHITESPACE 1 " "
25PUB_KW 3 "pub"
26WHITESPACE 1 " "
27SELF_KW 4 "self"
28WHITESPACE 1 " "
29SUPER_KW 5 "super"
30WHITESPACE 1 " "
31IN_KW 2 "in"
32WHITESPACE 1 " "
33WHERE_KW 5 "where"
34WHITESPACE 1 " "
35FOR_KW 3 "for"
36WHITESPACE 1 " "
37LOOP_KW 4 "loop"
38WHITESPACE 1 " "
39WHILE_KW 5 "while"
40WHITESPACE 1 " "
41IF_KW 2 "if"
42WHITESPACE 1 " "
43MATCH_KW 5 "match"
44WHITESPACE 1 " "
45CONST_KW 5 "const"
46WHITESPACE 1 "\n"
47STATIC_KW 6 "static"
48WHITESPACE 1 " "
49MUT_KW 3 "mut"
50WHITESPACE 1 " "
51TYPE_KW 4 "type"
52WHITESPACE 1 " "
53REF_KW 3 "ref"
54WHITESPACE 1 " "
55LET_KW 3 "let"
56WHITESPACE 1 " "
57ELSE_KW 4 "else"
58WHITESPACE 1 " "
59MOVE_KW 4 "move"
60WHITESPACE 1 " "
61RETURN_KW 6 "return"
62WHITESPACE 1 "\n"
diff --git a/crates/ra_syntax/tests/data/lexer/0013_raw_strings.rs b/crates/ra_syntax/tests/data/lexer/0013_raw_strings.rs
new file mode 100644
index 000000000..e5ed0b693
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0013_raw_strings.rs
@@ -0,0 +1 @@
r###"this is a r##"raw"## string"###
diff --git a/crates/ra_syntax/tests/data/lexer/0013_raw_strings.txt b/crates/ra_syntax/tests/data/lexer/0013_raw_strings.txt
new file mode 100644
index 000000000..9cf0957d1
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0013_raw_strings.txt
@@ -0,0 +1,2 @@
1RAW_STRING 36 "r###\"this is a r##\"raw\"## string\"###"
2WHITESPACE 1 "\n"
diff --git a/crates/ra_syntax/tests/data/lexer/0014_unclosed_char.rs b/crates/ra_syntax/tests/data/lexer/0014_unclosed_char.rs
new file mode 100644
index 000000000..9c0007077
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0014_unclosed_char.rs
@@ -0,0 +1 @@
'1 \ No newline at end of file
diff --git a/crates/ra_syntax/tests/data/lexer/0014_unclosed_char.txt b/crates/ra_syntax/tests/data/lexer/0014_unclosed_char.txt
new file mode 100644
index 000000000..812dfbc18
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0014_unclosed_char.txt
@@ -0,0 +1 @@
CHAR 2 "\'1"
diff --git a/crates/ra_syntax/tests/data/lexer/0015_unclosed_string.rs b/crates/ra_syntax/tests/data/lexer/0015_unclosed_string.rs
new file mode 100644
index 000000000..d771a26d4
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0015_unclosed_string.rs
@@ -0,0 +1 @@
"hello
diff --git a/crates/ra_syntax/tests/data/lexer/0015_unclosed_string.txt b/crates/ra_syntax/tests/data/lexer/0015_unclosed_string.txt
new file mode 100644
index 000000000..728c40b66
--- /dev/null
+++ b/crates/ra_syntax/tests/data/lexer/0015_unclosed_string.txt
@@ -0,0 +1 @@
STRING 7 "\"hello\n"
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)