better self-types

This commit is contained in:
Aleksey Kladov 2018-08-24 01:19:38 +03:00
parent cf7d4a2a24
commit dc40f1298a
8 changed files with 67 additions and 45 deletions

View file

@ -208,7 +208,7 @@ fn extern_crate_item(p: &mut Parser) {
assert!(p.at(CRATE_KW)); assert!(p.at(CRATE_KW));
p.bump(); p.bump();
name(p); name(p);
alias(p); opt_alias(p);
p.expect(SEMI); p.expect(SEMI);
} }

View file

@ -26,7 +26,7 @@ fn use_tree(p: &mut Parser) {
paths::use_path(p); paths::use_path(p);
match p.current() { match p.current() {
AS_KW => { AS_KW => {
alias(p); opt_alias(p);
} }
COLONCOLON => { COLONCOLON => {
p.bump(); p.bump();

View file

@ -92,14 +92,14 @@ fn opt_visibility(p: &mut Parser) {
_ => (), _ => (),
} }
} }
fn alias(p: &mut Parser) -> bool {
fn opt_alias(p: &mut Parser) {
if p.at(AS_KW) { if p.at(AS_KW) {
let alias = p.start(); let m = p.start();
p.bump(); p.bump();
name(p); name(p);
alias.complete(p, ALIAS); m.complete(p, ALIAS);
} }
true //FIXME: return false if three are errors
} }
fn abi(p: &mut Parser) { fn abi(p: &mut Parser) {

View file

@ -92,16 +92,18 @@ fn value_parameter(p: &mut Parser, flavor: Flavor) {
// fn b(&self,) {} // fn b(&self,) {}
// fn c(&'a self,) {} // fn c(&'a self,) {}
// fn d(&'a mut self, x: i32) {} // fn d(&'a mut self, x: i32) {}
// fn e(mut self) {}
// } // }
fn self_param(p: &mut Parser) { fn self_param(p: &mut Parser) {
let m; let m;
if p.at(SELF_KW) { if p.at(SELF_KW) || p.at(MUT_KW) && p.nth(1) == SELF_KW {
m = p.start(); m = p.start();
p.bump(); p.eat(MUT_KW);
p.eat(SELF_KW);
// test arb_self_types // test arb_self_types
// impl S { // impl S {
// fn a(self: &Self) {} // fn a(self: &Self) {}
// fn b(self: Box<Self>) {} // fn b(mut self: Box<Self>) {}
// } // }
if p.at(COLON) { if p.at(COLON) {
types::ascription(p); types::ascription(p);

View file

@ -3,4 +3,5 @@ impl S {
fn b(&self,) {} fn b(&self,) {}
fn c(&'a self,) {} fn c(&'a self,) {}
fn d(&'a mut self, x: i32) {} fn d(&'a mut self, x: i32) {}
fn e(mut self) {}
} }

View file

@ -1,5 +1,5 @@
FILE@[0; 106) FILE@[0; 128)
IMPL_ITEM@[0; 105) IMPL_ITEM@[0; 127)
IMPL_KW@[0; 4) IMPL_KW@[0; 4)
WHITESPACE@[4; 5) WHITESPACE@[4; 5)
PATH_TYPE@[5; 6) PATH_TYPE@[5; 6)
@ -93,6 +93,23 @@ FILE@[0; 106)
BLOCK_EXPR@[101; 103) BLOCK_EXPR@[101; 103)
L_CURLY@[101; 102) L_CURLY@[101; 102)
R_CURLY@[102; 103) R_CURLY@[102; 103)
WHITESPACE@[103; 104) WHITESPACE@[103; 108)
R_CURLY@[104; 105) FN_DEF@[108; 125)
WHITESPACE@[105; 106) FN_KW@[108; 110)
WHITESPACE@[110; 111)
NAME@[111; 112)
IDENT@[111; 112) "e"
PARAM_LIST@[112; 122)
L_PAREN@[112; 113)
SELF_PARAM@[113; 121)
MUT_KW@[113; 116)
WHITESPACE@[116; 117)
SELF_KW@[117; 121)
R_PAREN@[121; 122)
WHITESPACE@[122; 123)
BLOCK_EXPR@[123; 125)
L_CURLY@[123; 124)
R_CURLY@[124; 125)
WHITESPACE@[125; 126)
R_CURLY@[126; 127)
WHITESPACE@[127; 128)

View file

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

View file

@ -1,5 +1,5 @@
FILE@[0; 65) FILE@[0; 69)
IMPL_ITEM@[0; 64) IMPL_ITEM@[0; 68)
IMPL_KW@[0; 4) IMPL_KW@[0; 4)
WHITESPACE@[4; 5) WHITESPACE@[4; 5)
PATH_TYPE@[5; 6) PATH_TYPE@[5; 6)
@ -34,36 +34,38 @@ FILE@[0; 65)
L_CURLY@[31; 32) L_CURLY@[31; 32)
R_CURLY@[32; 33) R_CURLY@[32; 33)
WHITESPACE@[33; 38) WHITESPACE@[33; 38)
FN_DEF@[38; 62) FN_DEF@[38; 66)
FN_KW@[38; 40) FN_KW@[38; 40)
WHITESPACE@[40; 41) WHITESPACE@[40; 41)
NAME@[41; 42) NAME@[41; 42)
IDENT@[41; 42) "b" IDENT@[41; 42) "b"
PARAM_LIST@[42; 59) PARAM_LIST@[42; 63)
L_PAREN@[42; 43) L_PAREN@[42; 43)
SELF_PARAM@[43; 58) SELF_PARAM@[43; 62)
SELF_KW@[43; 47) MUT_KW@[43; 46)
COLON@[47; 48) WHITESPACE@[46; 47)
WHITESPACE@[48; 49) SELF_KW@[47; 51)
PATH_TYPE@[49; 58) COLON@[51; 52)
PATH@[49; 58) WHITESPACE@[52; 53)
PATH_SEGMENT@[49; 58) PATH_TYPE@[53; 62)
NAME_REF@[49; 52) PATH@[53; 62)
IDENT@[49; 52) "Box" PATH_SEGMENT@[53; 62)
TYPE_ARG_LIST@[52; 58) NAME_REF@[53; 56)
L_ANGLE@[52; 53) IDENT@[53; 56) "Box"
TYPE_ARG@[53; 57) TYPE_ARG_LIST@[56; 62)
PATH_TYPE@[53; 57) L_ANGLE@[56; 57)
PATH@[53; 57) TYPE_ARG@[57; 61)
PATH_SEGMENT@[53; 57) PATH_TYPE@[57; 61)
NAME_REF@[53; 57) PATH@[57; 61)
IDENT@[53; 57) "Self" PATH_SEGMENT@[57; 61)
R_ANGLE@[57; 58) NAME_REF@[57; 61)
R_PAREN@[58; 59) IDENT@[57; 61) "Self"
WHITESPACE@[59; 60) R_ANGLE@[61; 62)
BLOCK_EXPR@[60; 62) R_PAREN@[62; 63)
L_CURLY@[60; 61) WHITESPACE@[63; 64)
R_CURLY@[61; 62) BLOCK_EXPR@[64; 66)
WHITESPACE@[62; 63) L_CURLY@[64; 65)
R_CURLY@[63; 64) R_CURLY@[65; 66)
WHITESPACE@[64; 65) WHITESPACE@[66; 67)
R_CURLY@[67; 68)
WHITESPACE@[68; 69)