Skip to content

Commit 3cca3c6

Browse files
authored
Rollup merge of #67744 - Centril:reduce-diversity, r=petrochenkov
parser: reduce diversity in error handling mechanisms Instead of having e.g. `span_err`, `fatal`, etc., we prefer to move towards uniformly using `struct_span_err` thus making it harder to emit fatal and/or unstructured diagnostics. This PR also de-fatalizes some diagnostics. r? @estebank
2 parents 50fb848 + 2e78061 commit 3cca3c6

16 files changed

+147
-142
lines changed

src/librustc_expand/mbe/macro_parser.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -890,12 +890,12 @@ fn parse_nt_inner<'a>(p: &mut Parser<'a>, sp: Span, name: Symbol) -> PResult<'a,
890890
Ok(match name {
891891
sym::item => match p.parse_item()? {
892892
Some(i) => token::NtItem(i),
893-
None => return Err(p.fatal("expected an item keyword")),
893+
None => return Err(p.struct_span_err(p.token.span, "expected an item keyword")),
894894
},
895895
sym::block => token::NtBlock(p.parse_block()?),
896896
sym::stmt => match p.parse_stmt()? {
897897
Some(s) => token::NtStmt(s),
898-
None => return Err(p.fatal("expected a statement")),
898+
None => return Err(p.struct_span_err(p.token.span, "expected a statement")),
899899
},
900900
sym::pat => token::NtPat(p.parse_pat(None)?),
901901
sym::expr => token::NtExpr(p.parse_expr()?),
@@ -909,7 +909,8 @@ fn parse_nt_inner<'a>(p: &mut Parser<'a>, sp: Span, name: Symbol) -> PResult<'a,
909909
token::NtIdent(Ident::new(name, span), is_raw)
910910
} else {
911911
let token_str = pprust::token_to_string(&p.token);
912-
return Err(p.fatal(&format!("expected ident, found {}", &token_str)));
912+
let msg = &format!("expected ident, found {}", &token_str);
913+
return Err(p.struct_span_err(p.token.span, msg));
913914
}
914915
}
915916
sym::path => token::NtPath(p.parse_path(PathStyle::Type)?),
@@ -920,7 +921,8 @@ fn parse_nt_inner<'a>(p: &mut Parser<'a>, sp: Span, name: Symbol) -> PResult<'a,
920921
token::NtLifetime(p.expect_lifetime().ident)
921922
} else {
922923
let token_str = pprust::token_to_string(&p.token);
923-
return Err(p.fatal(&format!("expected a lifetime, found `{}`", &token_str)));
924+
let msg = &format!("expected a lifetime, found `{}`", &token_str);
925+
return Err(p.struct_span_err(p.token.span, msg));
924926
}
925927
}
926928
// this is not supposed to happen, since it has been checked

src/librustc_parse/parser/attr.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ impl<'a> Parser<'a> {
4646
token::DocComment(s) => {
4747
let attr = self.mk_doc_comment(s);
4848
if attr.style != ast::AttrStyle::Outer {
49-
let mut err = self.fatal("expected outer doc comment");
49+
let span = self.token.span;
50+
let mut err = self.struct_span_err(span, "expected outer doc comment");
5051
err.note(
5152
"inner doc comments like this (starting with \
5253
`//!` or `/*!`) can only appear before items",
@@ -133,7 +134,7 @@ impl<'a> Parser<'a> {
133134
"previous outer attribute"
134135
};
135136

136-
let mut diagnostic = self.diagnostic().struct_span_err(attr_sp, reason);
137+
let mut diagnostic = self.struct_span_err(attr_sp, reason);
137138

138139
if let Some(prev_attr_sp) = prev_attr_sp {
139140
diagnostic
@@ -156,7 +157,8 @@ impl<'a> Parser<'a> {
156157
}
157158
_ => {
158159
let token_str = pprust::token_to_string(&self.token);
159-
return Err(self.fatal(&format!("expected `#`, found `{}`", token_str)));
160+
let msg = &format!("expected `#`, found `{}`", token_str);
161+
return Err(self.struct_span_err(self.token.span, msg));
160162
}
161163
};
162164

@@ -231,8 +233,7 @@ impl<'a> Parser<'a> {
231233

232234
if !lit.kind.is_unsuffixed() {
233235
let msg = "suffixed literals are not allowed in attributes";
234-
self.diagnostic()
235-
.struct_span_err(lit.span, msg)
236+
self.struct_span_err(lit.span, msg)
236237
.help(
237238
"instead of using a suffixed literal \
238239
(1u8, 1.0f32, etc.), use an unsuffixed version \
@@ -332,6 +333,6 @@ impl<'a> Parser<'a> {
332333

333334
let found = pprust::token_to_string(&self.token);
334335
let msg = format!("expected unsuffixed literal or identifier, found `{}`", found);
335-
Err(self.diagnostic().struct_span_err(self.token.span, &msg))
336+
Err(self.struct_span_err(self.token.span, &msg))
336337
}
337338
}

src/librustc_parse/parser/diagnostics.rs

+15-32
Original file line numberDiff line numberDiff line change
@@ -157,14 +157,6 @@ crate enum ConsumeClosingDelim {
157157
}
158158

159159
impl<'a> Parser<'a> {
160-
pub fn fatal(&self, m: &str) -> DiagnosticBuilder<'a> {
161-
self.span_fatal(self.token.span, m)
162-
}
163-
164-
crate fn span_fatal<S: Into<MultiSpan>>(&self, sp: S, m: &str) -> DiagnosticBuilder<'a> {
165-
self.sess.span_diagnostic.struct_span_fatal(sp, m)
166-
}
167-
168160
pub(super) fn span_fatal_err<S: Into<MultiSpan>>(
169161
&self,
170162
sp: S,
@@ -173,14 +165,6 @@ impl<'a> Parser<'a> {
173165
err.span_err(sp, self.diagnostic())
174166
}
175167

176-
pub(super) fn bug(&self, m: &str) -> ! {
177-
self.sess.span_diagnostic.span_bug(self.token.span, m)
178-
}
179-
180-
pub(super) fn span_err<S: Into<MultiSpan>>(&self, sp: S, m: &str) {
181-
self.sess.span_diagnostic.span_err(sp, m)
182-
}
183-
184168
pub fn struct_span_err<S: Into<MultiSpan>>(&self, sp: S, m: &str) -> DiagnosticBuilder<'a> {
185169
self.sess.span_diagnostic.struct_span_err(sp, m)
186170
}
@@ -298,7 +282,7 @@ impl<'a> Parser<'a> {
298282
)
299283
};
300284
self.last_unexpected_token_span = Some(self.token.span);
301-
let mut err = self.fatal(&msg_exp);
285+
let mut err = self.struct_span_err(self.token.span, &msg_exp);
302286
let sp = if self.token == token::Eof {
303287
// This is EOF; don't want to point at the following char, but rather the last token.
304288
self.prev_span
@@ -502,18 +486,17 @@ impl<'a> Parser<'a> {
502486
let span = lo.until(self.token.span);
503487

504488
let total_num_of_gt = number_of_gt + number_of_shr * 2;
505-
self.diagnostic()
506-
.struct_span_err(
507-
span,
508-
&format!("unmatched angle bracket{}", pluralize!(total_num_of_gt)),
509-
)
510-
.span_suggestion(
511-
span,
512-
&format!("remove extra angle bracket{}", pluralize!(total_num_of_gt)),
513-
String::new(),
514-
Applicability::MachineApplicable,
515-
)
516-
.emit();
489+
self.struct_span_err(
490+
span,
491+
&format!("unmatched angle bracket{}", pluralize!(total_num_of_gt)),
492+
)
493+
.span_suggestion(
494+
span,
495+
&format!("remove extra angle bracket{}", pluralize!(total_num_of_gt)),
496+
String::new(),
497+
Applicability::MachineApplicable,
498+
)
499+
.emit();
517500
}
518501
}
519502

@@ -762,8 +745,7 @@ impl<'a> Parser<'a> {
762745
path.span = ty_span.to(self.prev_span);
763746

764747
let ty_str = self.span_to_snippet(ty_span).unwrap_or_else(|_| pprust::ty_to_string(&ty));
765-
self.diagnostic()
766-
.struct_span_err(path.span, "missing angle brackets in associated item path")
748+
self.struct_span_err(path.span, "missing angle brackets in associated item path")
767749
.span_suggestion(
768750
// This is a best-effort recovery.
769751
path.span,
@@ -1271,7 +1253,8 @@ impl<'a> Parser<'a> {
12711253

12721254
pub(super) fn expected_semi_or_open_brace<T>(&mut self) -> PResult<'a, T> {
12731255
let token_str = super::token_descr(&self.token);
1274-
let mut err = self.fatal(&format!("expected `;` or `{{`, found {}", token_str));
1256+
let msg = &format!("expected `;` or `{{`, found {}", token_str);
1257+
let mut err = self.struct_span_err(self.token.span, msg);
12751258
err.span_label(self.token.span, "expected `;` or `{`");
12761259
Err(err)
12771260
}

src/librustc_parse/parser/expr.rs

+9-8
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ impl<'a> Parser<'a> {
283283
self.mk_expr(span, aopexpr, AttrVec::new())
284284
}
285285
AssocOp::As | AssocOp::Colon | AssocOp::DotDot | AssocOp::DotDotEq => {
286-
self.bug("AssocOp should have been handled by special case")
286+
self.span_bug(span, "AssocOp should have been handled by special case")
287287
}
288288
};
289289

@@ -822,7 +822,11 @@ impl<'a> Parser<'a> {
822822
} else {
823823
// Field access `expr.f`
824824
if let Some(args) = segment.args {
825-
self.span_err(args.span(), "field expressions may not have generic arguments");
825+
self.struct_span_err(
826+
args.span(),
827+
"field expressions may not have generic arguments",
828+
)
829+
.emit();
826830
}
827831

828832
let span = lo.to(self.prev_span);
@@ -1133,7 +1137,7 @@ impl<'a> Parser<'a> {
11331137
pub(super) fn parse_lit(&mut self) -> PResult<'a, Lit> {
11341138
self.parse_opt_lit().ok_or_else(|| {
11351139
let msg = format!("unexpected token: {}", super::token_descr(&self.token));
1136-
self.span_fatal(self.token.span, &msg)
1140+
self.struct_span_err(self.token.span, &msg)
11371141
})
11381142
}
11391143

@@ -1446,9 +1450,7 @@ impl<'a> Parser<'a> {
14461450
self.struct_span_err(sp, "missing condition for `if` expression")
14471451
.span_label(sp, "expected if condition here")
14481452
.emit();
1449-
let expr = self.mk_expr_err(span);
1450-
let stmt = self.mk_stmt(span, ast::StmtKind::Expr(expr));
1451-
self.mk_block(vec![stmt], BlockCheckMode::Default, span)
1453+
self.mk_block_err(span)
14521454
}
14531455

14541456
/// Parses the condition of a `if` or `while` expression.
@@ -1915,8 +1917,7 @@ impl<'a> Parser<'a> {
19151917
return;
19161918
}
19171919

1918-
self.diagnostic()
1919-
.struct_span_err(self.token.span, "expected `:`, found `=`")
1920+
self.struct_span_err(self.token.span, "expected `:`, found `=`")
19201921
.span_suggestion(
19211922
field_name.span.shrink_to_hi().to(self.token.span),
19221923
"replace equals symbol with a colon",

src/librustc_parse/parser/item.rs

+17-24
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,7 @@ impl<'a> Parser<'a> {
306306
// possible public struct definition where `struct` was forgotten
307307
let ident = self.parse_ident().unwrap();
308308
let msg = format!("add `struct` here to parse `{}` as a public struct", ident);
309-
let mut err =
310-
self.diagnostic().struct_span_err(sp, "missing `struct` for struct definition");
309+
let mut err = self.struct_span_err(sp, "missing `struct` for struct definition");
311310
err.span_suggestion_short(
312311
sp,
313312
&msg,
@@ -335,7 +334,7 @@ impl<'a> Parser<'a> {
335334
};
336335

337336
let msg = format!("missing `{}` for {} definition", kw, kw_name);
338-
let mut err = self.diagnostic().struct_span_err(sp, &msg);
337+
let mut err = self.struct_span_err(sp, &msg);
339338
if !ambiguous {
340339
self.consume_block(token::Brace, ConsumeClosingDelim::Yes);
341340
let suggestion =
@@ -375,7 +374,7 @@ impl<'a> Parser<'a> {
375374
("fn` or `struct", "function or struct", true)
376375
};
377376
let msg = format!("missing `{}` for {} definition", kw, kw_name);
378-
let mut err = self.diagnostic().struct_span_err(sp, &msg);
377+
let mut err = self.struct_span_err(sp, &msg);
379378
if !ambiguous {
380379
err.span_suggestion_short(
381380
sp,
@@ -446,9 +445,7 @@ impl<'a> Parser<'a> {
446445
// FAILURE TO PARSE ITEM
447446
match visibility.node {
448447
VisibilityKind::Inherited => {}
449-
_ => {
450-
return Err(self.span_fatal(self.prev_span, "unmatched visibility `pub`"));
451-
}
448+
_ => return Err(self.struct_span_err(self.prev_span, "unmatched visibility `pub`")),
452449
}
453450

454451
if !attributes_allowed && !attrs.is_empty() {
@@ -466,7 +463,7 @@ impl<'a> Parser<'a> {
466463
_ => "expected item after attributes",
467464
};
468465

469-
let mut err = self.diagnostic().struct_span_err(self.prev_span, message);
466+
let mut err = self.struct_span_err(self.prev_span, message);
470467
if attrs.last().unwrap().is_doc_comment() {
471468
err.span_label(self.prev_span, "this doc comment doesn't document anything");
472469
}
@@ -536,7 +533,6 @@ impl<'a> Parser<'a> {
536533
// ^^ `sp` below will point to this
537534
let sp = prev_span.between(self.prev_span);
538535
let mut err = self
539-
.diagnostic()
540536
.struct_span_err(sp, &format!("{} for {}-item declaration", expected_kinds, item_type));
541537
err.span_label(sp, expected_kinds);
542538
err
@@ -619,7 +615,7 @@ impl<'a> Parser<'a> {
619615
// This notably includes paths passed through `ty` macro fragments (#46438).
620616
TyKind::Path(None, path) => path,
621617
_ => {
622-
self.span_err(ty_first.span, "expected a trait, found type");
618+
self.struct_span_err(ty_first.span, "expected a trait, found type").emit();
623619
err_path(ty_first.span)
624620
}
625621
};
@@ -1349,10 +1345,11 @@ impl<'a> Parser<'a> {
13491345
body
13501346
} else {
13511347
let token_str = super::token_descr(&self.token);
1352-
let mut err = self.fatal(&format!(
1348+
let msg = &format!(
13531349
"expected `where`, `{{`, `(`, or `;` after struct name, found {}",
13541350
token_str
1355-
));
1351+
);
1352+
let mut err = self.struct_span_err(self.token.span, msg);
13561353
err.span_label(self.token.span, "expected `where`, `{`, `(`, or `;` after struct name");
13571354
return Err(err);
13581355
};
@@ -1375,8 +1372,8 @@ impl<'a> Parser<'a> {
13751372
VariantData::Struct(fields, recovered)
13761373
} else {
13771374
let token_str = super::token_descr(&self.token);
1378-
let mut err = self
1379-
.fatal(&format!("expected `where` or `{{` after union name, found {}", token_str));
1375+
let msg = &format!("expected `where` or `{{` after union name, found {}", token_str);
1376+
let mut err = self.struct_span_err(self.token.span, msg);
13801377
err.span_label(self.token.span, "expected `where` or `{` after union name");
13811378
return Err(err);
13821379
};
@@ -1412,10 +1409,8 @@ impl<'a> Parser<'a> {
14121409
self.eat(&token::CloseDelim(token::Brace));
14131410
} else {
14141411
let token_str = super::token_descr(&self.token);
1415-
let mut err = self.fatal(&format!(
1416-
"expected `where`, or `{{` after struct name, found {}",
1417-
token_str
1418-
));
1412+
let msg = &format!("expected `where`, or `{{` after struct name, found {}", token_str);
1413+
let mut err = self.struct_span_err(self.token.span, msg);
14191414
err.span_label(self.token.span, "expected `where`, or `{` after struct name");
14201415
return Err(err);
14211416
}
@@ -1603,9 +1598,8 @@ impl<'a> Parser<'a> {
16031598
VisibilityKind::Inherited => {}
16041599
_ => {
16051600
let mut err = if self.token.is_keyword(sym::macro_rules) {
1606-
let mut err = self
1607-
.diagnostic()
1608-
.struct_span_err(sp, "can't qualify macro_rules invocation with `pub`");
1601+
let mut err =
1602+
self.struct_span_err(sp, "can't qualify macro_rules invocation with `pub`");
16091603
err.span_suggestion(
16101604
sp,
16111605
"try exporting the macro",
@@ -1614,9 +1608,8 @@ impl<'a> Parser<'a> {
16141608
);
16151609
err
16161610
} else {
1617-
let mut err = self
1618-
.diagnostic()
1619-
.struct_span_err(sp, "can't qualify macro invocation with `pub`");
1611+
let mut err =
1612+
self.struct_span_err(sp, "can't qualify macro invocation with `pub`");
16201613
err.help("try adjusting the macro to put `pub` inside the invocation");
16211614
err
16221615
};

src/librustc_parse/parser/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,8 @@ impl<'a> Parser<'a> {
884884
pub fn bump(&mut self) {
885885
if self.prev_token_kind == PrevTokenKind::Eof {
886886
// Bumping after EOF is a bad sign, usually an infinite loop.
887-
self.bug("attempted to bump the parser past EOF (may be stuck in a loop)");
887+
let msg = "attempted to bump the parser past EOF (may be stuck in a loop)";
888+
self.span_bug(self.token.span, msg);
888889
}
889890

890891
self.prev_span = self.meta_var_span.take().unwrap_or(self.token.span);
@@ -1056,8 +1057,7 @@ impl<'a> Parser<'a> {
10561057
_ => unreachable!(),
10571058
};
10581059
let span = self.prev_span.to(self.token.span);
1059-
self.diagnostic()
1060-
.struct_span_fatal(span, &format!("unknown macro variable `{}`", name))
1060+
self.struct_span_err(span, &format!("unknown macro variable `{}`", name))
10611061
.span_label(span, "unknown macro variable")
10621062
.emit();
10631063
self.bump();

0 commit comments

Comments
 (0)