From 957b5ed23a4860fe3c9b80687a801b5d7870fe00 Mon Sep 17 00:00:00 2001 From: Evgenii P Date: Fri, 9 Aug 2019 15:38:52 +0700 Subject: Parse tuple struct field initialization --- crates/ra_parser/src/grammar.rs | 2 +- crates/ra_parser/src/grammar/expressions.rs | 3 +- .../test_data/parser/inline/ok/0061_struct_lit.rs | 1 + .../test_data/parser/inline/ok/0061_struct_lit.txt | 33 ++++++++++++++++++---- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/crates/ra_parser/src/grammar.rs b/crates/ra_parser/src/grammar.rs index 658034097..00fb1bac9 100644 --- a/crates/ra_parser/src/grammar.rs +++ b/crates/ra_parser/src/grammar.rs @@ -274,7 +274,7 @@ fn name(p: &mut Parser) { } fn name_ref(p: &mut Parser) { - if p.at(IDENT) { + if p.at(IDENT) || p.at(INT_NUMBER) { let m = p.start(); p.bump(); m.complete(p, NAME_REF); diff --git a/crates/ra_parser/src/grammar/expressions.rs b/crates/ra_parser/src/grammar/expressions.rs index 3e49e70c7..50c938a23 100644 --- a/crates/ra_parser/src/grammar/expressions.rs +++ b/crates/ra_parser/src/grammar/expressions.rs @@ -572,6 +572,7 @@ fn path_expr(p: &mut Parser, r: Restrictions) -> (CompletedMarker, BlockLike) { // S {}; // S { x, y: 32, }; // S { x, y: 32, ..Default::default() }; +// TupleStruct { 0: 1 }; // } pub(crate) fn named_field_list(p: &mut Parser) { assert!(p.at(T!['{'])); @@ -583,7 +584,7 @@ pub(crate) fn named_field_list(p: &mut Parser) { // fn main() { // S { #[cfg(test)] field: 1 } // } - IDENT | T![#] => { + IDENT | INT_NUMBER | T![#] => { let m = p.start(); attributes::outer_attributes(p); name_ref(p); diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0061_struct_lit.rs b/crates/ra_syntax/test_data/parser/inline/ok/0061_struct_lit.rs index eb711f68a..6285e5549 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0061_struct_lit.rs +++ b/crates/ra_syntax/test_data/parser/inline/ok/0061_struct_lit.rs @@ -2,4 +2,5 @@ fn foo() { S {}; S { x, y: 32, }; S { x, y: 32, ..Default::default() }; + TupleStruct { 0: 1 }; } diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0061_struct_lit.txt b/crates/ra_syntax/test_data/parser/inline/ok/0061_struct_lit.txt index 94d1bfe2e..d06594cae 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0061_struct_lit.txt +++ b/crates/ra_syntax/test_data/parser/inline/ok/0061_struct_lit.txt @@ -1,5 +1,5 @@ -SOURCE_FILE@[0; 86) - FN_DEF@[0; 85) +SOURCE_FILE@[0; 112) + FN_DEF@[0; 111) FN_KW@[0; 2) "fn" WHITESPACE@[2; 3) " " NAME@[3; 6) @@ -8,7 +8,7 @@ SOURCE_FILE@[0; 86) L_PAREN@[6; 7) "(" R_PAREN@[7; 8) ")" WHITESPACE@[8; 9) " " - BLOCK@[9; 85) + BLOCK@[9; 111) L_CURLY@[9; 10) "{" WHITESPACE@[10; 15) "\n " EXPR_STMT@[15; 20) @@ -92,6 +92,27 @@ SOURCE_FILE@[0; 86) WHITESPACE@[80; 81) " " R_CURLY@[81; 82) "}" SEMI@[82; 83) ";" - WHITESPACE@[83; 84) "\n" - R_CURLY@[84; 85) "}" - WHITESPACE@[85; 86) "\n" + WHITESPACE@[83; 88) "\n " + EXPR_STMT@[88; 109) + STRUCT_LIT@[88; 108) + PATH@[88; 99) + PATH_SEGMENT@[88; 99) + NAME_REF@[88; 99) + IDENT@[88; 99) "TupleStruct" + WHITESPACE@[99; 100) " " + NAMED_FIELD_LIST@[100; 108) + L_CURLY@[100; 101) "{" + WHITESPACE@[101; 102) " " + NAMED_FIELD@[102; 106) + NAME_REF@[102; 103) + INT_NUMBER@[102; 103) "0" + COLON@[103; 104) ":" + WHITESPACE@[104; 105) " " + LITERAL@[105; 106) + INT_NUMBER@[105; 106) "1" + WHITESPACE@[106; 107) " " + R_CURLY@[107; 108) "}" + SEMI@[108; 109) ";" + WHITESPACE@[109; 110) "\n" + R_CURLY@[110; 111) "}" + WHITESPACE@[111; 112) "\n" -- cgit v1.2.3 From fa24e20867893178ed7265ecadb2bcb09cf76dac Mon Sep 17 00:00:00 2001 From: Evgenii P Date: Fri, 9 Aug 2019 16:08:36 +0700 Subject: Make name_ref to accept numeric names optionally --- crates/ra_parser/src/grammar.rs | 4 ++-- crates/ra_parser/src/grammar/expressions.rs | 6 +++--- crates/ra_parser/src/grammar/items.rs | 2 +- crates/ra_parser/src/grammar/paths.rs | 2 +- crates/ra_parser/src/grammar/type_args.rs | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/crates/ra_parser/src/grammar.rs b/crates/ra_parser/src/grammar.rs index 00fb1bac9..2ee121ccd 100644 --- a/crates/ra_parser/src/grammar.rs +++ b/crates/ra_parser/src/grammar.rs @@ -273,8 +273,8 @@ fn name(p: &mut Parser) { name_r(p, TokenSet::empty()) } -fn name_ref(p: &mut Parser) { - if p.at(IDENT) || p.at(INT_NUMBER) { +fn name_ref(p: &mut Parser, allow_numeric_names: bool) { + if p.at(IDENT) || (allow_numeric_names && p.at(INT_NUMBER)) { let m = p.start(); p.bump(); m.complete(p, NAME_REF); diff --git a/crates/ra_parser/src/grammar/expressions.rs b/crates/ra_parser/src/grammar/expressions.rs index 50c938a23..9f9e9cb0e 100644 --- a/crates/ra_parser/src/grammar/expressions.rs +++ b/crates/ra_parser/src/grammar/expressions.rs @@ -458,7 +458,7 @@ fn method_call_expr(p: &mut Parser, lhs: CompletedMarker) -> CompletedMarker { assert!(p.at(T![.]) && p.nth(1) == IDENT && (p.nth(2) == T!['('] || p.nth(2) == T![::])); let m = lhs.precede(p); p.bump(); - name_ref(p); + name_ref(p, false); type_args::opt_type_arg_list(p, true); if p.at(T!['(']) { arg_list(p); @@ -485,7 +485,7 @@ fn field_expr(p: &mut Parser, lhs: CompletedMarker) -> CompletedMarker { let m = lhs.precede(p); p.bump(); if p.at(IDENT) { - name_ref(p) + name_ref(p, false) } else if p.at(INT_NUMBER) { p.bump(); } else if p.at(FLOAT_NUMBER) { @@ -587,7 +587,7 @@ pub(crate) fn named_field_list(p: &mut Parser) { IDENT | INT_NUMBER | T![#] => { let m = p.start(); attributes::outer_attributes(p); - name_ref(p); + name_ref(p, true); if p.eat(T![:]) { expr(p); } diff --git a/crates/ra_parser/src/grammar/items.rs b/crates/ra_parser/src/grammar/items.rs index 543af7c4b..b0081f396 100644 --- a/crates/ra_parser/src/grammar/items.rs +++ b/crates/ra_parser/src/grammar/items.rs @@ -279,7 +279,7 @@ fn extern_crate_item(p: &mut Parser, m: Marker) { p.bump(); assert!(p.at(T![crate])); p.bump(); - name_ref(p); + name_ref(p, false); opt_alias(p); p.expect(T![;]); m.complete(p, EXTERN_CRATE_ITEM); diff --git a/crates/ra_parser/src/grammar/paths.rs b/crates/ra_parser/src/grammar/paths.rs index 3537b0da1..2c8f0f7e8 100644 --- a/crates/ra_parser/src/grammar/paths.rs +++ b/crates/ra_parser/src/grammar/paths.rs @@ -71,7 +71,7 @@ fn path_segment(p: &mut Parser, mode: Mode, first: bool) { } match p.current() { IDENT => { - name_ref(p); + name_ref(p, false); opt_path_type_args(p, mode); } // test crate_path diff --git a/crates/ra_parser/src/grammar/type_args.rs b/crates/ra_parser/src/grammar/type_args.rs index 3db08b280..f1d999dea 100644 --- a/crates/ra_parser/src/grammar/type_args.rs +++ b/crates/ra_parser/src/grammar/type_args.rs @@ -38,12 +38,12 @@ fn type_arg(p: &mut Parser) { // test associated_type_bounds // fn print_all>(printables: T) {} IDENT if p.nth(1) == T![:] => { - name_ref(p); + name_ref(p, false); type_params::bounds(p); m.complete(p, ASSOC_TYPE_ARG); } IDENT if p.nth(1) == T![=] => { - name_ref(p); + name_ref(p, false); p.bump(); types::type_(p); m.complete(p, ASSOC_TYPE_ARG); -- cgit v1.2.3