11use super :: pat:: Expected ;
22use super :: ty:: { AllowPlus , IsAsCast } ;
33use super :: {
4- BlockMode , Parser , PathStyle , RecoverColon , RecoverComma , Restrictions , SemiColonMode , SeqSep ,
5- TokenExpectType , TokenType ,
4+ BlockMode , CommaRecoveryMode , Parser , PathStyle , RecoverColon , RecoverComma , Restrictions ,
5+ SemiColonMode , SeqSep , TokenExpectType , TokenType ,
66} ;
77
88use rustc_ast as ast;
@@ -732,43 +732,42 @@ impl<'a> Parser<'a> {
732732 mut e : DiagnosticBuilder < ' a , ErrorReported > ,
733733 expr : & mut P < Expr > ,
734734 ) -> PResult < ' a , ( ) > {
735- if let ExprKind :: Binary ( binop, _, _) = & expr. kind {
736- if let ast:: BinOpKind :: Lt = binop. node {
737- if self . eat ( & token:: Comma ) {
738- let x = self . parse_seq_to_before_end (
739- & token:: Gt ,
740- SeqSep :: trailing_allowed ( token:: Comma ) ,
741- |p| p. parse_generic_arg ( None ) ,
742- ) ;
743- match x {
744- Ok ( ( _, _, false ) ) => {
745- if self . eat ( & token:: Gt ) {
746- e. span_suggestion_verbose (
747- binop. span . shrink_to_lo ( ) ,
748- TURBOFISH_SUGGESTION_STR ,
749- "::" . to_string ( ) ,
750- Applicability :: MaybeIncorrect ,
751- )
752- . emit ( ) ;
753- match self . parse_expr ( ) {
754- Ok ( _) => {
755- * expr =
756- self . mk_expr_err ( expr. span . to ( self . prev_token . span ) ) ;
757- return Ok ( ( ) ) ;
758- }
759- Err ( err) => {
760- * expr = self . mk_expr_err ( expr. span ) ;
761- err. cancel ( ) ;
762- }
763- }
735+ if let ExprKind :: Binary ( binop, _, _) = & expr. kind
736+ && let ast:: BinOpKind :: Lt = binop. node
737+ && self . eat ( & token:: Comma )
738+ {
739+ let x = self . parse_seq_to_before_end (
740+ & token:: Gt ,
741+ SeqSep :: trailing_allowed ( token:: Comma ) ,
742+ |p| p. parse_generic_arg ( None ) ,
743+ ) ;
744+ match x {
745+ Ok ( ( _, _, false ) ) => {
746+ if self . eat ( & token:: Gt ) {
747+ e. span_suggestion_verbose (
748+ binop. span . shrink_to_lo ( ) ,
749+ TURBOFISH_SUGGESTION_STR ,
750+ "::" . to_string ( ) ,
751+ Applicability :: MaybeIncorrect ,
752+ )
753+ . emit ( ) ;
754+ match self . parse_expr ( ) {
755+ Ok ( _) => {
756+ * expr =
757+ self . mk_expr_err ( expr. span . to ( self . prev_token . span ) ) ;
758+ return Ok ( ( ) ) ;
759+ }
760+ Err ( err) => {
761+ * expr = self . mk_expr_err ( expr. span ) ;
762+ err. cancel ( ) ;
764763 }
765764 }
766- Err ( err) => {
767- err. cancel ( ) ;
768- }
769- _ => { }
770765 }
771766 }
767+ Err ( err) => {
768+ err. cancel ( ) ;
769+ }
770+ _ => { }
772771 }
773772 }
774773 Err ( e)
@@ -784,12 +783,13 @@ impl<'a> Parser<'a> {
784783 outer_op : & Spanned < AssocOp > ,
785784 ) -> bool /* advanced the cursor */ {
786785 if let ExprKind :: Binary ( op, ref l1, ref r1) = inner_op. kind {
787- if let ExprKind :: Field ( _, ident) = l1. kind {
788- if ident. as_str ( ) . parse :: < i32 > ( ) . is_err ( ) && !matches ! ( r1. kind, ExprKind :: Lit ( _) ) {
789- // The parser has encountered `foo.bar<baz`, the likelihood of the turbofish
790- // suggestion being the only one to apply is high.
791- return false ;
792- }
786+ if let ExprKind :: Field ( _, ident) = l1. kind
787+ && ident. as_str ( ) . parse :: < i32 > ( ) . is_err ( )
788+ && !matches ! ( r1. kind, ExprKind :: Lit ( _) )
789+ {
790+ // The parser has encountered `foo.bar<baz`, the likelihood of the turbofish
791+ // suggestion being the only one to apply is high.
792+ return false ;
793793 }
794794 let mut enclose = |left : Span , right : Span | {
795795 err. multipart_suggestion (
@@ -2245,12 +2245,32 @@ impl<'a> Parser<'a> {
22452245 first_pat
22462246 }
22472247
2248+ crate fn maybe_recover_unexpected_block_label ( & mut self ) -> bool {
2249+ let Some ( label) = self . eat_label ( ) . filter ( |_| {
2250+ self . eat ( & token:: Colon ) && self . token . kind == token:: OpenDelim ( token:: Brace )
2251+ } ) else {
2252+ return false ;
2253+ } ;
2254+ let span = label. ident . span . to ( self . prev_token . span ) ;
2255+ let mut err = self . struct_span_err ( span, "block label not supported here" ) ;
2256+ err. span_label ( span, "not supported here" ) ;
2257+ err. tool_only_span_suggestion (
2258+ label. ident . span . until ( self . token . span ) ,
2259+ "remove this block label" ,
2260+ String :: new ( ) ,
2261+ Applicability :: MachineApplicable ,
2262+ ) ;
2263+ err. emit ( ) ;
2264+ true
2265+ }
2266+
22482267 /// Some special error handling for the "top-level" patterns in a match arm,
22492268 /// `for` loop, `let`, &c. (in contrast to subpatterns within such).
22502269 crate fn maybe_recover_unexpected_comma (
22512270 & mut self ,
22522271 lo : Span ,
22532272 rc : RecoverComma ,
2273+ rt : CommaRecoveryMode ,
22542274 ) -> PResult < ' a , ( ) > {
22552275 if rc == RecoverComma :: No || self . token != token:: Comma {
22562276 return Ok ( ( ) ) ;
@@ -2270,20 +2290,25 @@ impl<'a> Parser<'a> {
22702290 let seq_span = lo. to ( self . prev_token . span ) ;
22712291 let mut err = self . struct_span_err ( comma_span, "unexpected `,` in pattern" ) ;
22722292 if let Ok ( seq_snippet) = self . span_to_snippet ( seq_span) {
2273- const MSG : & str = "try adding parentheses to match on a tuple..." ;
2274-
2275- err. span_suggestion (
2276- seq_span,
2277- MSG ,
2278- format ! ( "({})" , seq_snippet) ,
2279- Applicability :: MachineApplicable ,
2280- ) ;
2281- err. span_suggestion (
2282- seq_span,
2283- "...or a vertical bar to match on multiple alternatives" ,
2284- seq_snippet. replace ( ',' , " |" ) ,
2293+ err. multipart_suggestion (
2294+ & format ! (
2295+ "try adding parentheses to match on a tuple{}" ,
2296+ if let CommaRecoveryMode :: LikelyTuple = rt { "" } else { "..." } ,
2297+ ) ,
2298+ vec ! [
2299+ ( seq_span. shrink_to_lo( ) , "(" . to_string( ) ) ,
2300+ ( seq_span. shrink_to_hi( ) , ")" . to_string( ) ) ,
2301+ ] ,
22852302 Applicability :: MachineApplicable ,
22862303 ) ;
2304+ if let CommaRecoveryMode :: EitherTupleOrPipe = rt {
2305+ err. span_suggestion (
2306+ seq_span,
2307+ "...or a vertical bar to match on multiple alternatives" ,
2308+ seq_snippet. replace ( ',' , " |" ) ,
2309+ Applicability :: MachineApplicable ,
2310+ ) ;
2311+ }
22872312 }
22882313 Err ( err)
22892314 }
0 commit comments