Skip to content

Commit 793db8f

Browse files
committed
Rollup merge of #34691 - jseyfried:remove_erroneous_unit_struct_checks, r=nrc
parser: Remove outdated checks for empty braced struct expressions (`S {}`) This is a pure refactoring. r? @nrc
2 parents 4ee6a66 + 5e31617 commit 793db8f

File tree

1 file changed

+11
-72
lines changed

1 file changed

+11
-72
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 11 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -495,64 +495,6 @@ impl<'a> Parser<'a> {
495495
}
496496
}
497497

498-
/// Check for erroneous `ident { }`; if matches, signal error and
499-
/// recover (without consuming any expected input token). Returns
500-
/// true if and only if input was consumed for recovery.
501-
pub fn check_for_erroneous_unit_struct_expecting(&mut self,
502-
expected: &[token::Token])
503-
-> bool {
504-
if self.token == token::OpenDelim(token::Brace)
505-
&& expected.iter().all(|t| *t != token::OpenDelim(token::Brace))
506-
&& self.look_ahead(1, |t| *t == token::CloseDelim(token::Brace)) {
507-
// matched; signal non-fatal error and recover.
508-
let span = self.span;
509-
self.span_err(span, "unit-like struct construction is written with no trailing `{ }`");
510-
self.eat(&token::OpenDelim(token::Brace));
511-
self.eat(&token::CloseDelim(token::Brace));
512-
true
513-
} else {
514-
false
515-
}
516-
}
517-
518-
/// Commit to parsing a complete expression `e` expected to be
519-
/// followed by some token from the set edible + inedible. Recover
520-
/// from anticipated input errors, discarding erroneous characters.
521-
pub fn commit_expr(&mut self, e: &Expr, edible: &[token::Token],
522-
inedible: &[token::Token]) -> PResult<'a, ()> {
523-
debug!("commit_expr {:?}", e);
524-
if let ExprKind::Path(..) = e.node {
525-
// might be unit-struct construction; check for recoverableinput error.
526-
let expected = edible.iter()
527-
.cloned()
528-
.chain(inedible.iter().cloned())
529-
.collect::<Vec<_>>();
530-
self.check_for_erroneous_unit_struct_expecting(&expected[..]);
531-
}
532-
self.expect_one_of(edible, inedible)
533-
}
534-
535-
pub fn commit_expr_expecting(&mut self, e: &Expr, edible: token::Token) -> PResult<'a, ()> {
536-
self.commit_expr(e, &[edible], &[])
537-
}
538-
539-
/// Commit to parsing a complete statement `s`, which expects to be
540-
/// followed by some token from the set edible + inedible. Check
541-
/// for recoverable input errors, discarding erroneous characters.
542-
pub fn commit_stmt(&mut self, edible: &[token::Token],
543-
inedible: &[token::Token]) -> PResult<'a, ()> {
544-
if self.last_token
545-
.as_ref()
546-
.map_or(false, |t| t.is_ident() || t.is_path()) {
547-
let expected = edible.iter()
548-
.cloned()
549-
.chain(inedible.iter().cloned())
550-
.collect::<Vec<_>>();
551-
self.check_for_erroneous_unit_struct_expecting(&expected);
552-
}
553-
self.expect_one_of(edible, inedible)
554-
}
555-
556498
/// returns the span of expr, if it was not interpolated or the span of the interpolated token
557499
fn interpolated_or_expr_span(&self,
558500
expr: PResult<'a, P<Expr>>)
@@ -1247,7 +1189,7 @@ impl<'a> Parser<'a> {
12471189
let default = if self.check(&token::Eq) {
12481190
self.bump();
12491191
let expr = self.parse_expr()?;
1250-
self.commit_expr_expecting(&expr, token::Semi)?;
1192+
self.expect(&token::Semi)?;
12511193
Some(expr)
12521194
} else {
12531195
self.expect(&token::Semi)?;
@@ -2195,8 +2137,7 @@ impl<'a> Parser<'a> {
21952137
let mut trailing_comma = false;
21962138
while self.token != token::CloseDelim(token::Paren) {
21972139
es.push(self.parse_expr()?);
2198-
self.commit_expr(&es.last().unwrap(), &[],
2199-
&[token::Comma, token::CloseDelim(token::Paren)])?;
2140+
self.expect_one_of(&[], &[token::Comma, token::CloseDelim(token::Paren)])?;
22002141
if self.check(&token::Comma) {
22012142
trailing_comma = true;
22022143

@@ -2407,9 +2348,8 @@ impl<'a> Parser<'a> {
24072348
}
24082349
}
24092350

2410-
match self.commit_expr(&fields.last().unwrap().expr,
2411-
&[token::Comma],
2412-
&[token::CloseDelim(token::Brace)]) {
2351+
match self.expect_one_of(&[token::Comma],
2352+
&[token::CloseDelim(token::Brace)]) {
24132353
Ok(()) => {}
24142354
Err(mut e) => {
24152355
e.emit();
@@ -2662,7 +2602,7 @@ impl<'a> Parser<'a> {
26622602
self.bump();
26632603
let ix = self.parse_expr()?;
26642604
hi = self.span.hi;
2665-
self.commit_expr_expecting(&ix, token::CloseDelim(token::Bracket))?;
2605+
self.expect(&token::CloseDelim(token::Bracket))?;
26662606
let index = self.mk_index(e, ix);
26672607
e = self.mk_expr(lo, hi, index, ThinVec::new())
26682608
}
@@ -3329,8 +3269,7 @@ impl<'a> Parser<'a> {
33293269
let lo = self.last_span.lo;
33303270
let discriminant = self.parse_expr_res(Restrictions::RESTRICTION_NO_STRUCT_LITERAL,
33313271
None)?;
3332-
if let Err(mut e) = self.commit_expr_expecting(&discriminant,
3333-
token::OpenDelim(token::Brace)) {
3272+
if let Err(mut e) = self.expect(&token::OpenDelim(token::Brace)) {
33343273
if self.token == token::Token::Semi {
33353274
e.span_note(match_span, "did you mean to remove this `match` keyword?");
33363275
}
@@ -3376,7 +3315,7 @@ impl<'a> Parser<'a> {
33763315
&& self.token != token::CloseDelim(token::Brace);
33773316

33783317
if require_comma {
3379-
self.commit_expr(&expr, &[token::Comma], &[token::CloseDelim(token::Brace)])?;
3318+
self.expect_one_of(&[token::Comma], &[token::CloseDelim(token::Brace)])?;
33803319
} else {
33813320
self.eat(&token::Comma);
33823321
}
@@ -4118,7 +4057,7 @@ impl<'a> Parser<'a> {
41184057
_ => { // all other kinds of statements:
41194058
let mut hi = span.hi;
41204059
if classify::stmt_ends_with_semi(&node) {
4121-
self.commit_stmt(&[token::Semi], &[])?;
4060+
self.expect(&token::Semi)?;
41224061
hi = self.last_span.hi;
41234062
}
41244063

@@ -4196,7 +4135,7 @@ impl<'a> Parser<'a> {
41964135
if classify::expr_requires_semi_to_be_stmt(&e) {
41974136
// Just check for errors and recover; do not eat semicolon yet.
41984137
if let Err(mut e) =
4199-
self.commit_stmt(&[], &[token::Semi, token::CloseDelim(token::Brace)])
4138+
self.expect_one_of(&[], &[token::Semi, token::CloseDelim(token::Brace)])
42004139
{
42014140
e.emit();
42024141
self.recover_stmt();
@@ -4863,7 +4802,7 @@ impl<'a> Parser<'a> {
48634802
let typ = self.parse_ty_sum()?;
48644803
self.expect(&token::Eq)?;
48654804
let expr = self.parse_expr()?;
4866-
self.commit_expr_expecting(&expr, token::Semi)?;
4805+
self.expect(&token::Semi)?;
48674806
(name, ast::ImplItemKind::Const(typ, expr))
48684807
} else {
48694808
let (name, inner_attrs, node) = self.parse_impl_method(&vis)?;
@@ -5287,7 +5226,7 @@ impl<'a> Parser<'a> {
52875226
let ty = self.parse_ty_sum()?;
52885227
self.expect(&token::Eq)?;
52895228
let e = self.parse_expr()?;
5290-
self.commit_expr_expecting(&e, token::Semi)?;
5229+
self.expect(&token::Semi)?;
52915230
let item = match m {
52925231
Some(m) => ItemKind::Static(ty, m, e),
52935232
None => ItemKind::Const(ty, e),

0 commit comments

Comments
 (0)