From a077533513de5018e227c740a470e18652b63172 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
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<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) {
-- 
cgit v1.2.3