summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Poveda <git@pvdrz.com>2022-05-31 11:45:44 -0500
committerChristian Poveda <git@pvdrz.com>2022-05-31 11:45:44 -0500
commit29ed9a56e3b5538f52f45723933fd769e9411d58 (patch)
treeece7817958321337611881b97fdbf75593787c1b
parentbd4d1cd7a2edd98a92b85997812e70aee5e740c7 (diff)
downloadrust-29ed9a56e3b5538f52f45723933fd769e9411d58.tar.gz
migrate `maybe_consume_incorrect_semicolon` diagnostic
-rw-r--r--compiler/rustc_error_messages/locales/en-US/parser.ftl5
-rw-r--r--compiler/rustc_parse/src/parser/diagnostics.rs27
2 files changed, 23 insertions, 9 deletions
diff --git a/compiler/rustc_error_messages/locales/en-US/parser.ftl b/compiler/rustc_error_messages/locales/en-US/parser.ftl
index 985173277e1..90124b64f3c 100644
--- a/compiler/rustc_error_messages/locales/en-US/parser.ftl
+++ b/compiler/rustc_error_messages/locales/en-US/parser.ftl
@@ -18,3 +18,8 @@ parser-expect-path = expected a path
parser-maybe-recover-from-bad-qpath-stage-2 =
missing angle brackets in associated item path
.suggestion = try: `{$ty}`
+
+parser-incorrect-semicolon =
+ expected item, found `;`
+ .suggestion = remove this semicolon
+ .help = {$name} declarations are not followed by a semicolon
diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs
index f57338ae4dd..9bfd4098968 100644
--- a/compiler/rustc_parse/src/parser/diagnostics.rs
+++ b/compiler/rustc_parse/src/parser/diagnostics.rs
@@ -295,6 +295,17 @@ struct BadQPathStage2 {
ty: String,
}
+#[derive(SessionDiagnostic)]
+#[error(slug = "parser-incorrect-semicolon")]
+struct IncorrectSemicolon<'a> {
+ #[primary_span]
+ #[suggestion(applicability = "machine-applicable")]
+ span: Span,
+ #[help]
+ opt_help: Option<()>,
+ name: &'a str,
+}
+
// SnapshotParser is used to create a snapshot of the parser
// without causing duplicate errors being emitted when the `Parser`
// is dropped.
@@ -1490,13 +1501,10 @@ impl<'a> Parser<'a> {
pub fn maybe_consume_incorrect_semicolon(&mut self, items: &[P<Item>]) -> bool {
if self.token.kind == TokenKind::Semi {
self.bump();
- let mut err = self.struct_span_err(self.prev_token.span, "expected item, found `;`");
- err.span_suggestion_short(
- self.prev_token.span,
- "remove this semicolon",
- String::new(),
- Applicability::MachineApplicable,
- );
+
+ let mut err =
+ IncorrectSemicolon { span: self.prev_token.span, opt_help: None, name: "" };
+
if !items.is_empty() {
let previous_item = &items[items.len() - 1];
let previous_item_kind_name = match previous_item.kind {
@@ -1509,10 +1517,11 @@ impl<'a> Parser<'a> {
_ => None,
};
if let Some(name) = previous_item_kind_name {
- err.help(&format!("{name} declarations are not followed by a semicolon"));
+ err.opt_help = Some(());
+ err.name = name;
}
}
- err.emit();
+ self.sess.emit_err(err);
true
} else {
false