Update old snapshot when only the tab size changes

Antonio Scandurra created

Change summary

crates/editor/src/display_map/tab_map.rs | 88 +++++++++++++-------------
1 file changed, 44 insertions(+), 44 deletions(-)

Detailed changes

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

@@ -34,64 +34,64 @@ impl TabMap {
             version: old_snapshot.version,
         };
 
-        if old_snapshot.tab_size != new_snapshot.tab_size {
-            new_snapshot.version += 1;
-            let edits = vec![TabEdit {
-                old: TabPoint::zero()..old_snapshot.max_point(),
-                new: TabPoint::zero()..new_snapshot.max_point(),
-            }];
-            return (new_snapshot, edits);
-        }
-
         if old_snapshot.fold_snapshot.version != new_snapshot.fold_snapshot.version {
             new_snapshot.version += 1;
         }
 
         let old_max_offset = old_snapshot.fold_snapshot.len();
         let mut tab_edits = Vec::with_capacity(fold_edits.len());
-        for fold_edit in &mut fold_edits {
-            let mut delta = 0;
-            for chunk in
-                old_snapshot
-                    .fold_snapshot
-                    .chunks(fold_edit.old.end..old_max_offset, false, None)
-            {
-                let patterns: &[_] = &['\t', '\n'];
-                if let Some(ix) = chunk.text.find(patterns) {
-                    if &chunk.text[ix..ix + 1] == "\t" {
-                        fold_edit.old.end.0 += delta + ix + 1;
-                        fold_edit.new.end.0 += delta + ix + 1;
+
+        if old_snapshot.tab_size == new_snapshot.tab_size {
+            for fold_edit in &mut fold_edits {
+                let mut delta = 0;
+                for chunk in old_snapshot.fold_snapshot.chunks(
+                    fold_edit.old.end..old_max_offset,
+                    false,
+                    None,
+                ) {
+                    let patterns: &[_] = &['\t', '\n'];
+                    if let Some(ix) = chunk.text.find(patterns) {
+                        if &chunk.text[ix..ix + 1] == "\t" {
+                            fold_edit.old.end.0 += delta + ix + 1;
+                            fold_edit.new.end.0 += delta + ix + 1;
+                        }
+
+                        break;
                     }
 
-                    break;
+                    delta += chunk.text.len();
                 }
-
-                delta += chunk.text.len();
             }
-        }
 
-        let mut ix = 1;
-        while ix < fold_edits.len() {
-            let (prev_edits, next_edits) = fold_edits.split_at_mut(ix);
-            let prev_edit = prev_edits.last_mut().unwrap();
-            let edit = &next_edits[0];
-            if prev_edit.old.end >= edit.old.start {
-                prev_edit.old.end = edit.old.end;
-                prev_edit.new.end = edit.new.end;
-                fold_edits.remove(ix);
-            } else {
-                ix += 1;
+            let mut ix = 1;
+            while ix < fold_edits.len() {
+                let (prev_edits, next_edits) = fold_edits.split_at_mut(ix);
+                let prev_edit = prev_edits.last_mut().unwrap();
+                let edit = &next_edits[0];
+                if prev_edit.old.end >= edit.old.start {
+                    prev_edit.old.end = edit.old.end;
+                    prev_edit.new.end = edit.new.end;
+                    fold_edits.remove(ix);
+                } else {
+                    ix += 1;
+                }
             }
-        }
 
-        for fold_edit in fold_edits {
-            let old_start = fold_edit.old.start.to_point(&old_snapshot.fold_snapshot);
-            let old_end = fold_edit.old.end.to_point(&old_snapshot.fold_snapshot);
-            let new_start = fold_edit.new.start.to_point(&new_snapshot.fold_snapshot);
-            let new_end = fold_edit.new.end.to_point(&new_snapshot.fold_snapshot);
+            for fold_edit in fold_edits {
+                let old_start = fold_edit.old.start.to_point(&old_snapshot.fold_snapshot);
+                let old_end = fold_edit.old.end.to_point(&old_snapshot.fold_snapshot);
+                let new_start = fold_edit.new.start.to_point(&new_snapshot.fold_snapshot);
+                let new_end = fold_edit.new.end.to_point(&new_snapshot.fold_snapshot);
+                tab_edits.push(TabEdit {
+                    old: old_snapshot.to_tab_point(old_start)..old_snapshot.to_tab_point(old_end),
+                    new: new_snapshot.to_tab_point(new_start)..new_snapshot.to_tab_point(new_end),
+                });
+            }
+        } else {
+            new_snapshot.version += 1;
             tab_edits.push(TabEdit {
-                old: old_snapshot.to_tab_point(old_start)..old_snapshot.to_tab_point(old_end),
-                new: new_snapshot.to_tab_point(new_start)..new_snapshot.to_tab_point(new_end),
+                old: TabPoint::zero()..old_snapshot.max_point(),
+                new: TabPoint::zero()..new_snapshot.max_point(),
             });
         }