WIP

Nathan Sobo and Max Brunsfeld created

Co-Authored-By: Max Brunsfeld <maxbrunsfeld@gmail.com>

Change summary

crates/editor/src/display_map/block_map.rs | 45 ++++++++++++++++++-----
1 file changed, 35 insertions(+), 10 deletions(-)

Detailed changes

crates/editor/src/display_map/block_map.rs 🔗

@@ -704,21 +704,46 @@ impl<'a> Iterator for BufferRows<'a> {
             return None;
         }
 
-        let (buffer_row, _) = self.input_buffer_row.unwrap();
+        let (buffer_row, is_wrapped) = self.input_buffer_row.unwrap();
+
+        let in_block = if let Some(transform) = self.transforms.item() {
+            if let Some(block) = transform.block.as_ref() {
+                if block.disposition.is_below()
+                    && self.transforms.start().0 == BlockPoint::new(self.output_row, 0)
+                {
+                    !self.transforms.prev_item().unwrap().is_isomorphic()
+                } else {
+                    true
+                }
+            } else {
+                false
+            }
+        } else {
+            self.transforms.prev_item().unwrap().block.is_some()
+        };
 
         log::info!(
-            "Called next. Output row: {}, Input row: {}, Buffer row: {}",
+            "============== Iterator next. Output row: {}, Input row: {}, Buffer row: {}, In block {} ===============",
             self.output_row,
             self.input_row,
-            buffer_row
+            buffer_row,
+            in_block
         );
 
         self.output_row += 1;
-        if BlockPoint::new(self.output_row, 0) >= self.transforms.end(&()).0 {
-            self.transforms
-                .seek_forward(&BlockPoint::new(self.output_row, 0), Bias::Right, &());
+        let output_point = BlockPoint::new(self.output_row, 0);
+        let transform_end = self.transforms.end(&()).0;
+        // if output_point > transform_end || output_point == transform_end && in_block {
+        if output_point >= transform_end {
+            log::info!("  Calling next once");
+            self.transforms.next(&());
+            if self.transforms.end(&()).0 < output_point {
+                log::info!("  Calling next twice");
+                self.transforms.next(&());
+            }
+
             log::info!(
-                "  Advancing to the next transform (block text: {:?}). Output row: {}, Transform starts at: {:?}",
+                "  Advanced to the next transform (block text: {:?}). Output row: {}, Transform starts at: {:?}",
                 self.transforms.item().and_then(|t| t.block.as_ref()).map(|b| b.text.to_string()),
                 self.output_row,
                 self.transforms.start().1
@@ -734,7 +759,7 @@ impl<'a> Iterator for BufferRows<'a> {
                 self.input_row = new_input_position.row;
                 self.input_buffer_row = self.input_buffer_rows.next();
                 log::info!(
-                    "    Advancing the input buffer row. Input row: {}, Input buffer row {:?}",
+                    "    Advanced the input buffer row. Input row: {}, Input buffer row {:?}",
                     self.input_row,
                     self.input_buffer_row
                 )
@@ -750,7 +775,7 @@ impl<'a> Iterator for BufferRows<'a> {
             )
         }
 
-        Some((buffer_row, false))
+        Some((buffer_row, !is_wrapped && !in_block))
     }
 }
 
@@ -1178,7 +1203,7 @@ mod tests {
                 }
 
                 let soft_wrapped = wraps_snapshot.to_tab_point(WrapPoint::new(row, 0)).column() > 0;
-                expected_buffer_rows.push((buffer_row, false));
+                expected_buffer_rows.push((buffer_row, !soft_wrapped));
                 expected_text.push_str(input_line);
 
                 while let Some((_, block)) = sorted_blocks.peek() {