@@ -49,6 +49,7 @@ impl<'a> Parser<'a> {
4949 }
5050
5151 /// Parses the contents of a module (inner attributes followed by module items).
52+ /// We exit once we hit `term`
5253 pub fn parse_mod(
5354 &mut self,
5455 term: &TokenKind,
@@ -59,13 +60,13 @@ impl<'a> Parser<'a> {
5960 let post_attr_lo = self.token.span;
6061 let mut items = ThinVec::new();
6162 while let Some(item) = self.parse_item(ForceCollect::No)? {
63+ self.maybe_consume_incorrect_semicolon(Some(&item));
6264 items.push(item);
63- self.maybe_consume_incorrect_semicolon(&items);
6465 }
6566
6667 if !self.eat(term) {
6768 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) ) {
6970 let msg = format!("expected item, found {token_str}");
7071 let mut err = self.dcx().struct_span_err(self.token.span, msg);
7172 let span = self.token.span;
@@ -101,9 +102,9 @@ impl<'a> Parser<'a> {
101102 fn_parse_mode: FnParseMode,
102103 force_collect: ForceCollect,
103104 ) -> PResult<'a, Option<Item>> {
104- self.recover_diff_marker ();
105+ self.recover_vcs_conflict_marker ();
105106 let attrs = self.parse_outer_attributes()?;
106- self.recover_diff_marker ();
107+ self.recover_vcs_conflict_marker ();
107108 self.parse_item_common(attrs, true, false, fn_parse_mode, force_collect)
108109 }
109110
@@ -194,12 +195,12 @@ impl<'a> Parser<'a> {
194195 fn_parse_mode: FnParseMode,
195196 case: Case,
196197 ) -> PResult<'a, Option<ItemInfo>> {
197- let def_final = def == &Defaultness::Final;
198+ let check_pub = def == &Defaultness::Final;
198199 let mut def_ = || mem::replace(def, Defaultness::Final);
199200
200201 let info = if self.eat_keyword_case(kw::Use, case) {
201202 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) {
203204 // FUNCTION ITEM
204205 let (ident, sig, generics, body) =
205206 self.parse_fn(attrs, fn_parse_mode, lo, vis, case)?;
@@ -310,7 +311,7 @@ impl<'a> Parser<'a> {
310311 Ok(Some(info))
311312 }
312313
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 >> {
314315 let span = self.token.span;
315316 let token_name = super::token_descr(&self.token);
316317 let snapshot = self.create_snapshot_for_diagnostic();
@@ -328,7 +329,7 @@ impl<'a> Parser<'a> {
328329 }
329330 }
330331
331- fn parse_use_item(&mut self) -> PResult<'a, (Ident, ItemKind) > {
332+ fn parse_use_item(&mut self) -> PResult<'a, ItemInfo > {
332333 let tree = self.parse_use_tree()?;
333334 if let Err(mut e) = self.expect_semi() {
334335 match tree.kind {
@@ -738,7 +739,7 @@ impl<'a> Parser<'a> {
738739 if self.recover_doc_comment_before_brace() {
739740 continue;
740741 }
741- self.recover_diff_marker ();
742+ self.recover_vcs_conflict_marker ();
742743 match parse_item(self) {
743744 Ok(None) => {
744745 let mut is_unnecessary_semicolon = !items.is_empty()
@@ -1085,7 +1086,7 @@ impl<'a> Parser<'a> {
10851086 /// ```
10861087 fn parse_use_tree_list(&mut self) -> PResult<'a, ThinVec<(UseTree, ast::NodeId)>> {
10871088 self.parse_delim_comma_seq(Delimiter::Brace, |p| {
1088- p.recover_diff_marker ();
1089+ p.recover_vcs_conflict_marker ();
10891090 Ok((p.parse_use_tree()?, DUMMY_NODE_ID))
10901091 })
10911092 .map(|(r, _)| r)
@@ -1512,9 +1513,9 @@ impl<'a> Parser<'a> {
15121513 }
15131514
15141515 fn parse_enum_variant(&mut self, span: Span) -> PResult<'a, Option<Variant>> {
1515- self.recover_diff_marker ();
1516+ self.recover_vcs_conflict_marker ();
15161517 let variant_attrs = self.parse_outer_attributes()?;
1517- self.recover_diff_marker ();
1518+ self.recover_vcs_conflict_marker ();
15181519 let help = "enum variants can be `Variant`, `Variant = <integer>`, \
15191520 `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`";
15201521 self.collect_tokens_trailing_token(
@@ -1703,6 +1704,10 @@ impl<'a> Parser<'a> {
17031704 Ok((class_name, ItemKind::Union(vdata, generics)))
17041705 }
17051706
1707+ /// This function parses the fields of record structs:
1708+ ///
1709+ /// - `struct S { ... }`
1710+ /// - `enum E { Variant { ... } }`
17061711 pub(crate) fn parse_record_struct_body(
17071712 &mut self,
17081713 adt_ty: &str,
@@ -1729,19 +1734,10 @@ impl<'a> Parser<'a> {
17291734 self.eat(&token::CloseDelim(Delimiter::Brace));
17301735 } else {
17311736 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}");
17371739 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",));
17451741 return Err(err);
17461742 }
17471743
@@ -1755,7 +1751,7 @@ impl<'a> Parser<'a> {
17551751 let attrs = p.parse_outer_attributes()?;
17561752 p.collect_tokens_trailing_token(attrs, ForceCollect::No, |p, attrs| {
17571753 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) {
17591755 // Account for `<<<<<<<` diff markers. We can't proactively error here because
17601756 // that can be a valid type start, so we snapshot and reparse only we've
17611757 // encountered another parse error.
@@ -1766,7 +1762,7 @@ impl<'a> Parser<'a> {
17661762 Ok(vis) => vis,
17671763 Err(err) => {
17681764 if let Some(ref mut snapshot) = snapshot {
1769- snapshot.recover_diff_marker ();
1765+ snapshot.recover_vcs_conflict_marker ();
17701766 }
17711767 return Err(err);
17721768 }
@@ -1775,7 +1771,7 @@ impl<'a> Parser<'a> {
17751771 Ok(ty) => ty,
17761772 Err(err) => {
17771773 if let Some(ref mut snapshot) = snapshot {
1778- snapshot.recover_diff_marker ();
1774+ snapshot.recover_vcs_conflict_marker ();
17791775 }
17801776 return Err(err);
17811777 }
@@ -1800,9 +1796,9 @@ impl<'a> Parser<'a> {
18001796
18011797 /// Parses an element of a struct declaration.
18021798 fn parse_field_def(&mut self, adt_ty: &str) -> PResult<'a, FieldDef> {
1803- self.recover_diff_marker ();
1799+ self.recover_vcs_conflict_marker ();
18041800 let attrs = self.parse_outer_attributes()?;
1805- self.recover_diff_marker ();
1801+ self.recover_vcs_conflict_marker ();
18061802 self.collect_tokens_trailing_token(attrs, ForceCollect::No, |this, attrs| {
18071803 let lo = this.token.span;
18081804 let vis = this.parse_visibility(FollowedByType::No)?;
@@ -2662,7 +2658,7 @@ impl<'a> Parser<'a> {
26622658 }
26632659
26642660 let (mut params, _) = self.parse_paren_comma_seq(|p| {
2665- p.recover_diff_marker ();
2661+ p.recover_vcs_conflict_marker ();
26662662 let snapshot = p.create_snapshot_for_diagnostic();
26672663 let param = p.parse_param_general(req_name, first_param).or_else(|e| {
26682664 let guar = e.emit();
0 commit comments