Skip to content

Commit

Permalink
fix parentheses surrounding spacing issue in parser
Browse files Browse the repository at this point in the history
  • Loading branch information
chenyukang committed Oct 24, 2022
1 parent c0447b4 commit a46af18
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 16 deletions.
6 changes: 2 additions & 4 deletions compiler/rustc_lint/src/unused.rs
Original file line number Diff line number Diff line change
Expand Up @@ -568,17 +568,15 @@ trait UnusedDelimLint {
let sm = cx.sess().source_map();
let lo_replace =
if keep_space.0 &&
let Ok(snip) = sm.span_to_snippet(lo.with_lo(lo.lo() - BytePos(1))) &&
!snip.starts_with(" ") {
let Ok(snip) = sm.span_to_prev_source(lo) && !snip.ends_with(" ") {
" ".to_string()
} else {
"".to_string()
};

let hi_replace =
if keep_space.1 &&
let Ok(snip) = sm.span_to_snippet(sm.next_point(hi)) &&
!snip.starts_with(" ") {
let Ok(snip) = sm.span_to_next_source(hi) && !snip.starts_with(" ") {
" ".to_string()
} else {
"".to_string()
Expand Down
6 changes: 4 additions & 2 deletions compiler/rustc_parse/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1122,10 +1122,12 @@ pub(crate) struct ParenthesesInForHead {
#[derive(Subdiagnostic)]
#[multipart_suggestion(suggestion, applicability = "machine-applicable")]
pub(crate) struct ParenthesesInForHeadSugg {
#[suggestion_part(code = "")]
#[suggestion_part(code = "{left_snippet}")]
pub left: Span,
#[suggestion_part(code = "")]
pub left_snippet: String,
#[suggestion_part(code = "{right_snippet}")]
pub right: Span,
pub right_snippet: String,
}

#[derive(Diagnostic)]
Expand Down
24 changes: 19 additions & 5 deletions compiler/rustc_parse/src/parser/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1641,15 +1641,29 @@ impl<'a> Parser<'a> {
(token::CloseDelim(Delimiter::Parenthesis), Some(begin_par_sp)) => {
self.bump();

let sm = self.sess.source_map();
let left = begin_par_sp;
let right = self.prev_token.span;
let left_snippet = if let Ok(snip) = sm.span_to_prev_source(left) &&
!snip.ends_with(" ") {
" ".to_string()
} else {
"".to_string()
};

let right_snippet = if let Ok(snip) = sm.span_to_next_source(right) &&
!snip.starts_with(" ") {
" ".to_string()
} else {
"".to_string()
};

self.sess.emit_err(ParenthesesInForHead {
span: vec![begin_par_sp, self.prev_token.span],
span: vec![left, right],
// With e.g. `for (x) in y)` this would replace `(x) in y)`
// with `x) in y)` which is syntactically invalid.
// However, this is prevented before we get here.
sugg: ParenthesesInForHeadSugg {
left: begin_par_sp,
right: self.prev_token.span,
},
sugg: ParenthesesInForHeadSugg { left, right, left_snippet, right_snippet },
});

// Unwrap `(pat)` into `pat` to avoid the `unused_parens` lint.
Expand Down
6 changes: 4 additions & 2 deletions src/test/ui/lint/issue-103435-extra-parentheses.fixed
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ fn main() {
if 2 == 1 {}
//~^ ERROR unnecessary parentheses around `if` condition

// FIXME, auto recover from this one?
// for(_x in 1..10) {}
// reported by parser
for _x in 1..10 {}
//~^ ERROR expected one of
//~| ERROR unexpected parentheses surrounding
}
6 changes: 4 additions & 2 deletions src/test/ui/lint/issue-103435-extra-parentheses.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ fn main() {
if(2 == 1){}
//~^ ERROR unnecessary parentheses around `if` condition

// FIXME, auto recover from this one?
// for(_x in 1..10) {}
// reported by parser
for(_x in 1..10){}
//~^ ERROR expected one of
//~| ERROR unexpected parentheses surrounding
}
20 changes: 19 additions & 1 deletion src/test/ui/lint/issue-103435-extra-parentheses.stderr
Original file line number Diff line number Diff line change
@@ -1,3 +1,21 @@
error: expected one of `)`, `,`, `@`, or `|`, found keyword `in`
--> $DIR/issue-103435-extra-parentheses.rs:15:12
|
LL | for(_x in 1..10){}
| ^^ expected one of `)`, `,`, `@`, or `|`

error: unexpected parentheses surrounding `for` loop head
--> $DIR/issue-103435-extra-parentheses.rs:15:8
|
LL | for(_x in 1..10){}
| ^ ^
|
help: remove parentheses in `for` loop
|
LL - for(_x in 1..10){}
LL + for _x in 1..10 {}
|

error: unnecessary parentheses around pattern
--> $DIR/issue-103435-extra-parentheses.rs:5:11
|
Expand Down Expand Up @@ -39,5 +57,5 @@ LL - if(2 == 1){}
LL + if 2 == 1 {}
|

error: aborting due to 3 previous errors
error: aborting due to 5 previous errors

0 comments on commit a46af18

Please sign in to comment.