@@ -49,6 +49,7 @@ impl<'a> Parser<'a> {
49
49
}
50
50
51
51
/// Parses the contents of a module (inner attributes followed by module items).
52
+ /// We exit once we hit `term`
52
53
pub fn parse_mod (
53
54
& mut self ,
54
55
term : & TokenKind ,
@@ -59,13 +60,13 @@ impl<'a> Parser<'a> {
59
60
let post_attr_lo = self . token . span ;
60
61
let mut items = ThinVec :: new ( ) ;
61
62
while let Some ( item) = self . parse_item ( ForceCollect :: No ) ? {
63
+ self . maybe_consume_incorrect_semicolon ( Some ( & item) ) ;
62
64
items. push ( item) ;
63
- self . maybe_consume_incorrect_semicolon ( & items) ;
64
65
}
65
66
66
67
if !self . eat ( term) {
67
68
let token_str = super :: token_descr ( & self . token ) ;
68
- if !self . maybe_consume_incorrect_semicolon ( & items) {
69
+ if !self . maybe_consume_incorrect_semicolon ( items. last ( ) . map ( |x| & * * x ) ) {
69
70
let msg = format ! ( "expected item, found {token_str}" ) ;
70
71
let mut err = self . dcx ( ) . struct_span_err ( self . token . span , msg) ;
71
72
let span = self . token . span ;
@@ -101,9 +102,9 @@ impl<'a> Parser<'a> {
101
102
fn_parse_mode : FnParseMode ,
102
103
force_collect : ForceCollect ,
103
104
) -> PResult < ' a , Option < Item > > {
104
- self . recover_diff_marker ( ) ;
105
+ self . recover_vcs_conflict_marker ( ) ;
105
106
let attrs = self . parse_outer_attributes ( ) ?;
106
- self . recover_diff_marker ( ) ;
107
+ self . recover_vcs_conflict_marker ( ) ;
107
108
self . parse_item_common ( attrs, true , false , fn_parse_mode, force_collect)
108
109
}
109
110
@@ -194,12 +195,12 @@ impl<'a> Parser<'a> {
194
195
fn_parse_mode : FnParseMode ,
195
196
case : Case ,
196
197
) -> PResult < ' a , Option < ItemInfo > > {
197
- let def_final = def == & Defaultness :: Final ;
198
+ let check_pub = def == & Defaultness :: Final ;
198
199
let mut def_ = || mem:: replace ( def, Defaultness :: Final ) ;
199
200
200
201
let info = if self . eat_keyword_case ( kw:: Use , case) {
201
202
self . parse_use_item ( ) ?
202
- } else if self . check_fn_front_matter ( def_final , case) {
203
+ } else if self . check_fn_front_matter ( check_pub , case) {
203
204
// FUNCTION ITEM
204
205
let ( ident, sig, generics, body) =
205
206
self . parse_fn ( attrs, fn_parse_mode, lo, vis, case) ?;
@@ -310,7 +311,7 @@ impl<'a> Parser<'a> {
310
311
Ok ( Some ( info) )
311
312
}
312
313
313
- fn recover_import_as_use ( & mut self ) -> PResult < ' a , Option < ( Ident , ItemKind ) > > {
314
+ fn recover_import_as_use ( & mut self ) -> PResult < ' a , Option < ItemInfo > > {
314
315
let span = self . token . span ;
315
316
let token_name = super :: token_descr ( & self . token ) ;
316
317
let snapshot = self . create_snapshot_for_diagnostic ( ) ;
@@ -328,7 +329,7 @@ impl<'a> Parser<'a> {
328
329
}
329
330
}
330
331
331
- fn parse_use_item ( & mut self ) -> PResult < ' a , ( Ident , ItemKind ) > {
332
+ fn parse_use_item ( & mut self ) -> PResult < ' a , ItemInfo > {
332
333
let tree = self . parse_use_tree ( ) ?;
333
334
if let Err ( mut e) = self . expect_semi ( ) {
334
335
match tree. kind {
@@ -738,7 +739,7 @@ impl<'a> Parser<'a> {
738
739
if self . recover_doc_comment_before_brace ( ) {
739
740
continue ;
740
741
}
741
- self . recover_diff_marker ( ) ;
742
+ self . recover_vcs_conflict_marker ( ) ;
742
743
match parse_item ( self ) {
743
744
Ok ( None ) => {
744
745
let mut is_unnecessary_semicolon = !items. is_empty ( )
@@ -1085,7 +1086,7 @@ impl<'a> Parser<'a> {
1085
1086
/// ```
1086
1087
fn parse_use_tree_list ( & mut self ) -> PResult < ' a , ThinVec < ( UseTree , ast:: NodeId ) > > {
1087
1088
self . parse_delim_comma_seq ( Delimiter :: Brace , |p| {
1088
- p. recover_diff_marker ( ) ;
1089
+ p. recover_vcs_conflict_marker ( ) ;
1089
1090
Ok ( ( p. parse_use_tree ( ) ?, DUMMY_NODE_ID ) )
1090
1091
} )
1091
1092
. map ( |( r, _) | r)
@@ -1512,9 +1513,9 @@ impl<'a> Parser<'a> {
1512
1513
}
1513
1514
1514
1515
fn parse_enum_variant ( & mut self , span : Span ) -> PResult < ' a , Option < Variant > > {
1515
- self . recover_diff_marker ( ) ;
1516
+ self . recover_vcs_conflict_marker ( ) ;
1516
1517
let variant_attrs = self . parse_outer_attributes ( ) ?;
1517
- self . recover_diff_marker ( ) ;
1518
+ self . recover_vcs_conflict_marker ( ) ;
1518
1519
let help = "enum variants can be `Variant`, `Variant = <integer>`, \
1519
1520
`Variant(Type, ..., TypeN)` or `Variant { fields: Types }`";
1520
1521
self . collect_tokens_trailing_token (
@@ -1703,6 +1704,10 @@ impl<'a> Parser<'a> {
1703
1704
Ok ( ( class_name, ItemKind :: Union ( vdata, generics) ) )
1704
1705
}
1705
1706
1707
+ /// This function parses the fields of record structs:
1708
+ ///
1709
+ /// - `struct S { ... }`
1710
+ /// - `enum E { Variant { ... } }`
1706
1711
pub ( crate ) fn parse_record_struct_body (
1707
1712
& mut self ,
1708
1713
adt_ty : & str ,
@@ -1729,19 +1734,10 @@ impl<'a> Parser<'a> {
1729
1734
self . eat ( & token:: CloseDelim ( Delimiter :: Brace ) ) ;
1730
1735
} else {
1731
1736
let token_str = super :: token_descr ( & self . token ) ;
1732
- let msg = format ! (
1733
- "expected {}`{{` after struct name, found {}" ,
1734
- if parsed_where { "" } else { "`where`, or " } ,
1735
- token_str
1736
- ) ;
1737
+ let where_str = if parsed_where { "" } else { "`where`, or " } ;
1738
+ let msg = format ! ( "expected {where_str}`{{` after struct name, found {token_str}" ) ;
1737
1739
let mut err = self . dcx ( ) . struct_span_err ( self . token . span , msg) ;
1738
- err. span_label (
1739
- self . token . span ,
1740
- format ! (
1741
- "expected {}`{{` after struct name" ,
1742
- if parsed_where { "" } else { "`where`, or " }
1743
- ) ,
1744
- ) ;
1740
+ err. span_label ( self . token . span , format ! ( "expected {where_str}`{{` after struct name" , ) ) ;
1745
1741
return Err ( err) ;
1746
1742
}
1747
1743
@@ -1755,7 +1751,7 @@ impl<'a> Parser<'a> {
1755
1751
let attrs = p. parse_outer_attributes ( ) ?;
1756
1752
p. collect_tokens_trailing_token ( attrs, ForceCollect :: No , |p, attrs| {
1757
1753
let mut snapshot = None ;
1758
- if p. is_diff_marker ( & TokenKind :: BinOp ( token:: Shl ) , & TokenKind :: Lt ) {
1754
+ if p. is_vcs_conflict_marker ( & TokenKind :: BinOp ( token:: Shl ) , & TokenKind :: Lt ) {
1759
1755
// Account for `<<<<<<<` diff markers. We can't proactively error here because
1760
1756
// that can be a valid type start, so we snapshot and reparse only we've
1761
1757
// encountered another parse error.
@@ -1766,7 +1762,7 @@ impl<'a> Parser<'a> {
1766
1762
Ok ( vis) => vis,
1767
1763
Err ( err) => {
1768
1764
if let Some ( ref mut snapshot) = snapshot {
1769
- snapshot. recover_diff_marker ( ) ;
1765
+ snapshot. recover_vcs_conflict_marker ( ) ;
1770
1766
}
1771
1767
return Err ( err) ;
1772
1768
}
@@ -1775,7 +1771,7 @@ impl<'a> Parser<'a> {
1775
1771
Ok ( ty) => ty,
1776
1772
Err ( err) => {
1777
1773
if let Some ( ref mut snapshot) = snapshot {
1778
- snapshot. recover_diff_marker ( ) ;
1774
+ snapshot. recover_vcs_conflict_marker ( ) ;
1779
1775
}
1780
1776
return Err ( err) ;
1781
1777
}
@@ -1800,9 +1796,9 @@ impl<'a> Parser<'a> {
1800
1796
1801
1797
/// Parses an element of a struct declaration.
1802
1798
fn parse_field_def ( & mut self , adt_ty : & str ) -> PResult < ' a , FieldDef > {
1803
- self . recover_diff_marker ( ) ;
1799
+ self . recover_vcs_conflict_marker ( ) ;
1804
1800
let attrs = self . parse_outer_attributes ( ) ?;
1805
- self . recover_diff_marker ( ) ;
1801
+ self . recover_vcs_conflict_marker ( ) ;
1806
1802
self . collect_tokens_trailing_token ( attrs, ForceCollect :: No , |this, attrs| {
1807
1803
let lo = this. token . span ;
1808
1804
let vis = this. parse_visibility ( FollowedByType :: No ) ?;
@@ -2662,7 +2658,7 @@ impl<'a> Parser<'a> {
2662
2658
}
2663
2659
2664
2660
let ( mut params, _) = self . parse_paren_comma_seq ( |p| {
2665
- p. recover_diff_marker ( ) ;
2661
+ p. recover_vcs_conflict_marker ( ) ;
2666
2662
let snapshot = p. create_snapshot_for_diagnostic ( ) ;
2667
2663
let param = p. parse_param_general ( req_name, first_param) . or_else ( |e| {
2668
2664
let guar = e. emit ( ) ;
0 commit comments