Define a separate source dimension that's explicitly the maximum line in the file

pull/889/head
Wilfred Hughes 2025-10-04 14:26:45 +07:00
parent 3e8324913f
commit 6ffa3613cc
1 changed files with 30 additions and 5 deletions

@ -180,6 +180,8 @@ struct SourceDimensions {
/// The highest line number in the RHS source that we will
/// display.
rhs_max_line: LineNumber,
lhs_max_line_in_file: LineNumber,
rhs_max_line_in_file: LineNumber,
}
impl SourceDimensions {
@ -187,6 +189,8 @@ impl SourceDimensions {
terminal_width: usize,
lhs_max_line: LineNumber,
rhs_max_line: LineNumber,
lhs_max_line_in_file: LineNumber,
rhs_max_line_in_file: LineNumber,
content_max_width: usize,
) -> Self {
let lhs_line_nums_width = format_line_num(lhs_max_line).len();
@ -245,6 +249,8 @@ impl SourceDimensions {
rhs_line_nums_width,
lhs_max_line,
rhs_max_line,
lhs_max_line_in_file,
rhs_max_line_in_file,
}
}
}
@ -562,19 +568,24 @@ pub(crate) fn print(
}
}
let lhs_max_line_in_file = LineNumber(lhs_lines.len().saturating_sub(1) as u32);
let rhs_max_line_in_file = LineNumber(rhs_lines.len().saturating_sub(1) as u32);
lhs_max_visible_line = LineNumber(min(
lhs_max_visible_line.0 + display_options.num_context_lines,
lhs_lines.len().saturating_sub(1) as u32,
lhs_max_line_in_file.0,
));
rhs_max_visible_line = LineNumber(min(
rhs_max_visible_line.0 + display_options.num_context_lines,
rhs_lines.len().saturating_sub(1) as u32,
rhs_max_line_in_file.0,
));
let source_dims = SourceDimensions::new(
display_options.terminal_width,
lhs_max_visible_line,
rhs_max_visible_line,
lhs_max_line_in_file,
rhs_max_line_in_file,
content_max_width,
);
@ -774,7 +785,14 @@ mod tests {
#[test]
fn test_width_calculations() {
let source_dims = SourceDimensions::new(DEFAULT_TERMINAL_WIDTH, 1.into(), 10.into(), 9999);
let source_dims = SourceDimensions::new(
DEFAULT_TERMINAL_WIDTH,
1.into(),
10.into(),
1.into(),
10.into(),
9999,
);
assert_eq!(source_dims.lhs_line_nums_width, 2);
assert_eq!(source_dims.rhs_line_nums_width, 3);
@ -782,7 +800,14 @@ mod tests {
#[test]
fn test_format_missing_line_num() {
let source_dims = SourceDimensions::new(DEFAULT_TERMINAL_WIDTH, 1.into(), 1.into(), 9999);
let source_dims = SourceDimensions::new(
DEFAULT_TERMINAL_WIDTH,
1.into(),
1.into(),
1.into(),
1.into(),
9999,
);
assert_eq!(
format_missing_line_num(0.into(), &source_dims, Side::Left, false, true),
@ -796,7 +821,7 @@ mod tests {
#[test]
fn test_format_missing_line_num_at_end() {
let source_dims = SourceDimensions::new(80, 1.into(), 1.into(), 9999);
let source_dims = SourceDimensions::new(80, 1.into(), 1.into(), 1.into(), 1.into(), 9999);
assert_eq!(
format_missing_line_num(1.into(), &source_dims, Side::Left, false, true),