Update old snapshot when only the tab size changes
This commit is contained in:
parent
1e94eb74f4
commit
3174b08082
1 changed files with 44 additions and 44 deletions
|
@ -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(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue