Preserve comments in empty statements (#4180)
* Preserve comments in empty statements Closes #4018 * fixup! Preserve comments in empty statements
This commit is contained in:
parent
e70343a5f5
commit
6a7824787e
@ -52,6 +52,10 @@ impl<'a> Stmt<'a> {
|
||||
result
|
||||
}
|
||||
|
||||
pub(crate) fn is_empty(&self) -> bool {
|
||||
matches!(self.inner.kind, ast::StmtKind::Empty)
|
||||
}
|
||||
|
||||
fn is_last_expr(&self) -> bool {
|
||||
if !self.is_last {
|
||||
return false;
|
||||
|
@ -25,7 +25,7 @@ use crate::stmt::Stmt;
|
||||
use crate::syntux::session::ParseSess;
|
||||
use crate::utils::{
|
||||
self, contains_skip, count_newlines, depr_skip_annotation, format_unsafety, inner_attributes,
|
||||
last_line_width, mk_sp, ptr_vec_to_ref_vec, rewrite_ident, stmt_expr,
|
||||
last_line_width, mk_sp, ptr_vec_to_ref_vec, rewrite_ident, starts_with_newline, stmt_expr,
|
||||
};
|
||||
use crate::{ErrorKind, FormatReport, FormattingError};
|
||||
|
||||
@ -117,10 +117,22 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
|
||||
self.parse_sess.span_to_debug_info(stmt.span())
|
||||
);
|
||||
|
||||
// https://github.com/rust-lang/rust/issues/63679.
|
||||
let is_all_semicolons =
|
||||
|snippet: &str| snippet.chars().all(|c| c.is_whitespace() || c == ';');
|
||||
if is_all_semicolons(&self.snippet(stmt.span())) {
|
||||
if stmt.is_empty() {
|
||||
// If the statement is empty, just skip over it. Before that, make sure any comment
|
||||
// snippet preceding the semicolon is picked up.
|
||||
let snippet = self.snippet(mk_sp(self.last_pos, stmt.span().lo()));
|
||||
let original_starts_with_newline = snippet
|
||||
.find(|c| c != ' ')
|
||||
.map_or(false, |i| starts_with_newline(&snippet[i..]));
|
||||
let snippet = snippet.trim();
|
||||
if !snippet.is_empty() {
|
||||
if original_starts_with_newline {
|
||||
self.push_str("\n");
|
||||
}
|
||||
self.push_str(&self.block_indent.to_string(self.config));
|
||||
self.push_str(snippet);
|
||||
}
|
||||
|
||||
self.last_pos = stmt.span().hi();
|
||||
return;
|
||||
}
|
||||
|
13
tests/source/issue-4018.rs
Normal file
13
tests/source/issue-4018.rs
Normal file
@ -0,0 +1,13 @@
|
||||
fn main() {
|
||||
;
|
||||
/* extra comment */ ;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("");
|
||||
// comment 1
|
||||
// comment 2
|
||||
// comment 3
|
||||
// comment 4
|
||||
;
|
||||
}
|
11
tests/target/issue-4018.rs
Normal file
11
tests/target/issue-4018.rs
Normal file
@ -0,0 +1,11 @@
|
||||
fn main() {
|
||||
/* extra comment */
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("");
|
||||
// comment 1
|
||||
// comment 2
|
||||
// comment 3
|
||||
// comment 4
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user