@@ -2630,93 +2630,9 @@ impl<'a> Parser<'a> {
2630
2630
return Err ( db) ;
2631
2631
} else if self . span . rust_2018 ( ) && self . eat_keyword ( keywords:: Await ) {
2632
2632
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 ;
2720
2636
} else if self . token . is_path_start ( ) {
2721
2637
let path = self . parse_path ( PathStyle :: Expr ) ?;
2722
2638
@@ -2781,6 +2697,99 @@ impl<'a> Parser<'a> {
2781
2697
self . maybe_recover_from_bad_qpath ( expr, true )
2782
2698
}
2783
2699
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
+
2784
2793
fn maybe_parse_struct_expr (
2785
2794
& mut self ,
2786
2795
lo : Span ,
0 commit comments