mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 04:53:34 +00:00
Allow arbitrary self-types
This commit is contained in:
parent
8d82d1551e
commit
a077533513
5 changed files with 104 additions and 18 deletions
|
@ -94,20 +94,33 @@ fn value_parameter(p: &mut Parser, flavor: Flavor) {
|
|||
// fn d(&'a mut self, x: i32) {}
|
||||
// }
|
||||
fn self_param(p: &mut Parser) {
|
||||
let la1 = p.nth(1);
|
||||
let la2 = p.nth(2);
|
||||
let la3 = p.nth(3);
|
||||
let n_toks = match (p.current(), la1, la2, la3) {
|
||||
(SELF_KW, _, _, _) => 1,
|
||||
(AMP, SELF_KW, _, _) => 2,
|
||||
(AMP, MUT_KW, SELF_KW, _) => 3,
|
||||
(AMP, LIFETIME, SELF_KW, _) => 3,
|
||||
(AMP, LIFETIME, MUT_KW, SELF_KW) => 4,
|
||||
_ => return,
|
||||
};
|
||||
let m = p.start();
|
||||
for _ in 0..n_toks {
|
||||
let m;
|
||||
if p.at(SELF_KW) {
|
||||
m = p.start();
|
||||
p.bump();
|
||||
// test arb_self_types
|
||||
// impl S {
|
||||
// fn a(self: &Self) {}
|
||||
// fn b(self: Box<Self>) {}
|
||||
// }
|
||||
if p.at(COLON) {
|
||||
types::ascription(p);
|
||||
}
|
||||
} else {
|
||||
let la1 = p.nth(1);
|
||||
let la2 = p.nth(2);
|
||||
let la3 = p.nth(3);
|
||||
let n_toks = match (p.current(), la1, la2, la3) {
|
||||
(AMP, SELF_KW, _, _) => 2,
|
||||
(AMP, MUT_KW, SELF_KW, _) => 3,
|
||||
(AMP, LIFETIME, SELF_KW, _) => 3,
|
||||
(AMP, LIFETIME, MUT_KW, SELF_KW) => 4,
|
||||
_ => return,
|
||||
};
|
||||
m = p.start();
|
||||
for _ in 0..n_toks {
|
||||
p.bump();
|
||||
}
|
||||
}
|
||||
m.complete(p, SELF_PARAM);
|
||||
if !p.at(R_PAREN) {
|
||||
|
|
|
@ -1 +1 @@
|
|||
type A = B<'static, i32, Item=u64>;
|
||||
type A = B<'static, i32, Item=u64>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
FILE@[0; 36)
|
||||
TYPE_DEF@[0; 35)
|
||||
FILE@[0; 35)
|
||||
TYPE_DEF@[0; 34)
|
||||
TYPE_KW@[0; 4)
|
||||
WHITESPACE@[4; 5)
|
||||
NAME@[5; 6)
|
||||
|
@ -36,5 +36,5 @@ FILE@[0; 36)
|
|||
NAME_REF@[30; 33)
|
||||
IDENT@[30; 33) "u64"
|
||||
R_ANGLE@[33; 34)
|
||||
SEMI@[34; 35)
|
||||
WHITESPACE@[35; 36)
|
||||
err: `expected SEMI`
|
||||
WHITESPACE@[34; 35)
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
impl S {
|
||||
fn a(self: &Self) {}
|
||||
fn b(self: Box<Self>) {}
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
FILE@[0; 65)
|
||||
IMPL_ITEM@[0; 64)
|
||||
IMPL_KW@[0; 4)
|
||||
WHITESPACE@[4; 5)
|
||||
PATH_TYPE@[5; 6)
|
||||
PATH@[5; 6)
|
||||
PATH_SEGMENT@[5; 6)
|
||||
NAME_REF@[5; 6)
|
||||
IDENT@[5; 6) "S"
|
||||
WHITESPACE@[6; 7)
|
||||
L_CURLY@[7; 8)
|
||||
WHITESPACE@[8; 13)
|
||||
FN_DEF@[13; 33)
|
||||
FN_KW@[13; 15)
|
||||
WHITESPACE@[15; 16)
|
||||
NAME@[16; 17)
|
||||
IDENT@[16; 17) "a"
|
||||
PARAM_LIST@[17; 30)
|
||||
L_PAREN@[17; 18)
|
||||
SELF_PARAM@[18; 29)
|
||||
SELF_KW@[18; 22)
|
||||
COLON@[22; 23)
|
||||
WHITESPACE@[23; 24)
|
||||
REFERENCE_TYPE@[24; 29)
|
||||
AMP@[24; 25)
|
||||
PATH_TYPE@[25; 29)
|
||||
PATH@[25; 29)
|
||||
PATH_SEGMENT@[25; 29)
|
||||
NAME_REF@[25; 29)
|
||||
IDENT@[25; 29) "Self"
|
||||
R_PAREN@[29; 30)
|
||||
WHITESPACE@[30; 31)
|
||||
BLOCK_EXPR@[31; 33)
|
||||
L_CURLY@[31; 32)
|
||||
R_CURLY@[32; 33)
|
||||
WHITESPACE@[33; 38)
|
||||
FN_DEF@[38; 62)
|
||||
FN_KW@[38; 40)
|
||||
WHITESPACE@[40; 41)
|
||||
NAME@[41; 42)
|
||||
IDENT@[41; 42) "b"
|
||||
PARAM_LIST@[42; 59)
|
||||
L_PAREN@[42; 43)
|
||||
SELF_PARAM@[43; 58)
|
||||
SELF_KW@[43; 47)
|
||||
COLON@[47; 48)
|
||||
WHITESPACE@[48; 49)
|
||||
PATH_TYPE@[49; 58)
|
||||
PATH@[49; 58)
|
||||
PATH_SEGMENT@[49; 58)
|
||||
NAME_REF@[49; 52)
|
||||
IDENT@[49; 52) "Box"
|
||||
TYPE_ARG_LIST@[52; 58)
|
||||
L_ANGLE@[52; 53)
|
||||
TYPE_ARG@[53; 57)
|
||||
PATH_TYPE@[53; 57)
|
||||
PATH@[53; 57)
|
||||
PATH_SEGMENT@[53; 57)
|
||||
NAME_REF@[53; 57)
|
||||
IDENT@[53; 57) "Self"
|
||||
R_ANGLE@[57; 58)
|
||||
R_PAREN@[58; 59)
|
||||
WHITESPACE@[59; 60)
|
||||
BLOCK_EXPR@[60; 62)
|
||||
L_CURLY@[60; 61)
|
||||
R_CURLY@[61; 62)
|
||||
WHITESPACE@[62; 63)
|
||||
R_CURLY@[63; 64)
|
||||
WHITESPACE@[64; 65)
|
Loading…
Reference in a new issue