@@ -822,98 +822,62 @@ impl<'a> Parser<'a> {
822
822
// attributes by giving them a empty "already-parsed" list.
823
823
let attrs = ThinVec :: new ( ) ;
824
824
825
- let lo = self . token . span ;
826
-
827
- macro_rules! parse_lit {
828
- ( ) => {
829
- match self . parse_opt_lit( ) {
830
- Some ( literal) => ( self . prev_span, ExprKind :: Lit ( literal) ) ,
831
- None => return Err ( self . expected_expression_found( ) ) ,
832
- }
833
- }
834
- }
835
-
836
825
// Note: when adding new syntax here, don't forget to adjust `TokenKind::can_begin_expr()`.
837
- let ( hi, ex) = match self . token . kind {
826
+ let lo = self . token . span ;
827
+ match self . token . kind {
838
828
// This match arm is a special-case of the `_` match arm below and
839
829
// could be removed without changing functionality, but it's faster
840
830
// to have it here, especially for programs with large constants.
841
- token:: Literal ( _) => parse_lit ! ( ) ,
842
- token:: OpenDelim ( token:: Paren ) => return self . parse_tuple_parens_expr ( attrs) ,
831
+ token:: Literal ( _) => self . parse_lit_expr ( attrs ) ,
832
+ token:: OpenDelim ( token:: Paren ) => self . parse_tuple_parens_expr ( attrs) ,
843
833
token:: OpenDelim ( token:: Brace ) => {
844
- return self . parse_block_expr ( None , lo, BlockCheckMode :: Default , attrs) ;
834
+ self . parse_block_expr ( None , lo, BlockCheckMode :: Default , attrs)
845
835
}
846
- token:: BinOp ( token:: Or ) | token:: OrOr => return self . parse_closure_expr ( attrs) ,
847
- token:: OpenDelim ( token:: Bracket ) => return self . parse_array_or_repeat_expr ( attrs) ,
836
+ token:: BinOp ( token:: Or ) | token:: OrOr => self . parse_closure_expr ( attrs) ,
837
+ token:: OpenDelim ( token:: Bracket ) => self . parse_array_or_repeat_expr ( attrs) ,
848
838
_ => {
849
839
if self . eat_lt ( ) {
850
840
let ( qself, path) = self . parse_qpath ( PathStyle :: Expr ) ?;
851
- let hi = path. span ;
852
- return Ok ( self . mk_expr ( lo. to ( hi) , ExprKind :: Path ( Some ( qself) , path) , attrs) ) ;
853
- }
854
- if self . token . is_path_start ( ) {
855
- return self . parse_path_start_expr ( attrs) ;
856
- }
857
- if self . check_keyword ( kw:: Move ) || self . check_keyword ( kw:: Static ) {
858
- return self . parse_closure_expr ( attrs) ;
859
- }
860
- if self . eat_keyword ( kw:: If ) {
861
- return self . parse_if_expr ( attrs) ;
862
- }
863
- if self . eat_keyword ( kw:: For ) {
864
- return self . parse_for_expr ( None , self . prev_span , attrs) ;
865
- }
866
- if self . eat_keyword ( kw:: While ) {
867
- return self . parse_while_expr ( None , self . prev_span , attrs) ;
868
- }
869
- if let Some ( label) = self . eat_label ( ) {
870
- return self . parse_labeled_expr ( label, attrs) ;
871
- }
872
- if self . eat_keyword ( kw:: Loop ) {
873
- return self . parse_loop_expr ( None , self . prev_span , attrs) ;
874
- }
875
- if self . eat_keyword ( kw:: Continue ) {
841
+ Ok ( self . mk_expr ( lo. to ( path. span ) , ExprKind :: Path ( Some ( qself) , path) , attrs) )
842
+ } else if self . token . is_path_start ( ) {
843
+ self . parse_path_start_expr ( attrs)
844
+ } else if self . check_keyword ( kw:: Move ) || self . check_keyword ( kw:: Static ) {
845
+ self . parse_closure_expr ( attrs)
846
+ } else if self . eat_keyword ( kw:: If ) {
847
+ self . parse_if_expr ( attrs)
848
+ } else if self . eat_keyword ( kw:: For ) {
849
+ self . parse_for_expr ( None , self . prev_span , attrs)
850
+ } else if self . eat_keyword ( kw:: While ) {
851
+ self . parse_while_expr ( None , self . prev_span , attrs)
852
+ } else if let Some ( label) = self . eat_label ( ) {
853
+ self . parse_labeled_expr ( label, attrs)
854
+ } else if self . eat_keyword ( kw:: Loop ) {
855
+ self . parse_loop_expr ( None , self . prev_span , attrs)
856
+ } else if self . eat_keyword ( kw:: Continue ) {
876
857
let kind = ExprKind :: Continue ( self . eat_label ( ) ) ;
877
- return Ok ( self . mk_expr ( lo. to ( self . prev_span ) , kind, attrs) ) ;
878
- }
879
- if self . eat_keyword ( kw:: Match ) {
858
+ Ok ( self . mk_expr ( lo. to ( self . prev_span ) , kind, attrs) )
859
+ } else if self . eat_keyword ( kw:: Match ) {
880
860
let match_sp = self . prev_span ;
881
- return self . parse_match_expr ( attrs) . map_err ( |mut err| {
861
+ self . parse_match_expr ( attrs) . map_err ( |mut err| {
882
862
err. span_label ( match_sp, "while parsing this match expression" ) ;
883
863
err
884
- } ) ;
885
- }
886
- if self . eat_keyword ( kw:: Unsafe ) {
864
+ } )
865
+ } else if self . eat_keyword ( kw:: Unsafe ) {
887
866
let mode = BlockCheckMode :: Unsafe ( ast:: UserProvided ) ;
888
- return self . parse_block_expr ( None , lo, mode, attrs) ;
889
- }
890
- if self . is_do_catch_block ( ) {
891
- return self . recover_do_catch ( attrs) ;
892
- }
893
- if self . is_try_block ( ) {
867
+ self . parse_block_expr ( None , lo, mode, attrs)
868
+ } else if self . is_do_catch_block ( ) {
869
+ self . recover_do_catch ( attrs)
870
+ } else if self . is_try_block ( ) {
894
871
self . expect_keyword ( kw:: Try ) ?;
895
- return self . parse_try_block ( lo, attrs) ;
896
- }
897
-
898
- // `Span::rust_2018()` is somewhat expensive; don't get it repeatedly.
899
- let is_span_rust_2018 = self . token . span . rust_2018 ( ) ;
900
- if is_span_rust_2018 && self . check_keyword ( kw:: Async ) {
901
- return if self . is_async_block ( ) { // Check for `async {` and `async move {`.
902
- self . parse_async_block ( attrs)
903
- } else {
904
- self . parse_closure_expr ( attrs)
905
- } ;
906
- }
907
- if self . eat_keyword ( kw:: Return ) {
908
- return self . parse_return_expr ( attrs) ;
872
+ self . parse_try_block ( lo, attrs)
873
+ } else if self . eat_keyword ( kw:: Return ) {
874
+ self . parse_return_expr ( attrs)
909
875
} else if self . eat_keyword ( kw:: Break ) {
910
- return self . parse_break_expr ( attrs) ;
876
+ self . parse_break_expr ( attrs)
911
877
} else if self . eat_keyword ( kw:: Yield ) {
912
- return self . parse_yield_expr ( attrs) ;
878
+ self . parse_yield_expr ( attrs)
913
879
} else if self . eat_keyword ( kw:: Let ) {
914
- return self . parse_let_expr ( attrs) ;
915
- } else if is_span_rust_2018 && self . eat_keyword ( kw:: Await ) {
916
- return self . recover_incorrect_await_syntax ( lo, self . prev_span , attrs) ;
880
+ self . parse_let_expr ( attrs)
917
881
} else if !self . unclosed_delims . is_empty ( ) && self . check ( & token:: Semi ) {
918
882
// Don't complain about bare semicolons after unclosed braces
919
883
// recovery in order to keep the error count down. Fixing the
@@ -926,15 +890,36 @@ impl<'a> Parser<'a> {
926
890
// 2 | foo(bar(;
927
891
// | ^ expected expression
928
892
self . bump ( ) ;
929
- return Ok ( self . mk_expr ( self . token . span , ExprKind :: Err , ThinVec :: new ( ) ) ) ;
893
+ Ok ( self . mk_expr ( self . token . span , ExprKind :: Err , ThinVec :: new ( ) ) )
894
+ } else if self . token . span . rust_2018 ( ) {
895
+ // `Span::rust_2018()` is somewhat expensive; don't get it repeatedly.
896
+ if self . check_keyword ( kw:: Async ) {
897
+ if self . is_async_block ( ) { // Check for `async {` and `async move {`.
898
+ self . parse_async_block ( attrs)
899
+ } else {
900
+ self . parse_closure_expr ( attrs)
901
+ }
902
+ } else if self . eat_keyword ( kw:: Await ) {
903
+ self . recover_incorrect_await_syntax ( lo, self . prev_span , attrs)
904
+ } else {
905
+ self . parse_lit_expr ( attrs)
906
+ }
930
907
} else {
931
- parse_lit ! ( )
908
+ self . parse_lit_expr ( attrs )
932
909
}
933
910
}
934
- } ;
911
+ }
912
+ }
935
913
936
- let expr = self . mk_expr ( lo. to ( hi) , ex, attrs) ;
937
- self . maybe_recover_from_bad_qpath ( expr, true )
914
+ fn parse_lit_expr ( & mut self , attrs : ThinVec < Attribute > ) -> PResult < ' a , P < Expr > > {
915
+ let lo = self . token . span ;
916
+ match self . parse_opt_lit ( ) {
917
+ Some ( literal) => {
918
+ let expr = self . mk_expr ( lo. to ( self . prev_span ) , ExprKind :: Lit ( literal) , attrs) ;
919
+ self . maybe_recover_from_bad_qpath ( expr, true )
920
+ }
921
+ None => return Err ( self . expected_expression_found ( ) ) ,
922
+ }
938
923
}
939
924
940
925
fn parse_tuple_parens_expr ( & mut self , mut attrs : ThinVec < Attribute > ) -> PResult < ' a , P < Expr > > {
0 commit comments