From 7d0c9cf54652c0630bf8f955fc3affb288b5e4cf Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 13 Aug 2018 18:40:47 +0300 Subject: Optional patterns in trait methods --- crates/libsyntax2/src/grammar/expressions/atom.rs | 2 +- crates/libsyntax2/src/grammar/items/mod.rs | 23 ++- crates/libsyntax2/src/grammar/items/traits.rs | 4 +- .../tests/data/parser/ok/0030_traits.txt | 207 ++++++++------------- 4 files changed, 92 insertions(+), 144 deletions(-) (limited to 'crates') diff --git a/crates/libsyntax2/src/grammar/expressions/atom.rs b/crates/libsyntax2/src/grammar/expressions/atom.rs index af9f47c5e..e62b16654 100644 --- a/crates/libsyntax2/src/grammar/expressions/atom.rs +++ b/crates/libsyntax2/src/grammar/expressions/atom.rs @@ -284,7 +284,7 @@ pub(super) fn block_expr(p: &mut Parser) -> CompletedMarker { // test block_items // fn a() { fn b() {} } let m = p.start(); - match items::maybe_item(p) { + match items::maybe_item(p, items::ItemFlavor::Mod) { items::MaybeItem::Item(kind) => { m.complete(p, kind); } diff --git a/crates/libsyntax2/src/grammar/items/mod.rs b/crates/libsyntax2/src/grammar/items/mod.rs index 883b5a946..fc02f0c5c 100644 --- a/crates/libsyntax2/src/grammar/items/mod.rs +++ b/crates/libsyntax2/src/grammar/items/mod.rs @@ -14,13 +14,17 @@ mod use_item; pub(super) fn mod_contents(p: &mut Parser, stop_on_r_curly: bool) { attributes::inner_attributes(p); while !p.at(EOF) && !(stop_on_r_curly && p.at(R_CURLY)) { - item_or_macro(p, stop_on_r_curly) + item_or_macro(p, stop_on_r_curly, ItemFlavor::Mod) } } -pub(super) fn item_or_macro(p: &mut Parser, stop_on_r_curly: bool) { +pub(super) enum ItemFlavor { + Mod, Trait +} + +pub(super) fn item_or_macro(p: &mut Parser, stop_on_r_curly: bool, flavor: ItemFlavor) { let m = p.start(); - match maybe_item(p) { + match maybe_item(p, flavor) { MaybeItem::Item(kind) => { m.complete(p, kind); } @@ -60,7 +64,7 @@ pub(super) enum MaybeItem { Modifiers, } -pub(super) fn maybe_item(p: &mut Parser) -> MaybeItem { +pub(super) fn maybe_item(p: &mut Parser, flavor: ItemFlavor) -> MaybeItem { attributes::outer_attributes(p); visibility(p); if let Some(kind) = items_without_modifiers(p) { @@ -107,7 +111,7 @@ pub(super) fn maybe_item(p: &mut Parser) -> MaybeItem { // test unsafe_fn // unsafe fn foo() {} FN_KW => { - function(p); + function(p, flavor); FN_DEF } @@ -217,7 +221,7 @@ fn extern_block(p: &mut Parser) { p.expect(R_CURLY); } -fn function(p: &mut Parser) { +fn function(p: &mut Parser, flavor: ItemFlavor) { assert!(p.at(FN_KW)); p.bump(); @@ -227,7 +231,12 @@ fn function(p: &mut Parser) { type_params::type_param_list(p); if p.at(L_PAREN) { - params::param_list(p); + match flavor { + ItemFlavor::Mod => + params::param_list(p), + ItemFlavor::Trait => + params::param_list_opt_patterns(p), + } } else { p.error("expected function arguments"); } diff --git a/crates/libsyntax2/src/grammar/items/traits.rs b/crates/libsyntax2/src/grammar/items/traits.rs index 53a636f6c..daecaff5c 100644 --- a/crates/libsyntax2/src/grammar/items/traits.rs +++ b/crates/libsyntax2/src/grammar/items/traits.rs @@ -20,7 +20,7 @@ pub(super) fn trait_def(p: &mut Parser) { // fn bar(&self); // } while !p.at(EOF) && !p.at(R_CURLY) { - item_or_macro(p, true); + item_or_macro(p, true, ItemFlavor::Trait); } p.expect(R_CURLY); } @@ -55,7 +55,7 @@ pub(super) fn impl_item(p: &mut Parser) { // fn bar(&self) {} // } while !p.at(EOF) && !p.at(R_CURLY) { - item_or_macro(p, true); + item_or_macro(p, true, ItemFlavor::Mod); } p.expect(R_CURLY); } diff --git a/crates/libsyntax2/tests/data/parser/ok/0030_traits.txt b/crates/libsyntax2/tests/data/parser/ok/0030_traits.txt index 5adab705b..88282ca1a 100644 --- a/crates/libsyntax2/tests/data/parser/ok/0030_traits.txt +++ b/crates/libsyntax2/tests/data/parser/ok/0030_traits.txt @@ -1,5 +1,5 @@ FILE@[0; 164) - TRAIT_DEF@[0; 164) + TRAIT_DEF@[0; 66) VISIBILITY@[0; 3) PUB_KW@[0; 3) WHITESPACE@[3; 4) @@ -10,142 +10,81 @@ FILE@[0; 164) WHITESPACE@[22; 23) L_CURLY@[23; 24) WHITESPACE@[24; 29) - FN_DEF@[29; 164) + FN_DEF@[29; 64) FN_KW@[29; 31) WHITESPACE@[31; 32) NAME@[32; 45) IDENT@[32; 45) "write_message" - PARAM_LIST@[45; 164) + PARAM_LIST@[45; 63) L_PAREN@[45; 46) - PARAM@[46; 63) - REF_PAT@[46; 62) + PARAM@[46; 62) + REFERENCE_TYPE@[46; 62) AMP@[46; 47) - BIND_PAT@[47; 62) - NAME@[47; 62) - IDENT@[47; 62) "FrontendMessage" - err: `expected COLON` - err: `expected type` - ERROR@[62; 63) - R_PAREN@[62; 63) - err: `expected COMMA` - err: `expected pattern` - PARAM@[63; 66) - ERROR@[63; 64) - SEMI@[63; 64) - err: `expected COLON` - WHITESPACE@[64; 65) - err: `expected type` - ERROR@[65; 66) - R_CURLY@[65; 66) - err: `expected COMMA` - WHITESPACE@[66; 68) - err: `expected pattern` - PARAM@[68; 82) - ERROR@[68; 73) - TRAIT_KW@[68; 73) - err: `expected COLON` - WHITESPACE@[73; 74) - PATH_TYPE@[74; 82) - PATH@[74; 82) - PATH_SEGMENT@[74; 82) - NAME_REF@[74; 82) - IDENT@[74; 82) "Runnable" - err: `expected COMMA` - WHITESPACE@[82; 83) - err: `expected pattern` - PARAM@[83; 91) - ERROR@[83; 84) - L_CURLY@[83; 84) - err: `expected COLON` - WHITESPACE@[84; 89) - FN_POINTER_TYPE@[89; 91) - FN_KW@[89; 91) - err: `expected parameters` - err: `expected COMMA` - WHITESPACE@[91; 92) - PARAM@[92; 102) - TUPLE_STRUCT_PAT@[92; 101) - PATH@[92; 99) - PATH_SEGMENT@[92; 99) - NAME_REF@[92; 99) - IDENT@[92; 99) "handler" - L_PAREN@[99; 100) - R_PAREN@[100; 101) - err: `expected COLON` - err: `expected type` - ERROR@[101; 102) - SEMI@[101; 102) - err: `expected COMMA` - WHITESPACE@[102; 103) - err: `expected pattern` - PARAM@[103; 111) - ERROR@[103; 104) - R_CURLY@[103; 104) - err: `expected COLON` - WHITESPACE@[104; 106) - err: `expected type` - ERROR@[106; 111) - TRAIT_KW@[106; 111) - err: `expected COMMA` - WHITESPACE@[111; 112) - PARAM@[112; 164) - STRUCT_PAT@[112; 163) - PATH@[112; 125) - PATH_SEGMENT@[112; 125) - NAME_REF@[112; 125) - IDENT@[112; 125) "TraitWithExpr" - WHITESPACE@[125; 126) - L_CURLY@[126; 127) - WHITESPACE@[127; 132) - err: `expected a name` - BIND_PAT@[132; 134) - ERROR@[132; 134) - FN_KW@[132; 134) - err: `expected COMMA` - WHITESPACE@[134; 135) - BIND_PAT@[135; 147) - NAME@[135; 147) - IDENT@[135; 147) "fn_with_expr" - err: `expected COMMA` - err: `expected a name` - BIND_PAT@[147; 148) - ERROR@[147; 148) - L_PAREN@[147; 148) - err: `expected COMMA` - IDENT@[148; 149) "x" - COLON@[149; 150) - WHITESPACE@[150; 151) - SLICE_PAT@[151; 159) - L_BRACK@[151; 152) - BIND_PAT@[152; 155) - NAME@[152; 155) - IDENT@[152; 155) "i32" - err: `expected COMMA` - err: `expected pattern` - ERROR@[155; 156) - SEMI@[155; 156) - err: `expected COMMA` - WHITESPACE@[156; 157) - LITERAL@[157; 158) - INT_NUMBER@[157; 158) "1" - R_BRACK@[158; 159) - err: `expected COMMA` - err: `expected a name` - BIND_PAT@[159; 160) - ERROR@[159; 160) - R_PAREN@[159; 160) - err: `expected COMMA` - err: `expected a name` - BIND_PAT@[160; 161) - ERROR@[160; 161) - SEMI@[160; 161) - WHITESPACE@[161; 162) - R_CURLY@[162; 163) - err: `expected COLON` - WHITESPACE@[163; 164) - err: `expected type` - err: `expected COMMA` - err: `expected R_PAREN` - err: `expected block` - err: `expected R_CURLY` - ERROR@[164; 164) + PATH_TYPE@[47; 62) + PATH@[47; 62) + PATH_SEGMENT@[47; 62) + NAME_REF@[47; 62) + IDENT@[47; 62) "FrontendMessage" + R_PAREN@[62; 63) + SEMI@[63; 64) + WHITESPACE@[64; 65) + R_CURLY@[65; 66) + WHITESPACE@[66; 68) + TRAIT_DEF@[68; 104) + TRAIT_KW@[68; 73) + WHITESPACE@[73; 74) + NAME@[74; 82) + IDENT@[74; 82) "Runnable" + WHITESPACE@[82; 83) + L_CURLY@[83; 84) + WHITESPACE@[84; 89) + FN_DEF@[89; 102) + FN_KW@[89; 91) + WHITESPACE@[91; 92) + NAME@[92; 99) + IDENT@[92; 99) "handler" + PARAM_LIST@[99; 101) + L_PAREN@[99; 100) + R_PAREN@[100; 101) + SEMI@[101; 102) + WHITESPACE@[102; 103) + R_CURLY@[103; 104) + WHITESPACE@[104; 106) + TRAIT_DEF@[106; 163) + TRAIT_KW@[106; 111) + WHITESPACE@[111; 112) + NAME@[112; 125) + IDENT@[112; 125) "TraitWithExpr" + WHITESPACE@[125; 126) + L_CURLY@[126; 127) + WHITESPACE@[127; 132) + FN_DEF@[132; 161) + FN_KW@[132; 134) + WHITESPACE@[134; 135) + NAME@[135; 147) + IDENT@[135; 147) "fn_with_expr" + PARAM_LIST@[147; 160) + L_PAREN@[147; 148) + PARAM@[148; 159) + BIND_PAT@[148; 149) + NAME@[148; 149) + IDENT@[148; 149) "x" + COLON@[149; 150) + WHITESPACE@[150; 151) + ARRAY_TYPE@[151; 159) + L_BRACK@[151; 152) + PATH_TYPE@[152; 155) + PATH@[152; 155) + PATH_SEGMENT@[152; 155) + NAME_REF@[152; 155) + IDENT@[152; 155) "i32" + SEMI@[155; 156) + WHITESPACE@[156; 157) + LITERAL@[157; 158) + INT_NUMBER@[157; 158) "1" + R_BRACK@[158; 159) + R_PAREN@[159; 160) + SEMI@[160; 161) + WHITESPACE@[161; 162) + R_CURLY@[162; 163) + WHITESPACE@[163; 164) -- cgit v1.2.3