Restore a visual alignment mode for block comments

This commit is contained in:
David Tolnay 2022-01-21 01:26:00 -08:00
parent 402f322940
commit 125c729e05
No known key found for this signature in database
GPG key ID: F9BA143B95FF6D82
3 changed files with 33 additions and 7 deletions

View file

@ -146,6 +146,22 @@ pub enum Breaks {
Inconsistent, Inconsistent,
} }
#[derive(Clone, Copy)]
enum IndentStyle {
/// Vertically aligned under whatever column this block begins at.
///
/// fn demo(arg1: usize,
/// arg2: usize);
Visual,
/// Indented relative to the indentation level of the previous line.
///
/// fn demo(
/// arg1: usize,
/// arg2: usize,
/// );
Block { offset: isize },
}
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
pub struct BreakToken { pub struct BreakToken {
offset: isize, offset: isize,
@ -154,7 +170,7 @@ pub struct BreakToken {
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
pub struct BeginToken { pub struct BeginToken {
offset: isize, indent: IndentStyle,
breaks: Breaks, breaks: Breaks,
} }
@ -377,7 +393,10 @@ impl Printer {
fn print_begin(&mut self, token: BeginToken, size: isize) { fn print_begin(&mut self, token: BeginToken, size: isize) {
if size > self.space { if size > self.space {
self.print_stack.push(PrintFrame::Broken { indent: self.indent, breaks: token.breaks }); self.print_stack.push(PrintFrame::Broken { indent: self.indent, breaks: token.breaks });
self.indent = (self.indent as isize + token.offset) as usize; self.indent = match token.indent {
IndentStyle::Block { offset } => (self.indent as isize + offset) as usize,
IndentStyle::Visual => (self.margin - self.space) as usize,
};
} else { } else {
self.print_stack.push(PrintFrame::Fits); self.print_stack.push(PrintFrame::Fits);
} }
@ -425,7 +444,10 @@ impl Printer {
/// "raw box" /// "raw box"
pub fn rbox(&mut self, indent: usize, breaks: Breaks) { pub fn rbox(&mut self, indent: usize, breaks: Breaks) {
self.scan_begin(BeginToken { offset: indent as isize, breaks }) self.scan_begin(BeginToken {
indent: IndentStyle::Block { offset: indent as isize },
breaks,
})
} }
/// Inconsistent breaking box /// Inconsistent breaking box
@ -438,6 +460,10 @@ impl Printer {
self.rbox(indent, Breaks::Consistent) self.rbox(indent, Breaks::Consistent)
} }
pub fn visual_align(&mut self) {
self.scan_begin(BeginToken { indent: IndentStyle::Visual, breaks: Breaks::Consistent });
}
pub fn break_offset(&mut self, n: usize, off: isize) { pub fn break_offset(&mut self, n: usize, off: isize) {
self.scan_break(BreakToken { offset: off, blank_space: n as isize }) self.scan_break(BreakToken { offset: off, blank_space: n as isize })
} }

View file

@ -315,7 +315,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
self.word(cmnt.lines[0].clone()); self.word(cmnt.lines[0].clone());
self.hardbreak() self.hardbreak()
} else { } else {
self.ibox(0); self.visual_align();
for line in &cmnt.lines { for line in &cmnt.lines {
if !line.is_empty() { if !line.is_empty() {
self.word(line.clone()); self.word(line.clone());

View file

@ -2,7 +2,7 @@
// pp-exact // pp-exact
fn f() {} /* fn f() {} /*
The next line should not be indented. The next line should not be indented.
That one. It shouldn't have been indented. That one. It shouldn't have been indented.
*/ */