Skip to content

Commit ee02661

Browse files
committed
Split parser logic to its own method
1 parent d763faf commit ee02661

File tree

1 file changed

+96
-87
lines changed

1 file changed

+96
-87
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 96 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -2630,93 +2630,9 @@ impl<'a> Parser<'a> {
26302630
return Err(db);
26312631
} else if self.span.rust_2018() && self.eat_keyword(keywords::Await) {
26322632
let await_sp = self.prev_span;
2633-
match self.token {
2634-
token::Not => {
2635-
// FIXME: make this an error when `await!` is no longer supported
2636-
// https://github.com/rust-lang/rust/issues/60610
2637-
self.expect(&token::Not)?;
2638-
self.expect(&token::OpenDelim(token::Paren))?;
2639-
let expr = self.parse_expr().map_err(|mut err| {
2640-
err.span_label(
2641-
await_sp,
2642-
"while parsing this await macro call",
2643-
);
2644-
err
2645-
})?;
2646-
self.expect(&token::CloseDelim(token::Paren))?;
2647-
ex = ExprKind::Await(ast::AwaitOrigin::MacroLike, expr);
2648-
}
2649-
token::Question => {
2650-
// Handle `await? <expr>`
2651-
self.bump(); // `?`
2652-
let expr = self.parse_expr().map_err(|mut err| {
2653-
err.span_label(
2654-
await_sp,
2655-
"while parsing this incorrect await statement",
2656-
);
2657-
err
2658-
})?;
2659-
let sp = lo.to(expr.span);
2660-
let expr_str = self.sess.source_map().span_to_snippet(expr.span)
2661-
.unwrap_or_else(|_| pprust::expr_to_string(&expr));
2662-
let expr = self.mk_expr(
2663-
sp,
2664-
ExprKind::Await(ast::AwaitOrigin::FieldLike, expr),
2665-
ThinVec::new(),
2666-
);
2667-
hi = sp;
2668-
ex = ExprKind::Try(expr);
2669-
let mut err = self.struct_span_err(
2670-
await_sp,
2671-
"incorrect use of `await`",
2672-
);
2673-
err.span_suggestion(
2674-
sp,
2675-
"`await` is not a statement",
2676-
format!("{}.await?", expr_str),
2677-
Applicability::MachineApplicable,
2678-
);
2679-
err.emit();
2680-
}
2681-
ref t => {
2682-
// Handle `await <expr>`
2683-
let expr = if t == &token::OpenDelim(token::Brace) {
2684-
// Handle `await { <expr> }`
2685-
// this needs to be handled separatedly from the next arm to avoid
2686-
// interpreting `await { <expr> }?` as `<expr>?.await`
2687-
self.parse_block_expr(
2688-
None,
2689-
self.span,
2690-
BlockCheckMode::Default,
2691-
ThinVec::new(),
2692-
)
2693-
} else {
2694-
self.parse_expr()
2695-
}.map_err(|mut err| {
2696-
err.span_label(
2697-
await_sp,
2698-
"while parsing this incorrect await statement",
2699-
);
2700-
err
2701-
})?;
2702-
let expr_str = self.sess.source_map().span_to_snippet(expr.span)
2703-
.unwrap_or_else(|_| pprust::expr_to_string(&expr));
2704-
let sp = lo.to(expr.span);
2705-
hi = sp;
2706-
ex = ExprKind::Await(ast::AwaitOrigin::FieldLike, expr);
2707-
let mut err = self.struct_span_err(
2708-
await_sp,
2709-
"incorrect use of `await`",
2710-
);
2711-
err.span_suggestion(
2712-
sp,
2713-
"`await` is not a statement",
2714-
format!("{}.await", expr_str),
2715-
Applicability::MachineApplicable,
2716-
);
2717-
err.emit();
2718-
}
2719-
}
2633+
let e = self.parse_async_macro_or_stmt(lo, await_sp)?;
2634+
hi = e.0;
2635+
ex = e.1;
27202636
} else if self.token.is_path_start() {
27212637
let path = self.parse_path(PathStyle::Expr)?;
27222638

@@ -2781,6 +2697,99 @@ impl<'a> Parser<'a> {
27812697
self.maybe_recover_from_bad_qpath(expr, true)
27822698
}
27832699

2700+
fn parse_async_macro_or_stmt(
2701+
&mut self,
2702+
lo: Span,
2703+
await_sp: Span,
2704+
) -> PResult<'a, (Span, ExprKind)> {
2705+
Ok(match self.token {
2706+
token::Not => {
2707+
// Handle correct `await!(<expr>)`
2708+
// FIXME: make this an error when `await!` is no longer supported
2709+
// https://github.com/rust-lang/rust/issues/60610
2710+
self.expect(&token::Not)?;
2711+
self.expect(&token::OpenDelim(token::Paren))?;
2712+
let expr = self.parse_expr().map_err(|mut err| {
2713+
err.span_label(
2714+
await_sp,
2715+
"while parsing this await macro call",
2716+
);
2717+
err
2718+
})?;
2719+
self.expect(&token::CloseDelim(token::Paren))?;
2720+
(expr.span, ExprKind::Await(ast::AwaitOrigin::MacroLike, expr))
2721+
}
2722+
token::Question => {
2723+
// Handle `await? <expr>`
2724+
self.bump(); // `?`
2725+
let expr = self.parse_expr().map_err(|mut err| {
2726+
err.span_label(
2727+
await_sp,
2728+
"while parsing this incorrect await statement",
2729+
);
2730+
err
2731+
})?;
2732+
let sp = lo.to(expr.span);
2733+
let expr_str = self.sess.source_map().span_to_snippet(expr.span)
2734+
.unwrap_or_else(|_| pprust::expr_to_string(&expr));
2735+
let expr = self.mk_expr(
2736+
sp,
2737+
ExprKind::Await(ast::AwaitOrigin::FieldLike, expr),
2738+
ThinVec::new(),
2739+
);
2740+
let mut err = self.struct_span_err(
2741+
await_sp,
2742+
"incorrect use of `await`",
2743+
);
2744+
err.span_suggestion(
2745+
sp,
2746+
"`await` is not a statement",
2747+
format!("{}.await?", expr_str),
2748+
Applicability::MachineApplicable,
2749+
);
2750+
err.emit();
2751+
(sp, ExprKind::Try(expr))
2752+
}
2753+
ref t => {
2754+
// Handle `await <expr>`
2755+
let expr = if t == &token::OpenDelim(token::Brace) {
2756+
// Handle `await { <expr> }`
2757+
// this needs to be handled separatedly from the next arm to avoid
2758+
// interpreting `await { <expr> }?` as `<expr>?.await`
2759+
self.parse_block_expr(
2760+
None,
2761+
self.span,
2762+
BlockCheckMode::Default,
2763+
ThinVec::new(),
2764+
)
2765+
} else {
2766+
self.parse_expr()
2767+
}.map_err(|mut err| {
2768+
err.span_label(
2769+
await_sp,
2770+
"while parsing this incorrect await statement",
2771+
);
2772+
err
2773+
})?;
2774+
let expr_str = self.sess.source_map().span_to_snippet(expr.span)
2775+
.unwrap_or_else(|_| pprust::expr_to_string(&expr));
2776+
let sp = lo.to(expr.span);
2777+
let mut err = self.struct_span_err(
2778+
await_sp,
2779+
"incorrect use of `await`",
2780+
);
2781+
err.span_suggestion(
2782+
sp,
2783+
"`await` is not a statement",
2784+
format!("{}.await", expr_str),
2785+
Applicability::MachineApplicable,
2786+
);
2787+
err.emit();
2788+
(sp, ExprKind::Await(ast::AwaitOrigin::FieldLike, expr))
2789+
}
2790+
})
2791+
}
2792+
27842793
fn maybe_parse_struct_expr(
27852794
&mut self,
27862795
lo: Span,

0 commit comments

Comments
 (0)