Optional patterns in trait methods

This commit is contained in:
Aleksey Kladov 2018-08-13 18:40:47 +03:00
parent c146331b1c
commit 7d0c9cf546
4 changed files with 92 additions and 144 deletions

View file

@ -284,7 +284,7 @@ pub(super) fn block_expr(p: &mut Parser) -> CompletedMarker {
// test block_items // test block_items
// fn a() { fn b() {} } // fn a() { fn b() {} }
let m = p.start(); let m = p.start();
match items::maybe_item(p) { match items::maybe_item(p, items::ItemFlavor::Mod) {
items::MaybeItem::Item(kind) => { items::MaybeItem::Item(kind) => {
m.complete(p, kind); m.complete(p, kind);
} }

View file

@ -14,13 +14,17 @@ mod use_item;
pub(super) fn mod_contents(p: &mut Parser, stop_on_r_curly: bool) { pub(super) fn mod_contents(p: &mut Parser, stop_on_r_curly: bool) {
attributes::inner_attributes(p); attributes::inner_attributes(p);
while !p.at(EOF) && !(stop_on_r_curly && p.at(R_CURLY)) { 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(); let m = p.start();
match maybe_item(p) { match maybe_item(p, flavor) {
MaybeItem::Item(kind) => { MaybeItem::Item(kind) => {
m.complete(p, kind); m.complete(p, kind);
} }
@ -60,7 +64,7 @@ pub(super) enum MaybeItem {
Modifiers, 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); attributes::outer_attributes(p);
visibility(p); visibility(p);
if let Some(kind) = items_without_modifiers(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 // test unsafe_fn
// unsafe fn foo() {} // unsafe fn foo() {}
FN_KW => { FN_KW => {
function(p); function(p, flavor);
FN_DEF FN_DEF
} }
@ -217,7 +221,7 @@ fn extern_block(p: &mut Parser) {
p.expect(R_CURLY); p.expect(R_CURLY);
} }
fn function(p: &mut Parser) { fn function(p: &mut Parser, flavor: ItemFlavor) {
assert!(p.at(FN_KW)); assert!(p.at(FN_KW));
p.bump(); p.bump();
@ -227,7 +231,12 @@ fn function(p: &mut Parser) {
type_params::type_param_list(p); type_params::type_param_list(p);
if p.at(L_PAREN) { 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 { } else {
p.error("expected function arguments"); p.error("expected function arguments");
} }

View file

@ -20,7 +20,7 @@ pub(super) fn trait_def(p: &mut Parser) {
// fn bar(&self); // fn bar(&self);
// } // }
while !p.at(EOF) && !p.at(R_CURLY) { while !p.at(EOF) && !p.at(R_CURLY) {
item_or_macro(p, true); item_or_macro(p, true, ItemFlavor::Trait);
} }
p.expect(R_CURLY); p.expect(R_CURLY);
} }
@ -55,7 +55,7 @@ pub(super) fn impl_item(p: &mut Parser) {
// fn bar(&self) {} // fn bar(&self) {}
// } // }
while !p.at(EOF) && !p.at(R_CURLY) { while !p.at(EOF) && !p.at(R_CURLY) {
item_or_macro(p, true); item_or_macro(p, true, ItemFlavor::Mod);
} }
p.expect(R_CURLY); p.expect(R_CURLY);
} }

View file

@ -1,5 +1,5 @@
FILE@[0; 164) FILE@[0; 164)
TRAIT_DEF@[0; 164) TRAIT_DEF@[0; 66)
VISIBILITY@[0; 3) VISIBILITY@[0; 3)
PUB_KW@[0; 3) PUB_KW@[0; 3)
WHITESPACE@[3; 4) WHITESPACE@[3; 4)
@ -10,142 +10,81 @@ FILE@[0; 164)
WHITESPACE@[22; 23) WHITESPACE@[22; 23)
L_CURLY@[23; 24) L_CURLY@[23; 24)
WHITESPACE@[24; 29) WHITESPACE@[24; 29)
FN_DEF@[29; 164) FN_DEF@[29; 64)
FN_KW@[29; 31) FN_KW@[29; 31)
WHITESPACE@[31; 32) WHITESPACE@[31; 32)
NAME@[32; 45) NAME@[32; 45)
IDENT@[32; 45) "write_message" IDENT@[32; 45) "write_message"
PARAM_LIST@[45; 164) PARAM_LIST@[45; 63)
L_PAREN@[45; 46) L_PAREN@[45; 46)
PARAM@[46; 63) PARAM@[46; 62)
REF_PAT@[46; 62) REFERENCE_TYPE@[46; 62)
AMP@[46; 47) AMP@[46; 47)
BIND_PAT@[47; 62) PATH_TYPE@[47; 62)
NAME@[47; 62) PATH@[47; 62)
IDENT@[47; 62) "FrontendMessage" PATH_SEGMENT@[47; 62)
err: `expected COLON` NAME_REF@[47; 62)
err: `expected type` IDENT@[47; 62) "FrontendMessage"
ERROR@[62; 63) R_PAREN@[62; 63)
R_PAREN@[62; 63) SEMI@[63; 64)
err: `expected COMMA` WHITESPACE@[64; 65)
err: `expected pattern` R_CURLY@[65; 66)
PARAM@[63; 66) WHITESPACE@[66; 68)
ERROR@[63; 64) TRAIT_DEF@[68; 104)
SEMI@[63; 64) TRAIT_KW@[68; 73)
err: `expected COLON` WHITESPACE@[73; 74)
WHITESPACE@[64; 65) NAME@[74; 82)
err: `expected type` IDENT@[74; 82) "Runnable"
ERROR@[65; 66) WHITESPACE@[82; 83)
R_CURLY@[65; 66) L_CURLY@[83; 84)
err: `expected COMMA` WHITESPACE@[84; 89)
WHITESPACE@[66; 68) FN_DEF@[89; 102)
err: `expected pattern` FN_KW@[89; 91)
PARAM@[68; 82) WHITESPACE@[91; 92)
ERROR@[68; 73) NAME@[92; 99)
TRAIT_KW@[68; 73) IDENT@[92; 99) "handler"
err: `expected COLON` PARAM_LIST@[99; 101)
WHITESPACE@[73; 74) L_PAREN@[99; 100)
PATH_TYPE@[74; 82) R_PAREN@[100; 101)
PATH@[74; 82) SEMI@[101; 102)
PATH_SEGMENT@[74; 82) WHITESPACE@[102; 103)
NAME_REF@[74; 82) R_CURLY@[103; 104)
IDENT@[74; 82) "Runnable" WHITESPACE@[104; 106)
err: `expected COMMA` TRAIT_DEF@[106; 163)
WHITESPACE@[82; 83) TRAIT_KW@[106; 111)
err: `expected pattern` WHITESPACE@[111; 112)
PARAM@[83; 91) NAME@[112; 125)
ERROR@[83; 84) IDENT@[112; 125) "TraitWithExpr"
L_CURLY@[83; 84) WHITESPACE@[125; 126)
err: `expected COLON` L_CURLY@[126; 127)
WHITESPACE@[84; 89) WHITESPACE@[127; 132)
FN_POINTER_TYPE@[89; 91) FN_DEF@[132; 161)
FN_KW@[89; 91) FN_KW@[132; 134)
err: `expected parameters` WHITESPACE@[134; 135)
err: `expected COMMA` NAME@[135; 147)
WHITESPACE@[91; 92) IDENT@[135; 147) "fn_with_expr"
PARAM@[92; 102) PARAM_LIST@[147; 160)
TUPLE_STRUCT_PAT@[92; 101) L_PAREN@[147; 148)
PATH@[92; 99) PARAM@[148; 159)
PATH_SEGMENT@[92; 99) BIND_PAT@[148; 149)
NAME_REF@[92; 99) NAME@[148; 149)
IDENT@[92; 99) "handler" IDENT@[148; 149) "x"
L_PAREN@[99; 100) COLON@[149; 150)
R_PAREN@[100; 101) WHITESPACE@[150; 151)
err: `expected COLON` ARRAY_TYPE@[151; 159)
err: `expected type` L_BRACK@[151; 152)
ERROR@[101; 102) PATH_TYPE@[152; 155)
SEMI@[101; 102) PATH@[152; 155)
err: `expected COMMA` PATH_SEGMENT@[152; 155)
WHITESPACE@[102; 103) NAME_REF@[152; 155)
err: `expected pattern` IDENT@[152; 155) "i32"
PARAM@[103; 111) SEMI@[155; 156)
ERROR@[103; 104) WHITESPACE@[156; 157)
R_CURLY@[103; 104) LITERAL@[157; 158)
err: `expected COLON` INT_NUMBER@[157; 158) "1"
WHITESPACE@[104; 106) R_BRACK@[158; 159)
err: `expected type` R_PAREN@[159; 160)
ERROR@[106; 111) SEMI@[160; 161)
TRAIT_KW@[106; 111) WHITESPACE@[161; 162)
err: `expected COMMA` R_CURLY@[162; 163)
WHITESPACE@[111; 112) WHITESPACE@[163; 164)
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)