Skip to content

Commit cb93e9c

Browse files
committed
Compute indent never relative to current column
Previously the pretty printer would compute indentation always relative to whatever column a block begins at, like this: fn demo(arg1: usize, arg2: usize); This is never the thing to do in the dominant contemporary Rust style. Rustfmt's default and the style used by the vast majority of Rust codebases is block indentation: fn demo( arg1: usize, arg2: usize, ); where every indentation level is a multiple of 4 spaces and each level is indented relative to the indentation of the previous line, not the position that the block starts in.
1 parent e58e7b1 commit cb93e9c

File tree

2 files changed

+22
-19
lines changed

2 files changed

+22
-19
lines changed

compiler/rustc_ast_pretty/src/pp.rs

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ impl Token {
178178
#[derive(Copy, Clone)]
179179
enum PrintFrame {
180180
Fits,
181-
Broken { offset: isize, breaks: Breaks },
181+
Broken { indent: usize, breaks: Breaks },
182182
}
183183

184184
const SIZE_INFINITY: isize = 0xffff;
@@ -204,6 +204,8 @@ pub struct Printer {
204204
scan_stack: VecDeque<usize>,
205205
/// Stack of blocks-in-progress being flushed by print
206206
print_stack: Vec<PrintFrame>,
207+
/// Level of indentation of current line
208+
indent: usize,
207209
/// Buffered indentation to avoid writing trailing whitespace
208210
pending_indentation: isize,
209211
/// The token most recently popped from the left boundary of the
@@ -229,6 +231,7 @@ impl Printer {
229231
right_total: 0,
230232
scan_stack: VecDeque::new(),
231233
print_stack: Vec::new(),
234+
indent: 0,
232235
pending_indentation: 0,
233236
last_printed: None,
234237
}
@@ -368,38 +371,38 @@ impl Printer {
368371
*self
369372
.print_stack
370373
.last()
371-
.unwrap_or(&PrintFrame::Broken { offset: 0, breaks: Breaks::Inconsistent })
374+
.unwrap_or(&PrintFrame::Broken { indent: 0, breaks: Breaks::Inconsistent })
372375
}
373376

374377
fn print_begin(&mut self, token: BeginToken, size: isize) {
375378
if size > self.space {
376-
let col = self.margin - self.space + token.offset;
377-
self.print_stack.push(PrintFrame::Broken { offset: col, breaks: token.breaks });
379+
self.print_stack.push(PrintFrame::Broken { indent: self.indent, breaks: token.breaks });
380+
self.indent = (self.indent as isize + token.offset) as usize;
378381
} else {
379382
self.print_stack.push(PrintFrame::Fits);
380383
}
381384
}
382385

383386
fn print_end(&mut self) {
384-
self.print_stack.pop().unwrap();
387+
if let PrintFrame::Broken { indent, .. } = self.print_stack.pop().unwrap() {
388+
self.indent = indent;
389+
}
385390
}
386391

387392
fn print_break(&mut self, token: BreakToken, size: isize) {
388-
let break_offset =
389-
match self.get_top() {
390-
PrintFrame::Fits => None,
391-
PrintFrame::Broken { offset, breaks: Breaks::Consistent } => Some(offset),
392-
PrintFrame::Broken { offset, breaks: Breaks::Inconsistent } => {
393-
if size > self.space { Some(offset) } else { None }
394-
}
395-
};
396-
if let Some(offset) = break_offset {
397-
self.out.push('\n');
398-
self.pending_indentation = offset + token.offset;
399-
self.space = self.margin - (offset + token.offset);
400-
} else {
393+
let fits = match self.get_top() {
394+
PrintFrame::Fits => true,
395+
PrintFrame::Broken { breaks: Breaks::Consistent, .. } => false,
396+
PrintFrame::Broken { breaks: Breaks::Inconsistent, .. } => size <= self.space,
397+
};
398+
if fits {
401399
self.pending_indentation += token.blank_space;
402400
self.space -= token.blank_space;
401+
} else {
402+
self.out.push('\n');
403+
let indent = self.indent as isize + token.offset;
404+
self.pending_indentation = indent;
405+
self.space = self.margin - indent;
403406
}
404407
}
405408

compiler/rustc_ast_pretty/src/pprust/state.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
655655
// Outer-box is consistent.
656656
self.cbox(INDENT_UNIT);
657657
// Head-box is inconsistent.
658-
self.ibox(w.len() + 1);
658+
self.ibox(0);
659659
// Keyword that starts the head.
660660
if !w.is_empty() {
661661
self.word_nbsp(w);

0 commit comments

Comments
 (0)