From 6ffa3613ccd01b2ed99c1f9f6f3c8975e2010677 Mon Sep 17 00:00:00 2001 From: Wilfred Hughes Date: Sat, 4 Oct 2025 14:26:45 +0100 Subject: [PATCH] Define a separate source dimension that's explicitly the maximum line in the file --- src/display/side_by_side.rs | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src/display/side_by_side.rs b/src/display/side_by_side.rs index 30e1c0f67..2772e756e 100644 --- a/src/display/side_by_side.rs +++ b/src/display/side_by_side.rs @@ -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),