From a077533513de5018e227c740a470e18652b63172 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 23 Aug 2018 19:07:33 +0300 Subject: Allow arbitrary self-types --- crates/libsyntax2/src/grammar/params.rs | 39 ++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 13 deletions(-) (limited to 'crates/libsyntax2/src') diff --git a/crates/libsyntax2/src/grammar/params.rs b/crates/libsyntax2/src/grammar/params.rs index 32e905cb2..7e58e8713 100644 --- a/crates/libsyntax2/src/grammar/params.rs +++ b/crates/libsyntax2/src/grammar/params.rs @@ -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) {} + // } + 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) { -- cgit v1.2.3