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 d(&'a mut self, x: i32) {}
|
||||||
// }
|
// }
|
||||||
fn self_param(p: &mut Parser) {
|
fn self_param(p: &mut Parser) {
|
||||||
let la1 = p.nth(1);
|
let m;
|
||||||
let la2 = p.nth(2);
|
if p.at(SELF_KW) {
|
||||||
let la3 = p.nth(3);
|
m = p.start();
|
||||||
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 {
|
|
||||||
p.bump();
|
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);
|
m.complete(p, SELF_PARAM);
|
||||||
if !p.at(R_PAREN) {
|
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)
|
FILE@[0; 35)
|
||||||
TYPE_DEF@[0; 35)
|
TYPE_DEF@[0; 34)
|
||||||
TYPE_KW@[0; 4)
|
TYPE_KW@[0; 4)
|
||||||
WHITESPACE@[4; 5)
|
WHITESPACE@[4; 5)
|
||||||
NAME@[5; 6)
|
NAME@[5; 6)
|
||||||
|
@ -36,5 +36,5 @@ FILE@[0; 36)
|
||||||
NAME_REF@[30; 33)
|
NAME_REF@[30; 33)
|
||||||
IDENT@[30; 33) "u64"
|
IDENT@[30; 33) "u64"
|
||||||
R_ANGLE@[33; 34)
|
R_ANGLE@[33; 34)
|
||||||
SEMI@[34; 35)
|
err: `expected SEMI`
|
||||||
WHITESPACE@[35; 36)
|
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