From c6f4a06b4297f498da4bc2cd747aa38effb855b0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 18 Feb 2018 01:06:48 +0300 Subject: [PATCH] G: value_parameters, patterns & let statement --- grammar.ron | 11 +++ src/parser/grammar/expressions.rs | 17 +++- src/parser/grammar/items/mod.rs | 28 +++++- src/parser/grammar/mod.rs | 20 ++++ src/parser/grammar/patterns.rs | 52 ++++++++++ src/syntax_kinds.rs | 20 ++++ tests/data/lexer/0011_keywords.rs | 2 +- tests/data/lexer/0011_keywords.txt | 4 + .../parser/err/0005_attribute_recover.txt | 22 +++-- .../parser/err/0007_stray_curly_in_file.txt | 7 +- .../parser/err/0008_item_block_recovery.txt | 22 +++-- .../parser/inline/0001_const_unsafe_fn.txt | 9 +- tests/data/parser/inline/0002_const_fn.txt | 9 +- tests/data/parser/inline/0004_extern_fn.txt | 9 +- tests/data/parser/inline/0011_unsafe_fn.txt | 9 +- .../parser/inline/0012_unsafe_extern_fn.txt | 9 +- .../inline/0013_unsafe_block_in_mod.txt | 14 +-- .../parser/inline/0033_fn_value_parameters.rs | 4 + .../inline/0033_fn_value_parameters.txt | 95 +++++++++++++++++++ tests/data/parser/inline/0034_bind_pat.rs | 6 ++ tests/data/parser/inline/0034_bind_pat.txt | 81 ++++++++++++++++ tests/data/parser/inline/0035_ref_pat.rs | 4 + tests/data/parser/inline/0035_ref_pat.txt | 48 ++++++++++ .../parser/inline/0036_placeholder_pat.rs | 1 + .../parser/inline/0036_placeholder_pat.txt | 27 ++++++ tests/data/parser/ok/0005_fn_item.txt | 11 ++- tests/data/parser/ok/0008_mod_item.txt | 11 ++- tests/data/parser/ok/0011_outer_attribute.txt | 9 +- tests/data/parser/ok/0012_visibility.txt | 45 +++++---- .../parser/ok/0017_attr_trailing_comma.txt | 9 +- tests/data/parser/ok/0021_extern_fn.txt | 33 ++++--- 31 files changed, 541 insertions(+), 107 deletions(-) create mode 100644 src/parser/grammar/patterns.rs create mode 100644 tests/data/parser/inline/0033_fn_value_parameters.rs create mode 100644 tests/data/parser/inline/0033_fn_value_parameters.txt create mode 100644 tests/data/parser/inline/0034_bind_pat.rs create mode 100644 tests/data/parser/inline/0034_bind_pat.txt create mode 100644 tests/data/parser/inline/0035_ref_pat.rs create mode 100644 tests/data/parser/inline/0035_ref_pat.txt create mode 100644 tests/data/parser/inline/0036_placeholder_pat.rs create mode 100644 tests/data/parser/inline/0036_placeholder_pat.txt diff --git a/grammar.ron b/grammar.ron index fbb3c384ab2..d5d2e6162e8 100644 --- a/grammar.ron +++ b/grammar.ron @@ -27,6 +27,8 @@ Grammar( "mut", "unsafe", "type", + "ref", + "let", ], contextual_keywords: [ "auto", @@ -113,6 +115,12 @@ Grammar( "FN_POINTER_TYPE", "FOR_TYPE", + "REF_PAT", + "BIND_PAT", + "PLACEHOLDER_PAT", + + "TUPLE_EXPR", + "EXTERN_BLOCK", "ENUM_VARIANT", "NAMED_FIELD", @@ -132,5 +140,8 @@ Grammar( "ABI", "NAME", "NAME_REF", + "VALUE_PARAMETER", + "BLOCK", + "LET_STMT", ] ) diff --git a/src/parser/grammar/expressions.rs b/src/parser/grammar/expressions.rs index 3704cb16fe9..2145b8d8ba3 100644 --- a/src/parser/grammar/expressions.rs +++ b/src/parser/grammar/expressions.rs @@ -14,7 +14,20 @@ pub(super) fn literal(p: &mut Parser) -> bool { } pub(super) fn expr(p: &mut Parser) { - if !literal(p) { - p.error("expected expression"); + if literal(p) { + return; + } + + match p.current() { + L_PAREN => tuple_expr(p), + _ => p.error("expected expression"), } } + +fn tuple_expr(p: &mut Parser) { + assert!(p.at(L_PAREN)); + let m = p.start(); + p.expect(L_PAREN); + p.expect(R_PAREN); + m.complete(p, TUPLE_EXPR); +} diff --git a/src/parser/grammar/items/mod.rs b/src/parser/grammar/items/mod.rs index 3af6d13a19e..1fe646652bf 100644 --- a/src/parser/grammar/items/mod.rs +++ b/src/parser/grammar/items/mod.rs @@ -218,9 +218,33 @@ fn fn_item(p: &mut Parser) { p.error("expected function arguments"); } - if p.at(L_CURLY) { - p.expect(L_CURLY); + block(p); + + fn block(p: &mut Parser) { + if !p.at(L_CURLY) { + p.error("expected block"); + } + let m = p.start(); + p.bump(); + while !p.at(EOF) && !p.at(R_CURLY) { + match p.current() { + LET_KW => let_stmt(p), + _ => p.err_and_bump("expected statement"), + } + } p.expect(R_CURLY); + m.complete(p, BLOCK); + } + + fn let_stmt(p: &mut Parser) { + assert!(p.at(LET_KW)); + let m = p.start(); + p.bump(); + patterns::pattern(p); + p.expect(EQ); + expressions::expr(p); + p.expect(SEMI); + m.complete(p, LET_STMT); } } diff --git a/src/parser/grammar/mod.rs b/src/parser/grammar/mod.rs index ee0263203e7..54a63a5474f 100644 --- a/src/parser/grammar/mod.rs +++ b/src/parser/grammar/mod.rs @@ -30,6 +30,7 @@ mod items; mod attributes; mod expressions; mod types; +mod patterns; mod paths; mod type_params; @@ -85,10 +86,29 @@ fn abi(p: &mut Parser) { abi.complete(p, ABI); } +// test fn_value_parameters +// fn a() {} +// fn b(x: i32) {} +// fn c(x: i32, ) {} +// fn d(x: i32, y: ()) {} fn fn_value_parameters(p: &mut Parser) { assert!(p.at(L_PAREN)); p.bump(); + while !p.at(EOF) && !p.at(R_PAREN) { + value_parameter(p); + if !p.at(R_PAREN) { + p.expect(COMMA); + } + } p.expect(R_PAREN); + + fn value_parameter(p: &mut Parser) { + let m = p.start(); + patterns::pattern(p); + p.expect(COLON); + types::type_(p); + m.complete(p, VALUE_PARAMETER); + } } fn fn_ret_type(p: &mut Parser) { diff --git a/src/parser/grammar/patterns.rs b/src/parser/grammar/patterns.rs new file mode 100644 index 00000000000..6e4f2236bfd --- /dev/null +++ b/src/parser/grammar/patterns.rs @@ -0,0 +1,52 @@ +use super::*; + +pub(super) fn pattern(p: &mut Parser) { + match p.current() { + UNDERSCORE => placeholder_pat(p), + AMPERSAND => ref_pat(p), + IDENT | REF_KW => bind_pat(p), + _ => p.err_and_bump("expected pattern"), + } +} + +// test placeholder_pat +// fn main() { let _ = (); } +fn placeholder_pat(p: &mut Parser) { + assert!(p.at(UNDERSCORE)); + let m = p.start(); + p.bump(); + m.complete(p, PLACEHOLDER_PAT); +} + +// test ref_pat +// fn main() { +// let &a = (); +// let &mut b = (); +// } +fn ref_pat(p: &mut Parser) { + assert!(p.at(AMPERSAND)); + let m = p.start(); + p.bump(); + p.eat(MUT_KW); + pattern(p); + m.complete(p, REF_PAT); +} + +// test bind_pat +// fn main() { +// let a = (); +// let ref b = (); +// let ref mut c = (); +// let d @ _ = (); +// } +fn bind_pat(p: &mut Parser) { + let m = p.start(); + if p.eat(REF_KW) { + p.eat(MUT_KW); + } + name(p); + if p.eat(AT) { + pattern(p); + } + m.complete(p, BIND_PAT); +} diff --git a/src/syntax_kinds.rs b/src/syntax_kinds.rs index 537a80417ef..1cc29bb61e3 100644 --- a/src/syntax_kinds.rs +++ b/src/syntax_kinds.rs @@ -84,6 +84,8 @@ pub enum SyntaxKind { MUT_KW, UNSAFE_KW, TYPE_KW, + REF_KW, + LET_KW, AUTO_KW, DEFAULT_KW, UNION_KW, @@ -110,6 +112,10 @@ pub enum SyntaxKind { PLACEHOLDER_TYPE, FN_POINTER_TYPE, FOR_TYPE, + REF_PAT, + BIND_PAT, + PLACEHOLDER_PAT, + TUPLE_EXPR, EXTERN_BLOCK, ENUM_VARIANT, NAMED_FIELD, @@ -129,6 +135,9 @@ pub enum SyntaxKind { ABI, NAME, NAME_REF, + VALUE_PARAMETER, + BLOCK, + LET_STMT, // Technical SyntaxKinds: they appear temporally during parsing, // but never end up in the final tree @@ -220,6 +229,8 @@ impl SyntaxKind { MUT_KW => &SyntaxInfo { name: "MUT_KW" }, UNSAFE_KW => &SyntaxInfo { name: "UNSAFE_KW" }, TYPE_KW => &SyntaxInfo { name: "TYPE_KW" }, + REF_KW => &SyntaxInfo { name: "REF_KW" }, + LET_KW => &SyntaxInfo { name: "LET_KW" }, AUTO_KW => &SyntaxInfo { name: "AUTO_KW" }, DEFAULT_KW => &SyntaxInfo { name: "DEFAULT_KW" }, UNION_KW => &SyntaxInfo { name: "UNION_KW" }, @@ -246,6 +257,10 @@ impl SyntaxKind { PLACEHOLDER_TYPE => &SyntaxInfo { name: "PLACEHOLDER_TYPE" }, FN_POINTER_TYPE => &SyntaxInfo { name: "FN_POINTER_TYPE" }, FOR_TYPE => &SyntaxInfo { name: "FOR_TYPE" }, + REF_PAT => &SyntaxInfo { name: "REF_PAT" }, + BIND_PAT => &SyntaxInfo { name: "BIND_PAT" }, + PLACEHOLDER_PAT => &SyntaxInfo { name: "PLACEHOLDER_PAT" }, + TUPLE_EXPR => &SyntaxInfo { name: "TUPLE_EXPR" }, EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" }, ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" }, NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" }, @@ -265,6 +280,9 @@ impl SyntaxKind { ABI => &SyntaxInfo { name: "ABI" }, NAME => &SyntaxInfo { name: "NAME" }, NAME_REF => &SyntaxInfo { name: "NAME_REF" }, + VALUE_PARAMETER => &SyntaxInfo { name: "VALUE_PARAMETER" }, + BLOCK => &SyntaxInfo { name: "BLOCK" }, + LET_STMT => &SyntaxInfo { name: "LET_STMT" }, TOMBSTONE => &SyntaxInfo { name: "TOMBSTONE" }, EOF => &SyntaxInfo { name: "EOF" }, @@ -301,6 +319,8 @@ pub(crate) fn ident_to_keyword(ident: &str) -> Option { "mut" => Some(MUT_KW), "unsafe" => Some(UNSAFE_KW), "type" => Some(TYPE_KW), + "ref" => Some(REF_KW), + "let" => Some(LET_KW), _ => None, } } diff --git a/tests/data/lexer/0011_keywords.rs b/tests/data/lexer/0011_keywords.rs index 7a9509f3cdd..97ff3f954fe 100644 --- a/tests/data/lexer/0011_keywords.rs +++ b/tests/data/lexer/0011_keywords.rs @@ -1,3 +1,3 @@ fn use struct trait enum impl true false as extern crate mod pub self super in where for loop while if match const -static mut type +static mut type ref let diff --git a/tests/data/lexer/0011_keywords.txt b/tests/data/lexer/0011_keywords.txt index 96528952b0d..851a671f5cb 100644 --- a/tests/data/lexer/0011_keywords.txt +++ b/tests/data/lexer/0011_keywords.txt @@ -49,4 +49,8 @@ WHITESPACE 1 " " MUT_KW 3 "mut" WHITESPACE 1 " " TYPE_KW 4 "type" +WHITESPACE 1 " " +REF_KW 3 "ref" +WHITESPACE 1 " " +LET_KW 3 "let" WHITESPACE 1 "\n" diff --git a/tests/data/parser/err/0005_attribute_recover.txt b/tests/data/parser/err/0005_attribute_recover.txt index 15e77f63bc6..731f5f2f84e 100644 --- a/tests/data/parser/err/0005_attribute_recover.txt +++ b/tests/data/parser/err/0005_attribute_recover.txt @@ -28,11 +28,12 @@ FILE@[0; 54) IDENT@[22; 25) "foo" L_PAREN@[25; 26) R_PAREN@[26; 27) - WHITESPACE@[27; 28) - L_CURLY@[28; 29) - WHITESPACE@[29; 30) - R_CURLY@[30; 31) - WHITESPACE@[31; 34) + BLOCK@[27; 34) + WHITESPACE@[27; 28) + L_CURLY@[28; 29) + WHITESPACE@[29; 30) + R_CURLY@[30; 31) + WHITESPACE@[31; 34) FN_ITEM@[34; 54) ATTR@[34; 41) POUND@[34; 35) @@ -49,8 +50,9 @@ FILE@[0; 54) IDENT@[44; 47) "foo" L_PAREN@[47; 48) R_PAREN@[48; 49) - WHITESPACE@[49; 50) - L_CURLY@[50; 51) - WHITESPACE@[51; 52) - R_CURLY@[52; 53) - WHITESPACE@[53; 54) + BLOCK@[49; 54) + WHITESPACE@[49; 50) + L_CURLY@[50; 51) + WHITESPACE@[51; 52) + R_CURLY@[52; 53) + WHITESPACE@[53; 54) diff --git a/tests/data/parser/err/0007_stray_curly_in_file.txt b/tests/data/parser/err/0007_stray_curly_in_file.txt index f20807bfecf..8a3cb5096f5 100644 --- a/tests/data/parser/err/0007_stray_curly_in_file.txt +++ b/tests/data/parser/err/0007_stray_curly_in_file.txt @@ -21,9 +21,10 @@ FILE@[0; 31) IDENT@[20; 23) "foo" L_PAREN@[23; 24) R_PAREN@[24; 25) - L_CURLY@[25; 26) - R_CURLY@[26; 27) - WHITESPACE@[27; 29) + BLOCK@[25; 29) + L_CURLY@[25; 26) + R_CURLY@[26; 27) + WHITESPACE@[27; 29) ERROR@[29; 31) err: `expected item` R_CURLY@[29; 30) diff --git a/tests/data/parser/err/0008_item_block_recovery.txt b/tests/data/parser/err/0008_item_block_recovery.txt index ddfb4b4dc48..0e2aae7cc8c 100644 --- a/tests/data/parser/err/0008_item_block_recovery.txt +++ b/tests/data/parser/err/0008_item_block_recovery.txt @@ -6,11 +6,12 @@ FILE@[0; 95) IDENT@[3; 6) "foo" L_PAREN@[6; 7) R_PAREN@[7; 8) - WHITESPACE@[8; 9) - L_CURLY@[9; 10) - WHITESPACE@[10; 11) - R_CURLY@[11; 12) - WHITESPACE@[12; 14) + BLOCK@[8; 14) + WHITESPACE@[8; 9) + L_CURLY@[9; 10) + WHITESPACE@[10; 11) + R_CURLY@[11; 12) + WHITESPACE@[12; 14) ERROR@[14; 17) err: `expected item` IDENT@[14; 17) "bar" @@ -56,8 +57,9 @@ FILE@[0; 95) IDENT@[85; 88) "baz" L_PAREN@[88; 89) R_PAREN@[89; 90) - WHITESPACE@[90; 91) - L_CURLY@[91; 92) - WHITESPACE@[92; 93) - R_CURLY@[93; 94) - WHITESPACE@[94; 95) + BLOCK@[90; 95) + WHITESPACE@[90; 91) + L_CURLY@[91; 92) + WHITESPACE@[92; 93) + R_CURLY@[93; 94) + WHITESPACE@[94; 95) diff --git a/tests/data/parser/inline/0001_const_unsafe_fn.txt b/tests/data/parser/inline/0001_const_unsafe_fn.txt index 59bf89ddb34..48de02284b5 100644 --- a/tests/data/parser/inline/0001_const_unsafe_fn.txt +++ b/tests/data/parser/inline/0001_const_unsafe_fn.txt @@ -10,7 +10,8 @@ FILE@[0; 25) IDENT@[16; 19) "foo" L_PAREN@[19; 20) R_PAREN@[20; 21) - WHITESPACE@[21; 22) - L_CURLY@[22; 23) - R_CURLY@[23; 24) - WHITESPACE@[24; 25) + BLOCK@[21; 25) + WHITESPACE@[21; 22) + L_CURLY@[22; 23) + R_CURLY@[23; 24) + WHITESPACE@[24; 25) diff --git a/tests/data/parser/inline/0002_const_fn.txt b/tests/data/parser/inline/0002_const_fn.txt index 2e9d18f7fbe..733e476565c 100644 --- a/tests/data/parser/inline/0002_const_fn.txt +++ b/tests/data/parser/inline/0002_const_fn.txt @@ -8,7 +8,8 @@ FILE@[0; 18) IDENT@[9; 12) "foo" L_PAREN@[12; 13) R_PAREN@[13; 14) - WHITESPACE@[14; 15) - L_CURLY@[15; 16) - R_CURLY@[16; 17) - WHITESPACE@[17; 18) + BLOCK@[14; 18) + WHITESPACE@[14; 15) + L_CURLY@[15; 16) + R_CURLY@[16; 17) + WHITESPACE@[17; 18) diff --git a/tests/data/parser/inline/0004_extern_fn.txt b/tests/data/parser/inline/0004_extern_fn.txt index 70a909ccfc5..1caeffe3b37 100644 --- a/tests/data/parser/inline/0004_extern_fn.txt +++ b/tests/data/parser/inline/0004_extern_fn.txt @@ -9,7 +9,8 @@ FILE@[0; 19) IDENT@[10; 13) "foo" L_PAREN@[13; 14) R_PAREN@[14; 15) - WHITESPACE@[15; 16) - L_CURLY@[16; 17) - R_CURLY@[17; 18) - WHITESPACE@[18; 19) + BLOCK@[15; 19) + WHITESPACE@[15; 16) + L_CURLY@[16; 17) + R_CURLY@[17; 18) + WHITESPACE@[18; 19) diff --git a/tests/data/parser/inline/0011_unsafe_fn.txt b/tests/data/parser/inline/0011_unsafe_fn.txt index ed790fe223c..d89ad451f23 100644 --- a/tests/data/parser/inline/0011_unsafe_fn.txt +++ b/tests/data/parser/inline/0011_unsafe_fn.txt @@ -8,7 +8,8 @@ FILE@[0; 19) IDENT@[10; 13) "foo" L_PAREN@[13; 14) R_PAREN@[14; 15) - WHITESPACE@[15; 16) - L_CURLY@[16; 17) - R_CURLY@[17; 18) - WHITESPACE@[18; 19) + BLOCK@[15; 19) + WHITESPACE@[15; 16) + L_CURLY@[16; 17) + R_CURLY@[17; 18) + WHITESPACE@[18; 19) diff --git a/tests/data/parser/inline/0012_unsafe_extern_fn.txt b/tests/data/parser/inline/0012_unsafe_extern_fn.txt index 3c8a15d12fe..b4c602380d2 100644 --- a/tests/data/parser/inline/0012_unsafe_extern_fn.txt +++ b/tests/data/parser/inline/0012_unsafe_extern_fn.txt @@ -13,7 +13,8 @@ FILE@[0; 30) IDENT@[21; 24) "foo" L_PAREN@[24; 25) R_PAREN@[25; 26) - WHITESPACE@[26; 27) - L_CURLY@[27; 28) - R_CURLY@[28; 29) - WHITESPACE@[29; 30) + BLOCK@[26; 30) + WHITESPACE@[26; 27) + L_CURLY@[27; 28) + R_CURLY@[28; 29) + WHITESPACE@[29; 30) diff --git a/tests/data/parser/inline/0013_unsafe_block_in_mod.txt b/tests/data/parser/inline/0013_unsafe_block_in_mod.txt index 305e3058df7..5ddc1736c70 100644 --- a/tests/data/parser/inline/0013_unsafe_block_in_mod.txt +++ b/tests/data/parser/inline/0013_unsafe_block_in_mod.txt @@ -6,9 +6,10 @@ FILE@[0; 33) IDENT@[3; 6) "foo" L_PAREN@[6; 7) R_PAREN@[7; 8) - L_CURLY@[8; 9) - R_CURLY@[9; 10) - WHITESPACE@[10; 11) + BLOCK@[8; 11) + L_CURLY@[8; 9) + R_CURLY@[9; 10) + WHITESPACE@[10; 11) UNSAFE_KW@[11; 17) ERROR@[17; 22) err: `expected `trait`, `impl` or `fn`` @@ -24,6 +25,7 @@ FILE@[0; 33) IDENT@[25; 28) "bar" L_PAREN@[28; 29) R_PAREN@[29; 30) - L_CURLY@[30; 31) - R_CURLY@[31; 32) - WHITESPACE@[32; 33) + BLOCK@[30; 33) + L_CURLY@[30; 31) + R_CURLY@[31; 32) + WHITESPACE@[32; 33) diff --git a/tests/data/parser/inline/0033_fn_value_parameters.rs b/tests/data/parser/inline/0033_fn_value_parameters.rs new file mode 100644 index 00000000000..9d55bedbba7 --- /dev/null +++ b/tests/data/parser/inline/0033_fn_value_parameters.rs @@ -0,0 +1,4 @@ +fn a() {} +fn b(x: i32) {} +fn c(x: i32, ) {} +fn d(x: i32, y: ()) {} diff --git a/tests/data/parser/inline/0033_fn_value_parameters.txt b/tests/data/parser/inline/0033_fn_value_parameters.txt new file mode 100644 index 00000000000..b0a5ff6b4af --- /dev/null +++ b/tests/data/parser/inline/0033_fn_value_parameters.txt @@ -0,0 +1,95 @@ +FILE@[0; 67) + FN_ITEM@[0; 10) + FN_KW@[0; 2) + NAME@[2; 4) + WHITESPACE@[2; 3) + IDENT@[3; 4) "a" + L_PAREN@[4; 5) + R_PAREN@[5; 6) + BLOCK@[6; 10) + WHITESPACE@[6; 7) + L_CURLY@[7; 8) + R_CURLY@[8; 9) + WHITESPACE@[9; 10) + FN_ITEM@[10; 26) + FN_KW@[10; 12) + NAME@[12; 14) + WHITESPACE@[12; 13) + IDENT@[13; 14) "b" + L_PAREN@[14; 15) + VALUE_PARAMETER@[15; 21) + BIND_PAT@[15; 16) + NAME@[15; 16) + IDENT@[15; 16) "x" + COLON@[16; 17) + PATH_TYPE@[17; 21) + PATH@[17; 21) + PATH_SEGMENT@[17; 21) + NAME_REF@[17; 21) + WHITESPACE@[17; 18) + IDENT@[18; 21) "i32" + R_PAREN@[21; 22) + BLOCK@[22; 26) + WHITESPACE@[22; 23) + L_CURLY@[23; 24) + R_CURLY@[24; 25) + WHITESPACE@[25; 26) + FN_ITEM@[26; 44) + FN_KW@[26; 28) + NAME@[28; 30) + WHITESPACE@[28; 29) + IDENT@[29; 30) "c" + L_PAREN@[30; 31) + VALUE_PARAMETER@[31; 37) + BIND_PAT@[31; 32) + NAME@[31; 32) + IDENT@[31; 32) "x" + COLON@[32; 33) + PATH_TYPE@[33; 37) + PATH@[33; 37) + PATH_SEGMENT@[33; 37) + NAME_REF@[33; 37) + WHITESPACE@[33; 34) + IDENT@[34; 37) "i32" + COMMA@[37; 38) + WHITESPACE@[38; 39) + R_PAREN@[39; 40) + BLOCK@[40; 44) + WHITESPACE@[40; 41) + L_CURLY@[41; 42) + R_CURLY@[42; 43) + WHITESPACE@[43; 44) + FN_ITEM@[44; 67) + FN_KW@[44; 46) + NAME@[46; 48) + WHITESPACE@[46; 47) + IDENT@[47; 48) "d" + L_PAREN@[48; 49) + VALUE_PARAMETER@[49; 55) + BIND_PAT@[49; 50) + NAME@[49; 50) + IDENT@[49; 50) "x" + COLON@[50; 51) + PATH_TYPE@[51; 55) + PATH@[51; 55) + PATH_SEGMENT@[51; 55) + NAME_REF@[51; 55) + WHITESPACE@[51; 52) + IDENT@[52; 55) "i32" + COMMA@[55; 56) + VALUE_PARAMETER@[56; 62) + BIND_PAT@[56; 58) + NAME@[56; 58) + WHITESPACE@[56; 57) + IDENT@[57; 58) "y" + COLON@[58; 59) + TUPLE_TYPE@[59; 62) + WHITESPACE@[59; 60) + L_PAREN@[60; 61) + R_PAREN@[61; 62) + R_PAREN@[62; 63) + BLOCK@[63; 67) + WHITESPACE@[63; 64) + L_CURLY@[64; 65) + R_CURLY@[65; 66) + WHITESPACE@[66; 67) diff --git a/tests/data/parser/inline/0034_bind_pat.rs b/tests/data/parser/inline/0034_bind_pat.rs new file mode 100644 index 00000000000..604db24079b --- /dev/null +++ b/tests/data/parser/inline/0034_bind_pat.rs @@ -0,0 +1,6 @@ +fn main() { + let a = (); + let ref b = (); + let ref mut c = (); + let d @ _ = (); +} diff --git a/tests/data/parser/inline/0034_bind_pat.txt b/tests/data/parser/inline/0034_bind_pat.txt new file mode 100644 index 00000000000..426e37e9779 --- /dev/null +++ b/tests/data/parser/inline/0034_bind_pat.txt @@ -0,0 +1,81 @@ +FILE@[0; 94) + FN_ITEM@[0; 94) + FN_KW@[0; 2) + NAME@[2; 7) + WHITESPACE@[2; 3) + IDENT@[3; 7) "main" + L_PAREN@[7; 8) + R_PAREN@[8; 9) + BLOCK@[9; 94) + WHITESPACE@[9; 10) + L_CURLY@[10; 11) + LET_STMT@[11; 32) + WHITESPACE@[11; 16) + LET_KW@[16; 19) + BIND_PAT@[19; 22) + NAME@[19; 22) + WHITESPACE@[19; 20) + IDENT@[20; 21) "a" + WHITESPACE@[21; 22) + EQ@[22; 23) + TUPLE_EXPR@[23; 26) + WHITESPACE@[23; 24) + L_PAREN@[24; 25) + R_PAREN@[25; 26) + SEMI@[26; 27) + WHITESPACE@[27; 32) + LET_STMT@[32; 52) + LET_KW@[32; 35) + BIND_PAT@[35; 42) + WHITESPACE@[35; 36) + REF_KW@[36; 39) + NAME@[39; 42) + WHITESPACE@[39; 40) + IDENT@[40; 41) "b" + WHITESPACE@[41; 42) + EQ@[42; 43) + TUPLE_EXPR@[43; 46) + WHITESPACE@[43; 44) + L_PAREN@[44; 45) + R_PAREN@[45; 46) + SEMI@[46; 47) + WHITESPACE@[47; 52) + LET_STMT@[52; 76) + LET_KW@[52; 55) + BIND_PAT@[55; 66) + WHITESPACE@[55; 56) + REF_KW@[56; 59) + WHITESPACE@[59; 60) + MUT_KW@[60; 63) + NAME@[63; 66) + WHITESPACE@[63; 64) + IDENT@[64; 65) "c" + WHITESPACE@[65; 66) + EQ@[66; 67) + TUPLE_EXPR@[67; 70) + WHITESPACE@[67; 68) + L_PAREN@[68; 69) + R_PAREN@[69; 70) + SEMI@[70; 71) + WHITESPACE@[71; 76) + LET_STMT@[76; 92) + LET_KW@[76; 79) + BIND_PAT@[79; 86) + NAME@[79; 82) + WHITESPACE@[79; 80) + IDENT@[80; 81) "d" + WHITESPACE@[81; 82) + AT@[82; 83) + PLACEHOLDER_PAT@[83; 86) + WHITESPACE@[83; 84) + UNDERSCORE@[84; 85) + WHITESPACE@[85; 86) + EQ@[86; 87) + TUPLE_EXPR@[87; 90) + WHITESPACE@[87; 88) + L_PAREN@[88; 89) + R_PAREN@[89; 90) + SEMI@[90; 91) + WHITESPACE@[91; 92) + R_CURLY@[92; 93) + WHITESPACE@[93; 94) diff --git a/tests/data/parser/inline/0035_ref_pat.rs b/tests/data/parser/inline/0035_ref_pat.rs new file mode 100644 index 00000000000..de41f5cae0f --- /dev/null +++ b/tests/data/parser/inline/0035_ref_pat.rs @@ -0,0 +1,4 @@ +fn main() { + let &a = (); + let &mut b = (); +} diff --git a/tests/data/parser/inline/0035_ref_pat.txt b/tests/data/parser/inline/0035_ref_pat.txt new file mode 100644 index 00000000000..57623f31ccb --- /dev/null +++ b/tests/data/parser/inline/0035_ref_pat.txt @@ -0,0 +1,48 @@ +FILE@[0; 52) + FN_ITEM@[0; 52) + FN_KW@[0; 2) + NAME@[2; 7) + WHITESPACE@[2; 3) + IDENT@[3; 7) "main" + L_PAREN@[7; 8) + R_PAREN@[8; 9) + BLOCK@[9; 52) + WHITESPACE@[9; 10) + L_CURLY@[10; 11) + LET_STMT@[11; 33) + WHITESPACE@[11; 16) + LET_KW@[16; 19) + REF_PAT@[19; 23) + WHITESPACE@[19; 20) + AMPERSAND@[20; 21) + BIND_PAT@[21; 23) + NAME@[21; 23) + IDENT@[21; 22) "a" + WHITESPACE@[22; 23) + EQ@[23; 24) + TUPLE_EXPR@[24; 27) + WHITESPACE@[24; 25) + L_PAREN@[25; 26) + R_PAREN@[26; 27) + SEMI@[27; 28) + WHITESPACE@[28; 33) + LET_STMT@[33; 50) + LET_KW@[33; 36) + REF_PAT@[36; 44) + WHITESPACE@[36; 37) + AMPERSAND@[37; 38) + MUT_KW@[38; 41) + BIND_PAT@[41; 44) + NAME@[41; 44) + WHITESPACE@[41; 42) + IDENT@[42; 43) "b" + WHITESPACE@[43; 44) + EQ@[44; 45) + TUPLE_EXPR@[45; 48) + WHITESPACE@[45; 46) + L_PAREN@[46; 47) + R_PAREN@[47; 48) + SEMI@[48; 49) + WHITESPACE@[49; 50) + R_CURLY@[50; 51) + WHITESPACE@[51; 52) diff --git a/tests/data/parser/inline/0036_placeholder_pat.rs b/tests/data/parser/inline/0036_placeholder_pat.rs new file mode 100644 index 00000000000..4d719c4335b --- /dev/null +++ b/tests/data/parser/inline/0036_placeholder_pat.rs @@ -0,0 +1 @@ +fn main() { let _ = (); } diff --git a/tests/data/parser/inline/0036_placeholder_pat.txt b/tests/data/parser/inline/0036_placeholder_pat.txt new file mode 100644 index 00000000000..06b84c2b579 --- /dev/null +++ b/tests/data/parser/inline/0036_placeholder_pat.txt @@ -0,0 +1,27 @@ +FILE@[0; 26) + FN_ITEM@[0; 26) + FN_KW@[0; 2) + NAME@[2; 7) + WHITESPACE@[2; 3) + IDENT@[3; 7) "main" + L_PAREN@[7; 8) + R_PAREN@[8; 9) + BLOCK@[9; 26) + WHITESPACE@[9; 10) + L_CURLY@[10; 11) + LET_STMT@[11; 24) + WHITESPACE@[11; 12) + LET_KW@[12; 15) + PLACEHOLDER_PAT@[15; 18) + WHITESPACE@[15; 16) + UNDERSCORE@[16; 17) + WHITESPACE@[17; 18) + EQ@[18; 19) + TUPLE_EXPR@[19; 22) + WHITESPACE@[19; 20) + L_PAREN@[20; 21) + R_PAREN@[21; 22) + SEMI@[22; 23) + WHITESPACE@[23; 24) + R_CURLY@[24; 25) + WHITESPACE@[25; 26) diff --git a/tests/data/parser/ok/0005_fn_item.txt b/tests/data/parser/ok/0005_fn_item.txt index 0324ae3eeec..b9d049b797f 100644 --- a/tests/data/parser/ok/0005_fn_item.txt +++ b/tests/data/parser/ok/0005_fn_item.txt @@ -6,8 +6,9 @@ FILE@[0; 13) IDENT@[3; 6) "foo" L_PAREN@[6; 7) R_PAREN@[7; 8) - WHITESPACE@[8; 9) - L_CURLY@[9; 10) - WHITESPACE@[10; 11) - R_CURLY@[11; 12) - WHITESPACE@[12; 13) + BLOCK@[8; 13) + WHITESPACE@[8; 9) + L_CURLY@[9; 10) + WHITESPACE@[10; 11) + R_CURLY@[11; 12) + WHITESPACE@[12; 13) diff --git a/tests/data/parser/ok/0008_mod_item.txt b/tests/data/parser/ok/0008_mod_item.txt index 20321051cc7..70ba5ac731f 100644 --- a/tests/data/parser/ok/0008_mod_item.txt +++ b/tests/data/parser/ok/0008_mod_item.txt @@ -31,11 +31,12 @@ FILE@[0; 118) IDENT@[34; 37) "foo" L_PAREN@[37; 38) R_PAREN@[38; 39) - WHITESPACE@[39; 40) - L_CURLY@[40; 41) - WHITESPACE@[41; 46) - R_CURLY@[46; 47) - WHITESPACE@[47; 52) + BLOCK@[39; 52) + WHITESPACE@[39; 40) + L_CURLY@[40; 41) + WHITESPACE@[41; 46) + R_CURLY@[46; 47) + WHITESPACE@[47; 52) STRUCT_ITEM@[52; 64) STRUCT_KW@[52; 58) NAME@[58; 61) diff --git a/tests/data/parser/ok/0011_outer_attribute.txt b/tests/data/parser/ok/0011_outer_attribute.txt index 49023e7f332..3f685ebe248 100644 --- a/tests/data/parser/ok/0011_outer_attribute.txt +++ b/tests/data/parser/ok/0011_outer_attribute.txt @@ -24,7 +24,8 @@ FILE@[0; 35) IDENT@[26; 29) "foo" L_PAREN@[29; 30) R_PAREN@[30; 31) - WHITESPACE@[31; 32) - L_CURLY@[32; 33) - R_CURLY@[33; 34) - WHITESPACE@[34; 35) + BLOCK@[31; 35) + WHITESPACE@[31; 32) + L_CURLY@[32; 33) + R_CURLY@[33; 34) + WHITESPACE@[34; 35) diff --git a/tests/data/parser/ok/0012_visibility.txt b/tests/data/parser/ok/0012_visibility.txt index c138b73f369..664582a3017 100644 --- a/tests/data/parser/ok/0012_visibility.txt +++ b/tests/data/parser/ok/0012_visibility.txt @@ -6,10 +6,11 @@ FILE@[0; 98) IDENT@[3; 4) "a" L_PAREN@[4; 5) R_PAREN@[5; 6) - WHITESPACE@[6; 7) - L_CURLY@[7; 8) - R_CURLY@[8; 9) - WHITESPACE@[9; 10) + BLOCK@[6; 10) + WHITESPACE@[6; 7) + L_CURLY@[7; 8) + R_CURLY@[8; 9) + WHITESPACE@[9; 10) FN_ITEM@[10; 24) VISIBILITY@[10; 14) PUB_KW@[10; 13) @@ -20,10 +21,11 @@ FILE@[0; 98) IDENT@[17; 18) "b" L_PAREN@[18; 19) R_PAREN@[19; 20) - WHITESPACE@[20; 21) - L_CURLY@[21; 22) - R_CURLY@[22; 23) - WHITESPACE@[23; 24) + BLOCK@[20; 24) + WHITESPACE@[20; 21) + L_CURLY@[21; 22) + R_CURLY@[22; 23) + WHITESPACE@[23; 24) FN_ITEM@[24; 45) VISIBILITY@[24; 35) PUB_KW@[24; 27) @@ -37,10 +39,11 @@ FILE@[0; 98) IDENT@[38; 39) "c" L_PAREN@[39; 40) R_PAREN@[40; 41) - WHITESPACE@[41; 42) - L_CURLY@[42; 43) - R_CURLY@[43; 44) - WHITESPACE@[44; 45) + BLOCK@[41; 45) + WHITESPACE@[41; 42) + L_CURLY@[42; 43) + R_CURLY@[43; 44) + WHITESPACE@[44; 45) FN_ITEM@[45; 66) VISIBILITY@[45; 56) PUB_KW@[45; 48) @@ -54,10 +57,11 @@ FILE@[0; 98) IDENT@[59; 60) "d" L_PAREN@[60; 61) R_PAREN@[61; 62) - WHITESPACE@[62; 63) - L_CURLY@[63; 64) - R_CURLY@[64; 65) - WHITESPACE@[65; 66) + BLOCK@[62; 66) + WHITESPACE@[62; 63) + L_CURLY@[63; 64) + R_CURLY@[64; 65) + WHITESPACE@[65; 66) FN_ITEM@[66; 98) VISIBILITY@[66; 88) PUB_KW@[66; 69) @@ -86,7 +90,8 @@ FILE@[0; 98) IDENT@[91; 92) "e" L_PAREN@[92; 93) R_PAREN@[93; 94) - WHITESPACE@[94; 95) - L_CURLY@[95; 96) - R_CURLY@[96; 97) - WHITESPACE@[97; 98) + BLOCK@[94; 98) + WHITESPACE@[94; 95) + L_CURLY@[95; 96) + R_CURLY@[96; 97) + WHITESPACE@[97; 98) diff --git a/tests/data/parser/ok/0017_attr_trailing_comma.txt b/tests/data/parser/ok/0017_attr_trailing_comma.txt index a4a6b8807b9..792633eaece 100644 --- a/tests/data/parser/ok/0017_attr_trailing_comma.txt +++ b/tests/data/parser/ok/0017_attr_trailing_comma.txt @@ -18,7 +18,8 @@ FILE@[0; 23) IDENT@[14; 17) "foo" L_PAREN@[17; 18) R_PAREN@[18; 19) - WHITESPACE@[19; 20) - L_CURLY@[20; 21) - R_CURLY@[21; 22) - WHITESPACE@[22; 23) + BLOCK@[19; 23) + WHITESPACE@[19; 20) + L_CURLY@[20; 21) + R_CURLY@[21; 22) + WHITESPACE@[22; 23) diff --git a/tests/data/parser/ok/0021_extern_fn.txt b/tests/data/parser/ok/0021_extern_fn.txt index 8ed7f2a2584..b4456af84c9 100644 --- a/tests/data/parser/ok/0021_extern_fn.txt +++ b/tests/data/parser/ok/0021_extern_fn.txt @@ -9,11 +9,12 @@ FILE@[0; 71) IDENT@[10; 13) "foo" L_PAREN@[13; 14) R_PAREN@[14; 15) - WHITESPACE@[15; 16) - L_CURLY@[16; 17) - WHITESPACE@[17; 18) - R_CURLY@[18; 19) - WHITESPACE@[19; 21) + BLOCK@[15; 21) + WHITESPACE@[15; 16) + L_CURLY@[16; 17) + WHITESPACE@[17; 18) + R_CURLY@[18; 19) + WHITESPACE@[19; 21) FN_ITEM@[21; 46) ABI@[21; 32) EXTERN_KW@[21; 27) @@ -26,11 +27,12 @@ FILE@[0; 71) IDENT@[35; 38) "bar" L_PAREN@[38; 39) R_PAREN@[39; 40) - WHITESPACE@[40; 41) - L_CURLY@[41; 42) - WHITESPACE@[42; 43) - R_CURLY@[43; 44) - WHITESPACE@[44; 46) + BLOCK@[40; 46) + WHITESPACE@[40; 41) + L_CURLY@[41; 42) + WHITESPACE@[42; 43) + R_CURLY@[43; 44) + WHITESPACE@[44; 46) FN_ITEM@[46; 71) ABI@[46; 58) EXTERN_KW@[46; 52) @@ -43,8 +45,9 @@ FILE@[0; 71) IDENT@[61; 64) "baz" L_PAREN@[64; 65) R_PAREN@[65; 66) - WHITESPACE@[66; 67) - L_CURLY@[67; 68) - WHITESPACE@[68; 69) - R_CURLY@[69; 70) - WHITESPACE@[70; 71) + BLOCK@[66; 71) + WHITESPACE@[66; 67) + L_CURLY@[67; 68) + WHITESPACE@[68; 69) + R_CURLY@[69; 70) + WHITESPACE@[70; 71)