1
Fork 0

syntax refactor parse_fn_params

This commit is contained in:
Mazdak Farrokhzad 2019-09-30 01:21:42 +02:00
parent 378cc98cd9
commit 4fa9c3bca3

View file

@ -1031,13 +1031,10 @@ impl<'a> Parser<'a> {
let pat = self.mk_pat_ident(ty.span, bm, ident); let pat = self.mk_pat_ident(ty.span, bm, ident);
(pat, ty) (pat, ty)
} }
Err(mut err) => { // If this is a C-variadic argument and we hit an error, return the error.
// If this is a C-variadic argument and we hit an error, return the Err(err) if self.token == token::DotDotDot => return Err(err),
// error.
if self.token == token::DotDotDot {
return Err(err);
}
// Recover from attempting to parse the argument as a type without pattern. // Recover from attempting to parse the argument as a type without pattern.
Err(mut err) => {
err.cancel(); err.cancel();
mem::replace(self, parser_snapshot_before_ty); mem::replace(self, parser_snapshot_before_ty);
self.recover_arg_parse()? self.recover_arg_parse()?
@ -1200,42 +1197,44 @@ impl<'a> Parser<'a> {
} }
fn parse_fn_params(&mut self, named_params: bool, allow_c_variadic: bool) fn parse_fn_params(
-> PResult<'a, Vec<Param>> { &mut self,
named_params: bool,
allow_c_variadic: bool,
) -> PResult<'a, Vec<Param>> {
let sp = self.token.span; let sp = self.token.span;
let mut c_variadic = false; let do_not_enforce_named_params_for_c_variadic = |token: &token::Token| {
let (params, _): (Vec<Option<Param>>, _) = self.parse_paren_comma_seq(|p| { match token.kind {
let do_not_enforce_named_arguments_for_c_variadic = token::DotDotDot => false,
|token: &token::Token| -> bool { _ => named_params,
if token == &token::DotDotDot {
false
} else {
named_params
} }
}; };
let mut c_variadic = false;
let (params, _) = self.parse_paren_comma_seq(|p| {
match p.parse_param_general( match p.parse_param_general(
false, false,
false, false,
allow_c_variadic, allow_c_variadic,
do_not_enforce_named_arguments_for_c_variadic do_not_enforce_named_params_for_c_variadic,
) { ) {
Ok(param) => { Ok(param) => Ok(
if let TyKind::CVarArgs = param.ty.kind { if let TyKind::CVarArgs = param.ty.kind {
c_variadic = true; c_variadic = true;
if p.token != token::CloseDelim(token::Paren) { if p.token != token::CloseDelim(token::Paren) {
let span = p.token.span; p.span_err(
p.span_err(span, p.token.span,
"`...` must be the last argument of a C-variadic function"); "`...` must be the last argument of a C-variadic function",
);
// FIXME(eddyb) this should probably still push `CVarArgs`. // FIXME(eddyb) this should probably still push `CVarArgs`.
// Maybe AST validation/HIR lowering should emit the above error? // Maybe AST validation/HIR lowering should emit the above error?
Ok(None) None
} else { } else {
Ok(Some(param)) Some(param)
} }
} else { } else {
Ok(Some(param)) Some(param)
} }
}, ),
Err(mut e) => { Err(mut e) => {
e.emit(); e.emit();
let lo = p.prev_span; let lo = p.prev_span;
@ -1251,8 +1250,10 @@ impl<'a> Parser<'a> {
let params: Vec<_> = params.into_iter().filter_map(|x| x).collect(); let params: Vec<_> = params.into_iter().filter_map(|x| x).collect();
if c_variadic && params.len() <= 1 { if c_variadic && params.len() <= 1 {
self.span_err(sp, self.span_err(
"C-variadic function must be declared with at least one named argument"); sp,
"C-variadic function must be declared with at least one named argument",
);
} }
Ok(params) Ok(params)