Allow arbitrary self-types

This commit is contained in:
Aleksey Kladov 2018-08-23 19:07:33 +03:00
parent 8d82d1551e
commit a077533513
5 changed files with 104 additions and 18 deletions

View file

@ -94,21 +94,34 @@ 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 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 la1 = p.nth(1);
let la2 = p.nth(2); let la2 = p.nth(2);
let la3 = p.nth(3); let la3 = p.nth(3);
let n_toks = match (p.current(), la1, la2, la3) { let n_toks = match (p.current(), la1, la2, la3) {
(SELF_KW, _, _, _) => 1,
(AMP, SELF_KW, _, _) => 2, (AMP, SELF_KW, _, _) => 2,
(AMP, MUT_KW, SELF_KW, _) => 3, (AMP, MUT_KW, SELF_KW, _) => 3,
(AMP, LIFETIME, SELF_KW, _) => 3, (AMP, LIFETIME, SELF_KW, _) => 3,
(AMP, LIFETIME, MUT_KW, SELF_KW) => 4, (AMP, LIFETIME, MUT_KW, SELF_KW) => 4,
_ => return, _ => return,
}; };
let m = p.start(); m = p.start();
for _ in 0..n_toks { for _ in 0..n_toks {
p.bump(); p.bump();
} }
}
m.complete(p, SELF_PARAM); m.complete(p, SELF_PARAM);
if !p.at(R_PAREN) { if !p.at(R_PAREN) {
p.expect(COMMA); p.expect(COMMA);

View file

@ -1 +1 @@
type A = B<'static, i32, Item=u64>; type A = B<'static, i32, Item=u64>

View file

@ -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)

View file

@ -0,0 +1,4 @@
impl S {
fn a(self: &Self) {}
fn b(self: Box<Self>) {}
}

View file

@ -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)