From 53872a6024f7b3afd50e8cab2820ffa5d2f11285 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Mon, 15 Nov 2021 19:38:06 +0100 Subject: [PATCH] WIP --- crates/editor/src/display_map/block_map.rs | 193 +++++++-------------- 1 file changed, 63 insertions(+), 130 deletions(-) diff --git a/crates/editor/src/display_map/block_map.rs b/crates/editor/src/display_map/block_map.rs index 4eee7afa87..12bf8cfb34 100644 --- a/crates/editor/src/display_map/block_map.rs +++ b/crates/editor/src/display_map/block_map.rs @@ -142,7 +142,9 @@ impl BlockMap { for edit in edits { let old_start = WrapPoint::new(edit.old.start, 0); - new_transforms.push_tree(cursor.slice(&old_start, Bias::Left, &()), &()); + if old_start > *cursor.start() { + new_transforms.push_tree(cursor.slice(&old_start, Bias::Left, &()), &()); + } let overshoot = old_start.0 - cursor.start().0; if !overshoot.is_zero() { @@ -151,138 +153,69 @@ impl BlockMap { let old_end = WrapPoint::new(edit.old.end, 0); cursor.seek(&old_end, Bias::Left, &()); + cursor.next(&()); + + let start_anchor = buffer.anchor_before(Point::new(edit.new.start, 0)); + let start_block_ix = match self.blocks[last_block_ix..].binary_search_by(|probe| { + probe + .position + .cmp(&start_anchor, buffer) + .unwrap() + .then(Ordering::Greater) + }) { + Ok(ix) | Err(ix) => last_block_ix + ix, + }; + let end_block_ix = if edit.new.end > wrap_snapshot.max_point().row() { + self.blocks.len() + } else { + let end_anchor = buffer.anchor_before(Point::new(edit.new.end, 0)); + match self.blocks[start_block_ix..].binary_search_by(|probe| { + probe + .position + .cmp(&end_anchor, buffer) + .unwrap() + .then(Ordering::Greater) + }) { + Ok(ix) | Err(ix) => start_block_ix + ix, + } + }; + last_block_ix = end_block_ix; + + blocks_in_edit.clear(); + blocks_in_edit.extend( + self.blocks[start_block_ix..end_block_ix] + .iter() + .map(|block| (block.position.to_point(buffer).row, block)), + ); + blocks_in_edit.sort_unstable_by_key(|(row, block)| (*row, block.disposition, block.id)); + + for (block_row, block) in blocks_in_edit.iter().copied() { + let new_transforms_end = new_transforms.summary().input; + if block.disposition.is_above() { + if block_row > new_transforms_end.row { + new_transforms.push( + Transform::isomorphic(Point::new(block_row, 0) - new_transforms_end), + &(), + ); + } + } else { + if block_row >= new_transforms_end.row { + new_transforms.push( + Transform::isomorphic( + Point::new(block_row, wrap_snapshot.line_len(block_row)) + - new_transforms_end, + ), + &(), + ); + } + } + + new_transforms.push(Transform::block(block.clone()), &()); + } } - // while let Some(mut edit) = edits.next() { - // new_transforms.push_tree( - // cursor.slice(&WrapPoint::new(edit.old.start, 0), Bias::Left, &()), - // &(), - // ); - - // let mut transform_start_row = cursor.start().row(); - // if cursor.prev_item().map_or(false, |t| { - // t.block_disposition() == Some(BlockDisposition::Below) - // }) { - // transform_start_row += 1; - // } - // dbg!("collapsed edit", &edit); - // edit.new.start -= edit.old.start - transform_start_row; - // edit.old.start = transform_start_row; - // let mut edit_follows_below_block = false; - - // loop { - // if edit.old.end > cursor.start().0.row { - // cursor.seek(&WrapPoint::new(edit.old.end, 0), Bias::Left, &()); - // // dbg!(cursor.start(), cursor.item()); - // if cursor.item().map_or(false, |t| t.is_isomorphic()) { - // if let Some(prev_transform) = cursor.prev_item() { - // if prev_transform.block_disposition() == Some(BlockDisposition::Below) - // && edit.old.end == cursor.start().row() + 1 - // { - // edit_follows_below_block = true; - // } else { - // edit_follows_below_block = false; - // cursor.next(&()); - // } - // } else { - // edit_follows_below_block = false; - // cursor.next(&()); - // } - // } - - // let transform_end_row = cursor.start().row() + 1; - // cursor.seek(&WrapPoint::new(transform_end_row, 0), Bias::Left, &()); - // edit.new.end += transform_end_row - edit.old.end; - // edit.old.end = transform_end_row; - // } - - // if let Some(next_edit) = edits.peek() { - // if edit.old.end >= next_edit.old.start { - // let delta = next_edit.new.len() as i32 - next_edit.old.len() as i32; - // edit.old.end = cmp::max(next_edit.old.end, edit.old.end); - // edit.new.end = (edit.new.end as i32 + delta) as u32; - // edits.next(); - // } else { - // break; - // } - // } else { - // break; - // } - // } - - // dbg!("expanded edit", &edit); - // let start_anchor = buffer.anchor_before(Point::new(edit.new.start, 0)); - // let start_block_ix = match self.blocks[last_block_ix..].binary_search_by(|probe| { - // probe - // .position - // .cmp(&start_anchor, buffer) - // .unwrap() - // .then(Ordering::Greater) - // }) { - // Ok(ix) | Err(ix) => last_block_ix + ix, - // }; - // let end_block_ix = if edit.new.end > wrap_snapshot.max_point().row() { - // self.blocks.len() - // } else { - // let end_anchor = buffer.anchor_before(Point::new(edit.new.end, 0)); - // match self.blocks[start_block_ix..].binary_search_by(|probe| { - // probe - // .position - // .cmp(&end_anchor, buffer) - // .unwrap() - // .then(Ordering::Greater) - // }) { - // Ok(ix) | Err(ix) => start_block_ix + ix, - // } - // }; - // last_block_ix = end_block_ix; - - // blocks_in_edit.clear(); - // blocks_in_edit.extend( - // self.blocks[start_block_ix..end_block_ix] - // .iter() - // .map(|block| (block.position.to_point(buffer).row, block)), - // ); - // blocks_in_edit.sort_unstable_by_key(|(row, block)| (*row, block.disposition, block.id)); - // // dbg!(&blocks_in_edit); - - // for (block_row, block) in blocks_in_edit.iter().copied() { - // let new_transforms_end = new_transforms.summary().input; - // if block.disposition.is_above() { - // if block_row > new_transforms_end.row { - // new_transforms.push( - // Transform::isomorphic(Point::new(block_row, 0) - new_transforms_end), - // &(), - // ); - // } - // } else { - // if block_row >= new_transforms_end.row { - // new_transforms.push( - // Transform::isomorphic( - // Point::new(block_row, wrap_snapshot.line_len(block_row)) - // - new_transforms_end, - // ), - // &(), - // ); - // } - // } - - // new_transforms.push(Transform::block(block.clone()), &()); - // } - - // if !edit_follows_below_block { - // let new_transforms_end = new_transforms.summary().input; - // let edit_new_end_point = - // cmp::min(Point::new(edit.new.end, 0), wrap_snapshot.max_point().0); - // if new_transforms_end < edit_new_end_point { - // new_transforms.push( - // Transform::isomorphic(edit_new_end_point - new_transforms_end), - // &(), - // ); - // } - // } - // } new_transforms.push_tree(cursor.suffix(&()), &()); + drop(cursor); *transforms = new_transforms; }