2018-07-31 20:13:08 +00:00
|
|
|
use super::*;
|
|
|
|
|
|
|
|
// test param_list
|
|
|
|
// fn a() {}
|
|
|
|
// fn b(x: i32) {}
|
|
|
|
// fn c(x: i32, ) {}
|
|
|
|
// fn d(x: i32, y: ()) {}
|
|
|
|
pub(super) fn list(p: &mut Parser) {
|
|
|
|
list_(p, true)
|
|
|
|
}
|
|
|
|
|
|
|
|
pub(super) fn list_opt_types(p: &mut Parser) {
|
|
|
|
list_(p, false)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn list_(p: &mut Parser, require_types: bool) {
|
|
|
|
assert!(p.at(if require_types { L_PAREN } else { PIPE }));
|
|
|
|
let m = p.start();
|
|
|
|
p.bump();
|
|
|
|
if require_types {
|
|
|
|
self_param(p);
|
|
|
|
}
|
|
|
|
let terminator = if require_types { R_PAREN } else { PIPE };
|
|
|
|
while !p.at(EOF) && !p.at(terminator) {
|
|
|
|
value_parameter(p, require_types);
|
|
|
|
if !p.at(terminator) {
|
|
|
|
p.expect(COMMA);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
p.expect(terminator);
|
|
|
|
m.complete(p, PARAM_LIST);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn value_parameter(p: &mut Parser, require_type: bool) {
|
|
|
|
let m = p.start();
|
|
|
|
patterns::pattern(p);
|
|
|
|
if p.at(COLON) || require_type {
|
|
|
|
types::ascription(p)
|
|
|
|
}
|
2018-07-31 20:13:55 +00:00
|
|
|
m.complete(p, PARAM);
|
2018-07-31 20:13:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// test self_param
|
|
|
|
// impl S {
|
|
|
|
// fn a(self) {}
|
|
|
|
// fn b(&self,) {}
|
|
|
|
// fn c(&'a self,) {}
|
|
|
|
// 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,
|
|
|
|
(AMPERSAND, SELF_KW, _, _) => 2,
|
|
|
|
(AMPERSAND, MUT_KW, SELF_KW, _) => 3,
|
|
|
|
(AMPERSAND, LIFETIME, SELF_KW, _) => 3,
|
|
|
|
(AMPERSAND, LIFETIME, MUT_KW, SELF_KW) => 4,
|
|
|
|
_ => return,
|
|
|
|
};
|
|
|
|
let m = p.start();
|
|
|
|
for _ in 0..n_toks {
|
|
|
|
p.bump();
|
|
|
|
}
|
|
|
|
m.complete(p, SELF_PARAM);
|
|
|
|
if !p.at(R_PAREN) {
|
|
|
|
p.expect(COMMA);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|