Eliminate offset number from Fits frames
PrintStackElems with pbreak=PrintStackBreak::Fits always carried a meaningless value offset=0. We can combine the two types PrintStackElem + PrintStackBreak into one PrintFrame enum that stores offset only for Broken frames.
This commit is contained in:
parent
65dd67096e
commit
9e794d7de3
@ -176,15 +176,9 @@ pub fn is_hardbreak_tok(&self) -> bool {
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
enum PrintStackBreak {
|
||||
enum PrintFrame {
|
||||
Fits,
|
||||
Broken(Breaks),
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
struct PrintStackElem {
|
||||
offset: isize,
|
||||
pbreak: PrintStackBreak,
|
||||
Broken { offset: isize, breaks: Breaks },
|
||||
}
|
||||
|
||||
const SIZE_INFINITY: isize = 0xffff;
|
||||
@ -209,7 +203,7 @@ pub struct Printer {
|
||||
/// advancing.
|
||||
scan_stack: VecDeque<usize>,
|
||||
/// Stack of blocks-in-progress being flushed by print
|
||||
print_stack: Vec<PrintStackElem>,
|
||||
print_stack: Vec<PrintFrame>,
|
||||
/// Buffered indentation to avoid writing trailing whitespace
|
||||
pending_indentation: isize,
|
||||
/// The token most recently popped from the left boundary of the
|
||||
@ -380,21 +374,19 @@ fn indent(&mut self, amount: isize) {
|
||||
self.pending_indentation += amount;
|
||||
}
|
||||
|
||||
fn get_top(&self) -> PrintStackElem {
|
||||
*self.print_stack.last().unwrap_or({
|
||||
&PrintStackElem { offset: 0, pbreak: PrintStackBreak::Broken(Breaks::Inconsistent) }
|
||||
})
|
||||
fn get_top(&self) -> PrintFrame {
|
||||
*self
|
||||
.print_stack
|
||||
.last()
|
||||
.unwrap_or(&PrintFrame::Broken { offset: 0, breaks: Breaks::Inconsistent })
|
||||
}
|
||||
|
||||
fn print_begin(&mut self, token: BeginToken, size: isize) {
|
||||
if size > self.space {
|
||||
let col = self.margin - self.space + token.offset;
|
||||
self.print_stack.push(PrintStackElem {
|
||||
offset: col,
|
||||
pbreak: PrintStackBreak::Broken(token.breaks),
|
||||
});
|
||||
self.print_stack.push(PrintFrame::Broken { offset: col, breaks: token.breaks });
|
||||
} else {
|
||||
self.print_stack.push(PrintStackElem { offset: 0, pbreak: PrintStackBreak::Fits });
|
||||
self.print_stack.push(PrintFrame::Fits);
|
||||
}
|
||||
}
|
||||
|
||||
@ -403,20 +395,19 @@ fn print_end(&mut self) {
|
||||
}
|
||||
|
||||
fn print_break(&mut self, token: BreakToken, size: isize) {
|
||||
let top = self.get_top();
|
||||
match top.pbreak {
|
||||
PrintStackBreak::Fits => {
|
||||
self.space -= token.blank_space;
|
||||
match self.get_top() {
|
||||
PrintFrame::Fits => {
|
||||
self.indent(token.blank_space);
|
||||
self.space -= token.blank_space;
|
||||
}
|
||||
PrintStackBreak::Broken(Breaks::Consistent) => {
|
||||
self.print_newline(top.offset + token.offset);
|
||||
self.space = self.margin - (top.offset + token.offset);
|
||||
PrintFrame::Broken { offset, breaks: Breaks::Consistent } => {
|
||||
self.print_newline(offset + token.offset);
|
||||
self.space = self.margin - (offset + token.offset);
|
||||
}
|
||||
PrintStackBreak::Broken(Breaks::Inconsistent) => {
|
||||
PrintFrame::Broken { offset, breaks: Breaks::Inconsistent } => {
|
||||
if size > self.space {
|
||||
self.print_newline(top.offset + token.offset);
|
||||
self.space = self.margin - (top.offset + token.offset);
|
||||
self.print_newline(offset + token.offset);
|
||||
self.space = self.margin - (offset + token.offset);
|
||||
} else {
|
||||
self.indent(token.blank_space);
|
||||
self.space -= token.blank_space;
|
||||
|
Loading…
Reference in New Issue
Block a user