fix parentheses surrounding spacing issue in parser
This commit is contained in:
parent
c0447b489b
commit
a46af18cb1
6 changed files with 52 additions and 16 deletions
|
@ -568,8 +568,7 @@ trait UnusedDelimLint {
|
||||||
let sm = cx.sess().source_map();
|
let sm = cx.sess().source_map();
|
||||||
let lo_replace =
|
let lo_replace =
|
||||||
if keep_space.0 &&
|
if keep_space.0 &&
|
||||||
let Ok(snip) = sm.span_to_snippet(lo.with_lo(lo.lo() - BytePos(1))) &&
|
let Ok(snip) = sm.span_to_prev_source(lo) && !snip.ends_with(" ") {
|
||||||
!snip.starts_with(" ") {
|
|
||||||
" ".to_string()
|
" ".to_string()
|
||||||
} else {
|
} else {
|
||||||
"".to_string()
|
"".to_string()
|
||||||
|
@ -577,8 +576,7 @@ trait UnusedDelimLint {
|
||||||
|
|
||||||
let hi_replace =
|
let hi_replace =
|
||||||
if keep_space.1 &&
|
if keep_space.1 &&
|
||||||
let Ok(snip) = sm.span_to_snippet(sm.next_point(hi)) &&
|
let Ok(snip) = sm.span_to_next_source(hi) && !snip.starts_with(" ") {
|
||||||
!snip.starts_with(" ") {
|
|
||||||
" ".to_string()
|
" ".to_string()
|
||||||
} else {
|
} else {
|
||||||
"".to_string()
|
"".to_string()
|
||||||
|
|
|
@ -1122,10 +1122,12 @@ pub(crate) struct ParenthesesInForHead {
|
||||||
#[derive(Subdiagnostic)]
|
#[derive(Subdiagnostic)]
|
||||||
#[multipart_suggestion(suggestion, applicability = "machine-applicable")]
|
#[multipart_suggestion(suggestion, applicability = "machine-applicable")]
|
||||||
pub(crate) struct ParenthesesInForHeadSugg {
|
pub(crate) struct ParenthesesInForHeadSugg {
|
||||||
#[suggestion_part(code = "")]
|
#[suggestion_part(code = "{left_snippet}")]
|
||||||
pub left: Span,
|
pub left: Span,
|
||||||
#[suggestion_part(code = "")]
|
pub left_snippet: String,
|
||||||
|
#[suggestion_part(code = "{right_snippet}")]
|
||||||
pub right: Span,
|
pub right: Span,
|
||||||
|
pub right_snippet: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
|
|
|
@ -1641,15 +1641,29 @@ impl<'a> Parser<'a> {
|
||||||
(token::CloseDelim(Delimiter::Parenthesis), Some(begin_par_sp)) => {
|
(token::CloseDelim(Delimiter::Parenthesis), Some(begin_par_sp)) => {
|
||||||
self.bump();
|
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 {
|
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 e.g. `for (x) in y)` this would replace `(x) in y)`
|
||||||
// with `x) in y)` which is syntactically invalid.
|
// with `x) in y)` which is syntactically invalid.
|
||||||
// However, this is prevented before we get here.
|
// However, this is prevented before we get here.
|
||||||
sugg: ParenthesesInForHeadSugg {
|
sugg: ParenthesesInForHeadSugg { left, right, left_snippet, right_snippet },
|
||||||
left: begin_par_sp,
|
|
||||||
right: self.prev_token.span,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Unwrap `(pat)` into `pat` to avoid the `unused_parens` lint.
|
// Unwrap `(pat)` into `pat` to avoid the `unused_parens` lint.
|
||||||
|
|
|
@ -11,6 +11,8 @@ fn main() {
|
||||||
if 2 == 1 {}
|
if 2 == 1 {}
|
||||||
//~^ ERROR unnecessary parentheses around `if` condition
|
//~^ ERROR unnecessary parentheses around `if` condition
|
||||||
|
|
||||||
// FIXME, auto recover from this one?
|
// reported by parser
|
||||||
// for(_x in 1..10) {}
|
for _x in 1..10 {}
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
//~| ERROR unexpected parentheses surrounding
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,8 @@ fn main() {
|
||||||
if(2 == 1){}
|
if(2 == 1){}
|
||||||
//~^ ERROR unnecessary parentheses around `if` condition
|
//~^ ERROR unnecessary parentheses around `if` condition
|
||||||
|
|
||||||
// FIXME, auto recover from this one?
|
// reported by parser
|
||||||
// for(_x in 1..10) {}
|
for(_x in 1..10){}
|
||||||
|
//~^ ERROR expected one of
|
||||||
|
//~| ERROR unexpected parentheses surrounding
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
error: unnecessary parentheses around pattern
|
||||||
--> $DIR/issue-103435-extra-parentheses.rs:5:11
|
--> $DIR/issue-103435-extra-parentheses.rs:5:11
|
||||||
|
|
|
|
||||||
|
@ -39,5 +57,5 @@ LL - if(2 == 1){}
|
||||||
LL + if 2 == 1 {}
|
LL + if 2 == 1 {}
|
||||||
|
|
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 5 previous errors
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue