mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-13 13:48:50 +00:00
Optional patterns in trait methods
This commit is contained in:
parent
c146331b1c
commit
7d0c9cf546
4 changed files with 92 additions and 144 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
|
||||||
|
|
Loading…
Reference in a new issue