Skip to content

Commit 3ad8a91

Browse files
committed
More accurate span for unnecessary parens suggestion
1 parent f0e39bd commit 3ad8a91

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
@@ -1902,37 +1902,18 @@ impl<'a> Parser<'a> {
19021902
pub(super) fn recover_parens_around_for_head(
19031903
&mut self,
19041904
pat: P<Pat>,
1905-
begin_paren: Option<Span>,
1905+
begin_paren: Option<(Span, Span)>,
19061906
) -> P<Pat> {
19071907
match (&self.token.kind, begin_paren) {
1908-
(token::CloseDelim(Delimiter::Parenthesis), Some(begin_par_sp)) => {
1908+
(token::CloseDelim(Delimiter::Parenthesis), Some((begin_par_sp, left))) => {
1909+
let right = self.prev_token.span.between(self.look_ahead(1, |t| t.span));
19091910
self.bump();
1910-
1911-
let sm = self.sess.source_map();
1912-
let left = begin_par_sp;
1913-
let right = self.prev_token.span;
1914-
let left_snippet = if let Ok(snip) = sm.span_to_prev_source(left)
1915-
&& !snip.ends_with(' ')
1916-
{
1917-
" ".to_string()
1918-
} else {
1919-
"".to_string()
1920-
};
1921-
1922-
let right_snippet = if let Ok(snip) = sm.span_to_next_source(right)
1923-
&& !snip.starts_with(' ')
1924-
{
1925-
" ".to_string()
1926-
} else {
1927-
"".to_string()
1928-
};
1929-
19301911
self.sess.emit_err(ParenthesesInForHead {
1931-
span: vec![left, right],
1912+
span: vec![begin_par_sp, self.prev_token.span],
19321913
// With e.g. `for (x) in y)` this would replace `(x) in y)`
19331914
// with `x) in y)` which is syntactically invalid.
19341915
// However, this is prevented before we get here.
1935-
sugg: ParenthesesInForHeadSugg { left, right, left_snippet, right_snippet },
1916+
sugg: ParenthesesInForHeadSugg { left, right },
19361917
});
19371918

19381919
// 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
@@ -2596,7 +2596,10 @@ impl<'a> Parser<'a> {
25962596
// This is used below for recovery in case of `for ( $stuff ) $block`
25972597
// in which case we will suggest `for $stuff $block`.
25982598
let begin_paren = match self.token.kind {
2599-
token::OpenDelim(Delimiter::Parenthesis) => Some(self.token.span),
2599+
token::OpenDelim(Delimiter::Parenthesis) => Some((
2600+
self.token.span,
2601+
self.prev_token.span.between(self.look_ahead(1, |t| t.span)),
2602+
)),
26002603
_ => None,
26012604
};
26022605

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)