From 8bbddf90ffda7c37f8a87f71227a185007ddfae0 Mon Sep 17 00:00:00 2001
From: A-Walrus <ofek.r.guy@gmail.com>
Date: Mon, 17 Oct 2022 14:23:50 +0300
Subject: [PATCH] Replace `in_bounds` with calculation of end_indent

Instead of repeatedly checking if it is in_bounds, calculate the
max_indent beforehand and just loop. I added a debug_assert to "prove"
that it never tries drawing out of bounds.
---
 helix-term/src/ui/editor.rs | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs
index 4074534b..3cd2130a 100644
--- a/helix-term/src/ui/editor.rs
+++ b/helix-term/src/ui/editor.rs
@@ -24,7 +24,7 @@ use helix_view::{
     keyboard::{KeyCode, KeyModifiers},
     Document, Editor, Theme, View,
 };
-use std::{borrow::Cow, path::PathBuf};
+use std::{borrow::Cow, cmp::min, path::PathBuf};
 
 use tui::buffer::Buffer as Surface;
 
@@ -468,12 +468,18 @@ impl EditorView {
             let starting_indent =
                 (offset.col / tab_width) + config.indent_guides.skip_levels as usize;
 
-            for i in starting_indent..(indent_level / tab_width) {
+            // Don't draw indent guides outside of view
+            let end_indent = min(
+                indent_level,
+                // Add tab_width - 1 to round up, since the first visible
+                // indent might be a bit after offset.col
+                offset.col + viewport.width as usize + (tab_width - 1),
+            ) / tab_width;
+
+            for i in starting_indent..end_indent {
                 let x = (viewport.x as usize + (i * tab_width) - offset.col) as u16;
                 let y = viewport.y + line;
-                if !surface.in_bounds(x, y) {
-                    break;
-                }
+                debug_assert!(surface.in_bounds(x, y));
                 surface.set_string(x, y, &indent_guide_char, indent_guide_style);
             }
         };