1
1
use super :: diagnostics:: { dummy_arg, ConsumeClosingDelim } ;
2
- use super :: ty:: { AllowPlus , MaybeRecoverAnonStructOrUnion , RecoverQPath , RecoverReturnSign } ;
2
+ use super :: ty:: { AllowAnonStructOrUnion , AllowPlus , RecoverQPath , RecoverReturnSign } ;
3
3
use super :: { AttrWrapper , FollowedByType , ForceCollect , Parser , PathStyle , TrailingToken } ;
4
4
use crate :: errors:: { self , MacroExpandsToAdtField } ;
5
5
use crate :: fluent_generated as fluent;
@@ -562,103 +562,42 @@ impl<'a> Parser<'a> {
562
562
563
563
let polarity = self . parse_polarity ( ) ;
564
564
565
- let mut snapshot_before_last_ty = self . create_snapshot_for_diagnostic ( ) ;
566
565
// Parse both types and traits as a type, then reinterpret if necessary.
567
566
let err_path = |span| ast:: Path :: from_ident ( Ident :: new ( kw:: Empty , span) ) ;
568
- let mut ty_first =
569
- if self . token . is_keyword ( kw:: For ) && self . look_ahead ( 1 , |t| t != & token:: Lt ) {
570
- let span = self . prev_token . span . between ( self . token . span ) ;
571
- self . struct_span_err ( span, "missing trait in a trait impl" )
572
- . span_suggestion (
573
- span,
574
- "add a trait here" ,
575
- " Trait " ,
576
- Applicability :: HasPlaceholders ,
577
- )
578
- . span_suggestion (
579
- span. to ( self . token . span ) ,
580
- "for an inherent impl, drop this `for`" ,
581
- "" ,
582
- Applicability :: MaybeIncorrect ,
583
- )
584
- . emit ( ) ;
585
- P ( Ty {
586
- kind : TyKind :: Path ( None , err_path ( span) ) ,
587
- span,
588
- id : DUMMY_NODE_ID ,
589
- tokens : None ,
590
- } )
591
- } else {
592
- self . parse_ty_with_generics_recovery ( & generics) ?
593
- } ;
567
+ let ty_first = if self . token . is_keyword ( kw:: For ) && self . look_ahead ( 1 , |t| t != & token:: Lt )
568
+ {
569
+ let span = self . prev_token . span . between ( self . token . span ) ;
570
+ self . sess . emit_err ( errors:: MissingTraitInTraitImpl {
571
+ span,
572
+ for_span : span. to ( self . token . span ) ,
573
+ } ) ;
574
+ P ( Ty {
575
+ kind : TyKind :: Path ( None , err_path ( span) ) ,
576
+ span,
577
+ id : DUMMY_NODE_ID ,
578
+ tokens : None ,
579
+ } )
580
+ } else {
581
+ self . parse_ty_with_generics_recovery ( & generics) ?
582
+ } ;
594
583
595
584
// If `for` is missing we try to recover.
596
585
let has_for = self . eat_keyword ( kw:: For ) ;
597
586
let missing_for_span = self . prev_token . span . between ( self . token . span ) ;
598
587
599
- let mut ty_second = if self . token == token:: DotDot {
588
+ let ty_second = if self . token == token:: DotDot {
600
589
// We need to report this error after `cfg` expansion for compatibility reasons
601
590
self . bump ( ) ; // `..`, do not add it to expected tokens
602
591
Some ( self . mk_ty ( self . prev_token . span , TyKind :: Err ) )
603
592
} else if has_for || self . token . can_begin_type ( ) {
604
- snapshot_before_last_ty = self . create_snapshot_for_diagnostic ( ) ;
605
- Some ( self . parse_ty ( ) ?)
593
+ Some ( self . parse_second_ty_for_item_impl ( ) ?)
606
594
} else {
607
595
None
608
596
} ;
609
597
610
598
generics. where_clause = self . parse_where_clause ( ) ?;
611
599
612
- let ( mut impl_items, err) =
613
- self . parse_item_list ( attrs, |p| p. parse_impl_item ( ForceCollect :: No ) ) ?;
614
-
615
- if let Some ( mut err) = err {
616
- let mut snapshot = snapshot_before_last_ty;
617
-
618
- if snapshot. can_start_anonymous_union ( ) {
619
- let recover_result = {
620
- let recover_last_ty = match snapshot. parse_ty ( ) {
621
- Ok ( ty) => Some ( ty) ,
622
- Err ( snapshot_err) => {
623
- snapshot_err. cancel ( ) ;
624
- None
625
- }
626
- } ;
627
-
628
- let impl_items = match snapshot
629
- . parse_item_list ( attrs, |p| p. parse_impl_item ( ForceCollect :: No ) )
630
- {
631
- Ok ( ( impl_items, None ) ) => Some ( impl_items) ,
632
- Ok ( ( _, Some ( snapshot_err) ) ) => {
633
- snapshot_err. cancel ( ) ;
634
- None
635
- }
636
- Err ( snapshot_err) => {
637
- snapshot_err. cancel ( ) ;
638
- None
639
- }
640
- } ;
641
-
642
- ( recover_last_ty, impl_items)
643
- } ;
644
-
645
- if let ( Some ( recover_last_ty) , Some ( new_impl_items) ) = recover_result {
646
- err. delay_as_bug ( ) ;
647
- self . restore_snapshot ( snapshot) ;
648
-
649
- if ty_second. is_some ( ) {
650
- ty_second = Some ( recover_last_ty) ;
651
- } else {
652
- ty_first = recover_last_ty;
653
- }
654
- impl_items = new_impl_items;
655
- } else {
656
- err. emit ( ) ;
657
- }
658
- } else {
659
- err. emit ( ) ;
660
- }
661
- }
600
+ let impl_items = self . parse_item_list ( attrs, |p| p. parse_impl_item ( ForceCollect :: No ) ) ?;
662
601
663
602
let item_kind = match ty_second {
664
603
Some ( ty_second) => {
@@ -727,21 +666,20 @@ impl<'a> Parser<'a> {
727
666
& mut self ,
728
667
attrs : & mut AttrVec ,
729
668
mut parse_item : impl FnMut ( & mut Parser < ' a > ) -> PResult < ' a , Option < Option < T > > > ,
730
- ) -> PResult < ' a , ( ThinVec < T > , Option < DiagnosticBuilder < ' a , ErrorGuaranteed > > ) > {
669
+ ) -> PResult < ' a , ThinVec < T > > {
731
670
let open_brace_span = self . token . span ;
732
671
733
672
// Recover `impl Ty;` instead of `impl Ty {}`
734
673
if self . token == TokenKind :: Semi {
735
674
self . sess . emit_err ( errors:: UseEmptyBlockNotSemi { span : self . token . span } ) ;
736
675
self . bump ( ) ;
737
- return Ok ( ( ThinVec :: new ( ) , None ) ) ;
676
+ return Ok ( ThinVec :: new ( ) ) ;
738
677
}
739
678
740
679
self . expect ( & token:: OpenDelim ( Delimiter :: Brace ) ) ?;
741
680
attrs. extend ( self . parse_inner_attributes ( ) ?) ;
742
681
743
682
let mut items = ThinVec :: new ( ) ;
744
- let mut delayed_err = None ;
745
683
while !self . eat ( & token:: CloseDelim ( Delimiter :: Brace ) ) {
746
684
if self . recover_doc_comment_before_brace ( ) {
747
685
continue ;
@@ -803,21 +741,21 @@ impl<'a> Parser<'a> {
803
741
Applicability :: MaybeIncorrect ,
804
742
) ;
805
743
}
806
- delayed_err = Some ( err) ;
744
+ err. emit ( ) ;
807
745
break ;
808
746
}
809
747
Ok ( Some ( item) ) => items. extend ( item) ,
810
748
Err ( mut err) => {
811
749
self . consume_block ( Delimiter :: Brace , ConsumeClosingDelim :: Yes ) ;
812
750
err. span_label ( open_brace_span, "while parsing this item list starting here" )
813
- . span_label ( self . prev_token . span , "the item list ends here" ) ;
751
+ . span_label ( self . prev_token . span , "the item list ends here" )
752
+ . emit ( ) ;
814
753
815
- delayed_err = Some ( err) ;
816
754
break ;
817
755
}
818
756
}
819
757
}
820
- Ok ( ( items, delayed_err ) )
758
+ Ok ( items)
821
759
}
822
760
823
761
/// Recover on a doc comment before `}`.
@@ -908,13 +846,7 @@ impl<'a> Parser<'a> {
908
846
} else {
909
847
// It's a normal trait.
910
848
generics. where_clause = self . parse_where_clause ( ) ?;
911
- let ( items, err) =
912
- self . parse_item_list ( attrs, |p| p. parse_trait_item ( ForceCollect :: No ) ) ?;
913
-
914
- if let Some ( mut err) = err {
915
- err. emit ( ) ;
916
- }
917
-
849
+ let items = self . parse_item_list ( attrs, |p| p. parse_trait_item ( ForceCollect :: No ) ) ?;
918
850
Ok ( (
919
851
ident,
920
852
ItemKind :: Trait ( Box :: new ( Trait { is_auto, unsafety, generics, bounds, items } ) ) ,
@@ -1182,13 +1114,11 @@ impl<'a> Parser<'a> {
1182
1114
self . eat_keyword ( kw:: Unsafe ) ;
1183
1115
}
1184
1116
1185
- let ( items, err) =
1186
- self . parse_item_list ( attrs, |p| p. parse_foreign_item ( ForceCollect :: No ) ) ?;
1187
- if let Some ( mut err) = err {
1188
- err. emit ( ) ;
1189
- }
1190
-
1191
- let module = ast:: ForeignMod { unsafety, abi, items } ;
1117
+ let module = ast:: ForeignMod {
1118
+ unsafety,
1119
+ abi,
1120
+ items : self . parse_item_list ( attrs, |p| p. parse_foreign_item ( ForceCollect :: No ) ) ?,
1121
+ } ;
1192
1122
Ok ( ( Ident :: empty ( ) , ItemKind :: ForeignMod ( module) ) )
1193
1123
}
1194
1124
@@ -1675,7 +1605,7 @@ impl<'a> Parser<'a> {
1675
1605
adt_ty,
1676
1606
ident_span,
1677
1607
parsed_where,
1678
- MaybeRecoverAnonStructOrUnion :: Parse ,
1608
+ AllowAnonStructOrUnion :: Yes ,
1679
1609
)
1680
1610
}
1681
1611
@@ -1684,7 +1614,7 @@ impl<'a> Parser<'a> {
1684
1614
adt_ty : & str ,
1685
1615
ident_span : Span ,
1686
1616
parsed_where : bool ,
1687
- maybe_recover_anon_struct_or_union : MaybeRecoverAnonStructOrUnion ,
1617
+ allow_anon_struct_or_union : AllowAnonStructOrUnion < ' a > ,
1688
1618
) -> PResult < ' a , ( ThinVec < FieldDef > , /* recovered */ bool ) > {
1689
1619
let mut fields = ThinVec :: new ( ) ;
1690
1620
let mut recovered = false ;
@@ -1704,9 +1634,9 @@ impl<'a> Parser<'a> {
1704
1634
// record struct body but an `impl` body.
1705
1635
//
1706
1636
// Instead, the error should be thrown and handled by the caller
1707
- // `parse_anonymous_struct_or_union `.
1708
- if maybe_recover_anon_struct_or_union
1709
- == MaybeRecoverAnonStructOrUnion :: Recover
1637
+ // `parse_anon_struct_or_union `.
1638
+ if let AllowAnonStructOrUnion :: RecoverNonEmptyOrElse ( _ ) =
1639
+ allow_anon_struct_or_union
1710
1640
{
1711
1641
return Err ( err) ;
1712
1642
}
0 commit comments