Update old snapshot when only the tab size changes

This commit is contained in:
Antonio Scandurra 2022-08-03 12:23:02 +02:00
parent 1e94eb74f4
commit 3174b08082

View file

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