Skip to content

Commit 72762fe

Browse files
committed
More accurate span for unnecessary parens suggestion
1 parent 622bd1d commit 72762fe

File tree

4 files changed

+12
-30
lines changed

4 files changed

+12
-30
lines changed

compiler/rustc_parse/src/errors.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,12 +1241,10 @@ pub(crate) struct ParenthesesInForHead {
12411241
#[derive(Subdiagnostic)]
12421242
#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
12431243
pub(crate) struct ParenthesesInForHeadSugg {
1244-
#[suggestion_part(code = "{left_snippet}")]
1244+
#[suggestion_part(code = " ")]
12451245
pub left: Span,
1246-
pub left_snippet: String,
1247-
#[suggestion_part(code = "{right_snippet}")]
1246+
#[suggestion_part(code = " ")]
12481247
pub right: Span,
1249-
pub right_snippet: String,
12501248
}
12511249

12521250
#[derive(Diagnostic)]

compiler/rustc_parse/src/parser/diagnostics.rs

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1904,37 +1904,18 @@ impl<'a> Parser<'a> {
19041904
pub(super) fn recover_parens_around_for_head(
19051905
&mut self,
19061906
pat: P<Pat>,
1907-
begin_paren: Option<Span>,
1907+
begin_paren: Option<(Span, Span)>,
19081908
) -> P<Pat> {
19091909
match (&self.token.kind, begin_paren) {
1910-
(token::CloseDelim(Delimiter::Parenthesis), Some(begin_par_sp)) => {
1910+
(token::CloseDelim(Delimiter::Parenthesis), Some((begin_par_sp, left))) => {
1911+
let right = self.prev_token.span.between(self.look_ahead(1, |t| t.span));
19111912
self.bump();
1912-
1913-
let sm = self.sess.source_map();
1914-
let left = begin_par_sp;
1915-
let right = self.prev_token.span;
1916-
let left_snippet = if let Ok(snip) = sm.span_to_prev_source(left)
1917-
&& !snip.ends_with(' ')
1918-
{
1919-
" ".to_string()
1920-
} else {
1921-
"".to_string()
1922-
};
1923-
1924-
let right_snippet = if let Ok(snip) = sm.span_to_next_source(right)
1925-
&& !snip.starts_with(' ')
1926-
{
1927-
" ".to_string()
1928-
} else {
1929-
"".to_string()
1930-
};
1931-
19321913
self.sess.emit_err(ParenthesesInForHead {
1933-
span: vec![left, right],
1914+
span: vec![begin_par_sp, self.prev_token.span],
19341915
// With e.g. `for (x) in y)` this would replace `(x) in y)`
19351916
// with `x) in y)` which is syntactically invalid.
19361917
// However, this is prevented before we get here.
1937-
sugg: ParenthesesInForHeadSugg { left, right, left_snippet, right_snippet },
1918+
sugg: ParenthesesInForHeadSugg { left, right },
19381919
});
19391920

19401921
// Unwrap `(pat)` into `pat` to avoid the `unused_parens` lint.

compiler/rustc_parse/src/parser/expr.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2612,7 +2612,10 @@ impl<'a> Parser<'a> {
26122612
// This is used below for recovery in case of `for ( $stuff ) $block`
26132613
// in which case we will suggest `for $stuff $block`.
26142614
let begin_paren = match self.token.kind {
2615-
token::OpenDelim(Delimiter::Parenthesis) => Some(self.token.span),
2615+
token::OpenDelim(Delimiter::Parenthesis) => Some((
2616+
self.token.span,
2617+
self.prev_token.span.between(self.look_ahead(1, |t| t.span)),
2618+
)),
26162619
_ => None,
26172620
};
26182621

tests/ui/parser/recover/recover-for-loop-parens-around-head.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ LL | for ( elem in vec ) {
1313
help: remove parentheses in `for` loop
1414
|
1515
LL - for ( elem in vec ) {
16-
LL + for elem in vec {
16+
LL + for elem in vec {
1717
|
1818

1919
error[E0308]: mismatched types

0 commit comments

Comments
 (0)