diff options
Diffstat (limited to 'src/parser/grammar/mod.rs')
-rw-r--r-- | src/parser/grammar/mod.rs | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/parser/grammar/mod.rs b/src/parser/grammar/mod.rs index 498b45d44..b8847fb68 100644 --- a/src/parser/grammar/mod.rs +++ b/src/parser/grammar/mod.rs | |||
@@ -104,6 +104,7 @@ fn fn_value_parameters(p: &mut Parser) { | |||
104 | assert!(p.at(L_PAREN)); | 104 | assert!(p.at(L_PAREN)); |
105 | let m = p.start(); | 105 | let m = p.start(); |
106 | p.bump(); | 106 | p.bump(); |
107 | self_param(p); | ||
107 | while !p.at(EOF) && !p.at(R_PAREN) { | 108 | while !p.at(EOF) && !p.at(R_PAREN) { |
108 | value_parameter(p); | 109 | value_parameter(p); |
109 | if !p.at(R_PAREN) { | 110 | if !p.at(R_PAREN) { |
@@ -120,6 +121,29 @@ fn fn_value_parameters(p: &mut Parser) { | |||
120 | types::type_(p); | 121 | types::type_(p); |
121 | m.complete(p, VALUE_PARAMETER); | 122 | m.complete(p, VALUE_PARAMETER); |
122 | } | 123 | } |
124 | |||
125 | // test self_param | ||
126 | // impl S { | ||
127 | // fn a(self) {} | ||
128 | // fn b(&self,) {} | ||
129 | // fn c(&mut self, x: i32) {} | ||
130 | // } | ||
131 | fn self_param(p: &mut Parser) { | ||
132 | let la1 = p.nth(1); | ||
133 | let la2 = p.nth(2); | ||
134 | let n_toks = match (p.current(), la1, la2) { | ||
135 | (SELF_KW, _, _) => 1, | ||
136 | (AMPERSAND, SELF_KW, _) => 2, | ||
137 | (AMPERSAND, MUT_KW, SELF_KW) => 3, | ||
138 | _ => return, | ||
139 | }; | ||
140 | let m = p.start(); | ||
141 | for _ in 0..n_toks { p.bump(); } | ||
142 | m.complete(p, SELF_PARAM); | ||
143 | if !p.at(R_PAREN) { | ||
144 | p.expect(COMMA); | ||
145 | } | ||
146 | } | ||
123 | } | 147 | } |
124 | 148 | ||
125 | fn fn_ret_type(p: &mut Parser) { | 149 | fn fn_ret_type(p: &mut Parser) { |