Skip to content

Commit 4fa9c3b

Browse files
committed
syntax refactor parse_fn_params
1 parent 378cc98 commit 4fa9c3b

File tree

1 file changed

+29
-28
lines changed

1 file changed

+29
-28
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,13 +1031,10 @@ impl<'a> Parser<'a> {
10311031
let pat = self.mk_pat_ident(ty.span, bm, ident);
10321032
(pat, ty)
10331033
}
1034+
// If this is a C-variadic argument and we hit an error, return the error.
1035+
Err(err) if self.token == token::DotDotDot => return Err(err),
1036+
// Recover from attempting to parse the argument as a type without pattern.
10341037
Err(mut err) => {
1035-
// If this is a C-variadic argument and we hit an error, return the
1036-
// error.
1037-
if self.token == token::DotDotDot {
1038-
return Err(err);
1039-
}
1040-
// Recover from attempting to parse the argument as a type without pattern.
10411038
err.cancel();
10421039
mem::replace(self, parser_snapshot_before_ty);
10431040
self.recover_arg_parse()?
@@ -1200,42 +1197,44 @@ impl<'a> Parser<'a> {
12001197

12011198
}
12021199

1203-
fn parse_fn_params(&mut self, named_params: bool, allow_c_variadic: bool)
1204-
-> PResult<'a, Vec<Param>> {
1200+
fn parse_fn_params(
1201+
&mut self,
1202+
named_params: bool,
1203+
allow_c_variadic: bool,
1204+
) -> PResult<'a, Vec<Param>> {
12051205
let sp = self.token.span;
1206+
let do_not_enforce_named_params_for_c_variadic = |token: &token::Token| {
1207+
match token.kind {
1208+
token::DotDotDot => false,
1209+
_ => named_params,
1210+
}
1211+
};
12061212
let mut c_variadic = false;
1207-
let (params, _): (Vec<Option<Param>>, _) = self.parse_paren_comma_seq(|p| {
1208-
let do_not_enforce_named_arguments_for_c_variadic =
1209-
|token: &token::Token| -> bool {
1210-
if token == &token::DotDotDot {
1211-
false
1212-
} else {
1213-
named_params
1214-
}
1215-
};
1213+
let (params, _) = self.parse_paren_comma_seq(|p| {
12161214
match p.parse_param_general(
12171215
false,
12181216
false,
12191217
allow_c_variadic,
1220-
do_not_enforce_named_arguments_for_c_variadic
1218+
do_not_enforce_named_params_for_c_variadic,
12211219
) {
1222-
Ok(param) => {
1220+
Ok(param) => Ok(
12231221
if let TyKind::CVarArgs = param.ty.kind {
12241222
c_variadic = true;
12251223
if p.token != token::CloseDelim(token::Paren) {
1226-
let span = p.token.span;
1227-
p.span_err(span,
1228-
"`...` must be the last argument of a C-variadic function");
1224+
p.span_err(
1225+
p.token.span,
1226+
"`...` must be the last argument of a C-variadic function",
1227+
);
12291228
// FIXME(eddyb) this should probably still push `CVarArgs`.
12301229
// Maybe AST validation/HIR lowering should emit the above error?
1231-
Ok(None)
1230+
None
12321231
} else {
1233-
Ok(Some(param))
1232+
Some(param)
12341233
}
12351234
} else {
1236-
Ok(Some(param))
1235+
Some(param)
12371236
}
1238-
},
1237+
),
12391238
Err(mut e) => {
12401239
e.emit();
12411240
let lo = p.prev_span;
@@ -1251,8 +1250,10 @@ impl<'a> Parser<'a> {
12511250
let params: Vec<_> = params.into_iter().filter_map(|x| x).collect();
12521251

12531252
if c_variadic && params.len() <= 1 {
1254-
self.span_err(sp,
1255-
"C-variadic function must be declared with at least one named argument");
1253+
self.span_err(
1254+
sp,
1255+
"C-variadic function must be declared with at least one named argument",
1256+
);
12561257
}
12571258

12581259
Ok(params)

0 commit comments

Comments
 (0)