Skip to content

Commit

Permalink
Fix removed box_syntax diagnostic if source isn't available
Browse files Browse the repository at this point in the history
  • Loading branch information
clubby789 committed Aug 1, 2024
1 parent 97ac52f commit e157954
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 17 deletions.
2 changes: 1 addition & 1 deletion compiler/rustc_parse/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
23 changes: 16 additions & 7 deletions compiler/rustc_parse/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2725,15 +2725,24 @@ impl HelpUseLatestEdition {

#[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)]
Expand Down
10 changes: 6 additions & 4 deletions compiler/rustc_parse/src/parser/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -618,10 +618,12 @@ impl<'a> Parser<'a> {
/// 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)))
}

Expand Down
10 changes: 5 additions & 5 deletions tests/ui/parser/removed-syntax/removed-syntax-box.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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

0 comments on commit e157954

Please sign in to comment.