Fix removed box_syntax diagnostic if source isn't available

This commit is contained in:
clubby789 2024-08-01 13:11:24 +00:00
parent 97ac52f579
commit e157954cce
4 changed files with 28 additions and 17 deletions

View File

@ -66,7 +66,7 @@ parse_box_not_pat = expected pattern, found {$descr}
.suggestion = escape `box` to use it as an identifier
parse_box_syntax_removed = `box_syntax` has been removed
.suggestion = use `Box::new()` instead
parse_box_syntax_removed_suggestion = use `Box::new()` instead
parse_cannot_be_raw_ident = `{$ident}` cannot be a raw identifier

View File

@ -2725,15 +2725,24 @@ pub fn new() -> Self {
#[derive(Diagnostic)]
#[diag(parse_box_syntax_removed)]
pub struct BoxSyntaxRemoved<'a> {
pub struct BoxSyntaxRemoved {
#[primary_span]
#[suggestion(
code = "Box::new({code})",
applicability = "machine-applicable",
style = "verbose"
)]
pub span: Span,
pub code: &'a str,
#[subdiagnostic]
pub sugg: AddBoxNew,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(
parse_box_syntax_removed_suggestion,
applicability = "machine-applicable",
style = "verbose"
)]
pub struct AddBoxNew {
#[suggestion_part(code = "Box::new(")]
pub box_kw_and_lo: Span,
#[suggestion_part(code = ")")]
pub hi: Span,
}
#[derive(Diagnostic)]

View File

@ -618,10 +618,12 @@ fn recover_tilde_expr(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> {
/// Parse `box expr` - this syntax has been removed, but we still parse this
/// for now to provide a more useful error
fn parse_expr_box(&mut self, box_kw: Span) -> PResult<'a, (Span, ExprKind)> {
let (span, _) = self.parse_expr_prefix_common(box_kw)?;
let inner_span = span.with_lo(box_kw.hi());
let code = self.psess.source_map().span_to_snippet(inner_span).unwrap();
let guar = self.dcx().emit_err(errors::BoxSyntaxRemoved { span: span, code: code.trim() });
let (span, expr) = self.parse_expr_prefix_common(box_kw)?;
// Make a multipart suggestion instead of `span_to_snippet` in case source isn't available
let box_kw_and_lo = box_kw.until(self.interpolated_or_expr_span(&expr));
let hi = span.shrink_to_hi();
let sugg = errors::AddBoxNew { box_kw_and_lo, hi };
let guar = self.dcx().emit_err(errors::BoxSyntaxRemoved { span, sugg });
Ok((span, ExprKind::Err(guar)))
}

View File

@ -7,7 +7,7 @@ LL | let _ = box ();
help: use `Box::new()` instead
|
LL | let _ = Box::new(());
| ~~~~~~~~~~~~
| ~~~~~~~~~ +
error: `box_syntax` has been removed
--> $DIR/removed-syntax-box.rs:10:13
@ -18,7 +18,7 @@ LL | let _ = box 1;
help: use `Box::new()` instead
|
LL | let _ = Box::new(1);
| ~~~~~~~~~~~
| ~~~~~~~~~ +
error: `box_syntax` has been removed
--> $DIR/removed-syntax-box.rs:11:13
@ -29,7 +29,7 @@ LL | let _ = box T { a: 12, b: 18 };
help: use `Box::new()` instead
|
LL | let _ = Box::new(T { a: 12, b: 18 });
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| ~~~~~~~~~ +
error: `box_syntax` has been removed
--> $DIR/removed-syntax-box.rs:12:13
@ -40,7 +40,7 @@ LL | let _ = box [5; 30];
help: use `Box::new()` instead
|
LL | let _ = Box::new([5; 30]);
| ~~~~~~~~~~~~~~~~~
| ~~~~~~~~~ +
error: `box_syntax` has been removed
--> $DIR/removed-syntax-box.rs:13:22
@ -51,7 +51,7 @@ LL | let _: Box<()> = box ();
help: use `Box::new()` instead
|
LL | let _: Box<()> = Box::new(());
| ~~~~~~~~~~~~
| ~~~~~~~~~ +
error: aborting due to 5 previous errors