1
1
use super :: pat:: Expected ;
2
2
use super :: ty:: { AllowPlus , IsAsCast } ;
3
3
use 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 ,
6
6
} ;
7
7
8
8
use rustc_ast as ast;
@@ -732,43 +732,42 @@ impl<'a> Parser<'a> {
732
732
mut e : DiagnosticBuilder < ' a , ErrorReported > ,
733
733
expr : & mut P < Expr > ,
734
734
) -> 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 ( ) ;
764
763
}
765
764
}
766
- Err ( err) => {
767
- err. cancel ( ) ;
768
- }
769
- _ => { }
770
765
}
771
766
}
767
+ Err ( err) => {
768
+ err. cancel ( ) ;
769
+ }
770
+ _ => { }
772
771
}
773
772
}
774
773
Err ( e)
@@ -784,12 +783,13 @@ impl<'a> Parser<'a> {
784
783
outer_op : & Spanned < AssocOp > ,
785
784
) -> bool /* advanced the cursor */ {
786
785
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 ;
793
793
}
794
794
let mut enclose = |left : Span , right : Span | {
795
795
err. multipart_suggestion (
@@ -2245,12 +2245,32 @@ impl<'a> Parser<'a> {
2245
2245
first_pat
2246
2246
}
2247
2247
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
+
2248
2267
/// Some special error handling for the "top-level" patterns in a match arm,
2249
2268
/// `for` loop, `let`, &c. (in contrast to subpatterns within such).
2250
2269
crate fn maybe_recover_unexpected_comma (
2251
2270
& mut self ,
2252
2271
lo : Span ,
2253
2272
rc : RecoverComma ,
2273
+ rt : CommaRecoveryMode ,
2254
2274
) -> PResult < ' a , ( ) > {
2255
2275
if rc == RecoverComma :: No || self . token != token:: Comma {
2256
2276
return Ok ( ( ) ) ;
@@ -2270,20 +2290,25 @@ impl<'a> Parser<'a> {
2270
2290
let seq_span = lo. to ( self . prev_token . span ) ;
2271
2291
let mut err = self . struct_span_err ( comma_span, "unexpected `,` in pattern" ) ;
2272
2292
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
+ ] ,
2285
2302
Applicability :: MachineApplicable ,
2286
2303
) ;
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
+ }
2287
2312
}
2288
2313
Err ( err)
2289
2314
}
0 commit comments