Skip to content

Commit 075c599

Browse files
committed
More accurate span for unnecessary parens suggestion
1 parent ed084a9 commit 075c599

File tree

4 files changed

+12
-30
lines changed

4 files changed

+12
-30
lines changed

compiler/rustc_parse/src/errors.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -1275,12 +1275,10 @@ pub(crate) struct ParenthesesInForHead {
12751275
#[derive(Subdiagnostic)]
12761276
#[multipart_suggestion(parse_suggestion, applicability = "machine-applicable")]
12771277
pub(crate) struct ParenthesesInForHeadSugg {
1278-
#[suggestion_part(code = "{left_snippet}")]
1278+
#[suggestion_part(code = " ")]
12791279
pub left: Span,
1280-
pub left_snippet: String,
1281-
#[suggestion_part(code = "{right_snippet}")]
1280+
#[suggestion_part(code = " ")]
12821281
pub right: Span,
1283-
pub right_snippet: String,
12841282
}
12851283

12861284
#[derive(Diagnostic)]

compiler/rustc_parse/src/parser/diagnostics.rs

+5-24
Original file line numberDiff line numberDiff line change
@@ -2001,37 +2001,18 @@ impl<'a> Parser<'a> {
20012001
pub(super) fn recover_parens_around_for_head(
20022002
&mut self,
20032003
pat: P<Pat>,
2004-
begin_paren: Option<Span>,
2004+
begin_paren: Option<(Span, Span)>,
20052005
) -> P<Pat> {
20062006
match (&self.token.kind, begin_paren) {
2007-
(token::CloseDelim(Delimiter::Parenthesis), Some(begin_par_sp)) => {
2007+
(token::CloseDelim(Delimiter::Parenthesis), Some((begin_par_sp, left))) => {
2008+
let right = self.prev_token.span.between(self.look_ahead(1, |t| t.span));
20082009
self.bump();
2009-
2010-
let sm = self.sess.source_map();
2011-
let left = begin_par_sp;
2012-
let right = self.prev_token.span;
2013-
let left_snippet = if let Ok(snip) = sm.span_to_prev_source(left)
2014-
&& !snip.ends_with(' ')
2015-
{
2016-
" ".to_string()
2017-
} else {
2018-
"".to_string()
2019-
};
2020-
2021-
let right_snippet = if let Ok(snip) = sm.span_to_next_source(right)
2022-
&& !snip.starts_with(' ')
2023-
{
2024-
" ".to_string()
2025-
} else {
2026-
"".to_string()
2027-
};
2028-
20292010
self.sess.emit_err(ParenthesesInForHead {
2030-
span: vec![left, right],
2011+
span: vec![begin_par_sp, self.prev_token.span],
20312012
// With e.g. `for (x) in y)` this would replace `(x) in y)`
20322013
// with `x) in y)` which is syntactically invalid.
20332014
// However, this is prevented before we get here.
2034-
sugg: ParenthesesInForHeadSugg { left, right, left_snippet, right_snippet },
2015+
sugg: ParenthesesInForHeadSugg { left, right },
20352016
});
20362017

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

compiler/rustc_parse/src/parser/expr.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -2615,7 +2615,10 @@ impl<'a> Parser<'a> {
26152615
// This is used below for recovery in case of `for ( $stuff ) $block`
26162616
// in which case we will suggest `for $stuff $block`.
26172617
let begin_paren = match self.token.kind {
2618-
token::OpenDelim(Delimiter::Parenthesis) => Some(self.token.span),
2618+
token::OpenDelim(Delimiter::Parenthesis) => Some((
2619+
self.token.span,
2620+
self.prev_token.span.between(self.look_ahead(1, |t| t.span)),
2621+
)),
26192622
_ => None,
26202623
};
26212624

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

+1-1
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)