>,
priority: usize,
- pub(crate) render_in_minimap: bool,
}
#[derive(Clone)]
@@ -205,7 +204,6 @@ pub struct BlockProperties {
pub style: BlockStyle,
pub render: RenderBlock,
pub priority: usize,
- pub render_in_minimap: bool,
}
impl Debug for BlockProperties {
@@ -292,7 +290,10 @@ pub enum Block {
ExcerptBoundary {
excerpt: ExcerptInfo,
height: u32,
- starts_new_buffer: bool,
+ },
+ BufferHeader {
+ excerpt: ExcerptInfo,
+ height: u32,
},
}
@@ -305,27 +306,37 @@ impl Block {
..
} => BlockId::ExcerptBoundary(next_excerpt.id),
Block::FoldedBuffer { first_excerpt, .. } => BlockId::FoldedBuffer(first_excerpt.id),
+ Block::BufferHeader {
+ excerpt: next_excerpt,
+ ..
+ } => BlockId::ExcerptBoundary(next_excerpt.id),
}
}
pub fn has_height(&self) -> bool {
match self {
Block::Custom(block) => block.height.is_some(),
- Block::ExcerptBoundary { .. } | Block::FoldedBuffer { .. } => true,
+ Block::ExcerptBoundary { .. }
+ | Block::FoldedBuffer { .. }
+ | Block::BufferHeader { .. } => true,
}
}
pub fn height(&self) -> u32 {
match self {
Block::Custom(block) => block.height.unwrap_or(0),
- Block::ExcerptBoundary { height, .. } | Block::FoldedBuffer { height, .. } => *height,
+ Block::ExcerptBoundary { height, .. }
+ | Block::FoldedBuffer { height, .. }
+ | Block::BufferHeader { height, .. } => *height,
}
}
pub fn style(&self) -> BlockStyle {
match self {
Block::Custom(block) => block.style,
- Block::ExcerptBoundary { .. } | Block::FoldedBuffer { .. } => BlockStyle::Sticky,
+ Block::ExcerptBoundary { .. }
+ | Block::FoldedBuffer { .. }
+ | Block::BufferHeader { .. } => BlockStyle::Sticky,
}
}
@@ -334,6 +345,7 @@ impl Block {
Block::Custom(block) => matches!(block.placement, BlockPlacement::Above(_)),
Block::FoldedBuffer { .. } => false,
Block::ExcerptBoundary { .. } => true,
+ Block::BufferHeader { .. } => true,
}
}
@@ -342,6 +354,7 @@ impl Block {
Block::Custom(block) => matches!(block.placement, BlockPlacement::Near(_)),
Block::FoldedBuffer { .. } => false,
Block::ExcerptBoundary { .. } => false,
+ Block::BufferHeader { .. } => false,
}
}
@@ -353,6 +366,7 @@ impl Block {
),
Block::FoldedBuffer { .. } => false,
Block::ExcerptBoundary { .. } => false,
+ Block::BufferHeader { .. } => false,
}
}
@@ -361,6 +375,7 @@ impl Block {
Block::Custom(block) => matches!(block.placement, BlockPlacement::Replace(_)),
Block::FoldedBuffer { .. } => true,
Block::ExcerptBoundary { .. } => false,
+ Block::BufferHeader { .. } => false,
}
}
@@ -369,6 +384,7 @@ impl Block {
Block::Custom(_) => false,
Block::FoldedBuffer { .. } => true,
Block::ExcerptBoundary { .. } => true,
+ Block::BufferHeader { .. } => true,
}
}
@@ -376,9 +392,8 @@ impl Block {
match self {
Block::Custom(_) => false,
Block::FoldedBuffer { .. } => true,
- Block::ExcerptBoundary {
- starts_new_buffer, ..
- } => *starts_new_buffer,
+ Block::ExcerptBoundary { .. } => false,
+ Block::BufferHeader { .. } => true,
}
}
}
@@ -395,14 +410,14 @@ impl Debug for Block {
.field("first_excerpt", &first_excerpt)
.field("height", height)
.finish(),
- Self::ExcerptBoundary {
- starts_new_buffer,
- excerpt,
- height,
- } => f
+ Self::ExcerptBoundary { excerpt, height } => f
.debug_struct("ExcerptBoundary")
.field("excerpt", excerpt)
- .field("starts_new_buffer", starts_new_buffer)
+ .field("height", height)
+ .finish(),
+ Self::BufferHeader { excerpt, height } => f
+ .debug_struct("BufferHeader")
+ .field("excerpt", excerpt)
.field("height", height)
.finish(),
}
@@ -418,7 +433,7 @@ struct TransformSummary {
}
pub struct BlockChunks<'a> {
- transforms: sum_tree::Cursor<'a, Transform, (BlockRow, WrapRow)>,
+ transforms: sum_tree::Cursor<'a, Transform, Dimensions>,
input_chunks: wrap_map::WrapChunks<'a>,
input_chunk: Chunk<'a>,
output_row: u32,
@@ -428,7 +443,7 @@ pub struct BlockChunks<'a> {
#[derive(Clone)]
pub struct BlockRows<'a> {
- transforms: sum_tree::Cursor<'a, Transform, (BlockRow, WrapRow)>,
+ transforms: sum_tree::Cursor<'a, Transform, Dimensions>,
input_rows: wrap_map::WrapRows<'a>,
output_row: BlockRow,
started: bool,
@@ -464,7 +479,7 @@ impl BlockMap {
map
}
- pub fn read(&self, wrap_snapshot: WrapSnapshot, edits: Patch) -> BlockMapReader {
+ pub fn read(&self, wrap_snapshot: WrapSnapshot, edits: Patch) -> BlockMapReader<'_> {
self.sync(&wrap_snapshot, edits);
*self.wrap_snapshot.borrow_mut() = wrap_snapshot.clone();
BlockMapReader {
@@ -479,7 +494,7 @@ impl BlockMap {
}
}
- pub fn write(&mut self, wrap_snapshot: WrapSnapshot, edits: Patch) -> BlockMapWriter {
+ pub fn write(&mut self, wrap_snapshot: WrapSnapshot, edits: Patch) -> BlockMapWriter<'_> {
self.sync(&wrap_snapshot, edits);
*self.wrap_snapshot.borrow_mut() = wrap_snapshot;
BlockMapWriter(self)
@@ -526,27 +541,23 @@ impl BlockMap {
// * Isomorphic transforms that end *at* the start of the edit
// * Below blocks that end at the start of the edit
// However, if we hit a replace block that ends at the start of the edit we want to reconstruct it.
- new_transforms.append(cursor.slice(&old_start, Bias::Left, &()), &());
- if let Some(transform) = cursor.item() {
- if transform.summary.input_rows > 0
- && cursor.end(&()) == old_start
- && transform
- .block
- .as_ref()
- .map_or(true, |b| !b.is_replacement())
- {
- // Preserve the transform (push and next)
- new_transforms.push(transform.clone(), &());
- cursor.next(&());
+ new_transforms.append(cursor.slice(&old_start, Bias::Left), &());
+ if let Some(transform) = cursor.item()
+ && transform.summary.input_rows > 0
+ && cursor.end() == old_start
+ && transform.block.as_ref().is_none_or(|b| !b.is_replacement())
+ {
+ // Preserve the transform (push and next)
+ new_transforms.push(transform.clone(), &());
+ cursor.next();
- // Preserve below blocks at end of edit
- while let Some(transform) = cursor.item() {
- if transform.block.as_ref().map_or(false, |b| b.place_below()) {
- new_transforms.push(transform.clone(), &());
- cursor.next(&());
- } else {
- break;
- }
+ // Preserve below blocks at end of edit
+ while let Some(transform) = cursor.item() {
+ if transform.block.as_ref().is_some_and(|b| b.place_below()) {
+ new_transforms.push(transform.clone(), &());
+ cursor.next();
+ } else {
+ break;
}
}
}
@@ -581,8 +592,8 @@ impl BlockMap {
let mut new_end = WrapRow(edit.new.end);
loop {
// Seek to the transform starting at or after the end of the edit
- cursor.seek(&old_end, Bias::Left, &());
- cursor.next(&());
+ cursor.seek(&old_end, Bias::Left);
+ cursor.next();
// Extend edit to the end of the discarded transform so it is reconstructed in full
let transform_rows_after_edit = cursor.start().0 - old_end.0;
@@ -594,8 +605,8 @@ impl BlockMap {
if next_edit.old.start <= cursor.start().0 {
old_end = WrapRow(next_edit.old.end);
new_end = WrapRow(next_edit.new.end);
- cursor.seek(&old_end, Bias::Left, &());
- cursor.next(&());
+ cursor.seek(&old_end, Bias::Left);
+ cursor.next();
edits.next();
} else {
break;
@@ -609,8 +620,8 @@ impl BlockMap {
// Discard below blocks at the end of the edit. They'll be reconstructed.
while let Some(transform) = cursor.item() {
- if transform.block.as_ref().map_or(false, |b| b.place_below()) {
- cursor.next(&());
+ if transform.block.as_ref().is_some_and(|b| b.place_below()) {
+ cursor.next();
} else {
break;
}
@@ -659,22 +670,20 @@ impl BlockMap {
.iter()
.filter_map(|block| {
let placement = block.placement.to_wrap_row(wrap_snapshot)?;
- if let BlockPlacement::Above(row) = placement {
- if row < new_start {
- return None;
- }
+ if let BlockPlacement::Above(row) = placement
+ && row < new_start
+ {
+ return None;
}
Some((placement, Block::Custom(block.clone())))
}),
);
- if buffer.show_headers() {
- blocks_in_edit.extend(self.header_and_footer_blocks(
- buffer,
- (start_bound, end_bound),
- wrap_snapshot,
- ));
- }
+ blocks_in_edit.extend(self.header_and_footer_blocks(
+ buffer,
+ (start_bound, end_bound),
+ wrap_snapshot,
+ ));
BlockMap::sort_blocks(&mut blocks_in_edit);
@@ -722,7 +731,7 @@ impl BlockMap {
push_isomorphic(&mut new_transforms, rows_after_last_block, wrap_snapshot);
}
- new_transforms.append(cursor.suffix(&()), &());
+ new_transforms.append(cursor.suffix(), &());
debug_assert_eq!(
new_transforms.summary().input_rows,
wrap_snapshot.max_point().row() + 1
@@ -777,7 +786,7 @@ impl BlockMap {
if self.buffers_with_disabled_headers.contains(&new_buffer_id) {
continue;
}
- if self.folded_buffers.contains(&new_buffer_id) {
+ if self.folded_buffers.contains(&new_buffer_id) && buffer.show_headers() {
let mut last_excerpt_end_row = first_excerpt.end_row;
while let Some(next_boundary) = boundaries.peek() {
@@ -810,20 +819,24 @@ impl BlockMap {
}
}
- if new_buffer_id.is_some() {
+ let starts_new_buffer = new_buffer_id.is_some();
+ let block = if starts_new_buffer && buffer.show_headers() {
height += self.buffer_header_height;
- } else {
+ Block::BufferHeader {
+ excerpt: excerpt_boundary.next,
+ height,
+ }
+ } else if excerpt_boundary.prev.is_some() {
height += self.excerpt_header_height;
- }
-
- return Some((
- BlockPlacement::Above(WrapRow(wrap_row)),
Block::ExcerptBoundary {
excerpt: excerpt_boundary.next,
height,
- starts_new_buffer: new_buffer_id.is_some(),
- },
- ));
+ }
+ } else {
+ continue;
+ };
+
+ return Some((BlockPlacement::Above(WrapRow(wrap_row)), block));
}
})
}
@@ -848,13 +861,25 @@ impl BlockMap {
(
Block::ExcerptBoundary {
excerpt: excerpt_a, ..
+ }
+ | Block::BufferHeader {
+ excerpt: excerpt_a, ..
},
Block::ExcerptBoundary {
excerpt: excerpt_b, ..
+ }
+ | Block::BufferHeader {
+ excerpt: excerpt_b, ..
},
) => Some(excerpt_a.id).cmp(&Some(excerpt_b.id)),
- (Block::ExcerptBoundary { .. }, Block::Custom(_)) => Ordering::Less,
- (Block::Custom(_), Block::ExcerptBoundary { .. }) => Ordering::Greater,
+ (
+ Block::ExcerptBoundary { .. } | Block::BufferHeader { .. },
+ Block::Custom(_),
+ ) => Ordering::Less,
+ (
+ Block::Custom(_),
+ Block::ExcerptBoundary { .. } | Block::BufferHeader { .. },
+ ) => Ordering::Greater,
(Block::Custom(block_a), Block::Custom(block_b)) => block_a
.priority
.cmp(&block_b.priority)
@@ -972,19 +997,19 @@ impl BlockMapReader<'_> {
.unwrap_or(self.wrap_snapshot.max_point().row() + 1),
);
- let mut cursor = self.transforms.cursor::<(WrapRow, BlockRow)>(&());
- cursor.seek(&start_wrap_row, Bias::Left, &());
+ let mut cursor = self.transforms.cursor::>(&());
+ cursor.seek(&start_wrap_row, Bias::Left);
while let Some(transform) = cursor.item() {
if cursor.start().0 > end_wrap_row {
break;
}
- if let Some(BlockId::Custom(id)) = transform.block.as_ref().map(|block| block.id()) {
- if id == block_id {
- return Some(cursor.start().1);
- }
+ if let Some(BlockId::Custom(id)) = transform.block.as_ref().map(|block| block.id())
+ && id == block_id
+ {
+ return Some(cursor.start().1);
}
- cursor.next(&());
+ cursor.next();
}
None
@@ -1044,7 +1069,6 @@ impl BlockMapWriter<'_> {
render: Arc::new(Mutex::new(block.render)),
style: block.style,
priority: block.priority,
- render_in_minimap: block.render_in_minimap,
});
self.0.custom_blocks.insert(block_ix, new_block.clone());
self.0.custom_blocks_by_id.insert(id, new_block);
@@ -1079,7 +1103,6 @@ impl BlockMapWriter<'_> {
style: block.style,
render: block.render.clone(),
priority: block.priority,
- render_in_minimap: block.render_in_minimap,
};
let new_block = Arc::new(new_block);
*block = new_block.clone();
@@ -1296,21 +1319,21 @@ impl BlockSnapshot {
) -> BlockChunks<'a> {
let max_output_row = cmp::min(rows.end, self.transforms.summary().output_rows);
- let mut cursor = self.transforms.cursor::<(BlockRow, WrapRow)>(&());
- cursor.seek(&BlockRow(rows.start), Bias::Right, &());
+ let mut cursor = self.transforms.cursor::>(&());
+ cursor.seek(&BlockRow(rows.start), Bias::Right);
let transform_output_start = cursor.start().0.0;
let transform_input_start = cursor.start().1.0;
let mut input_start = transform_input_start;
let mut input_end = transform_input_start;
- if let Some(transform) = cursor.item() {
- if transform.block.is_none() {
- input_start += rows.start - transform_output_start;
- input_end += cmp::min(
- rows.end - transform_output_start,
- transform.summary.input_rows,
- );
- }
+ if let Some(transform) = cursor.item()
+ && transform.block.is_none()
+ {
+ input_start += rows.start - transform_output_start;
+ input_end += cmp::min(
+ rows.end - transform_output_start,
+ transform.summary.input_rows,
+ );
}
BlockChunks {
@@ -1327,13 +1350,13 @@ impl BlockSnapshot {
}
}
- pub(super) fn row_infos(&self, start_row: BlockRow) -> BlockRows {
- let mut cursor = self.transforms.cursor::<(BlockRow, WrapRow)>(&());
- cursor.seek(&start_row, Bias::Right, &());
- let (output_start, input_start) = cursor.start();
+ pub(super) fn row_infos(&self, start_row: BlockRow) -> BlockRows<'_> {
+ let mut cursor = self.transforms.cursor::>(&());
+ cursor.seek(&start_row, Bias::Right);
+ let Dimensions(output_start, input_start, _) = cursor.start();
let overshoot = if cursor
.item()
- .map_or(false, |transform| transform.block.is_none())
+ .is_some_and(|transform| transform.block.is_none())
{
start_row.0 - output_start.0
} else {
@@ -1350,9 +1373,9 @@ impl BlockSnapshot {
pub fn blocks_in_range(&self, rows: Range) -> impl Iterator- {
let mut cursor = self.transforms.cursor::(&());
- cursor.seek(&BlockRow(rows.start), Bias::Left, &());
- while cursor.start().0 < rows.start && cursor.end(&()).0 <= rows.start {
- cursor.next(&());
+ cursor.seek(&BlockRow(rows.start), Bias::Left);
+ while cursor.start().0 < rows.start && cursor.end().0 <= rows.start {
+ cursor.next();
}
std::iter::from_fn(move || {
@@ -1363,15 +1386,15 @@ impl BlockSnapshot {
&& transform
.block
.as_ref()
- .map_or(false, |block| block.height() > 0))
+ .is_some_and(|block| block.height() > 0))
{
break;
}
if let Some(block) = &transform.block {
- cursor.next(&());
+ cursor.next();
return Some((start_row, block));
} else {
- cursor.next(&());
+ cursor.next();
}
}
None
@@ -1381,16 +1404,18 @@ impl BlockSnapshot {
pub fn sticky_header_excerpt(&self, position: f32) -> Option> {
let top_row = position as u32;
let mut cursor = self.transforms.cursor::(&());
- cursor.seek(&BlockRow(top_row), Bias::Right, &());
+ cursor.seek(&BlockRow(top_row), Bias::Right);
while let Some(transform) = cursor.item() {
match &transform.block {
- Some(Block::ExcerptBoundary { excerpt, .. }) => {
+ Some(
+ Block::ExcerptBoundary { excerpt, .. } | Block::BufferHeader { excerpt, .. },
+ ) => {
return Some(StickyHeaderExcerpt { excerpt });
}
Some(block) if block.is_buffer_header() => return None,
_ => {
- cursor.prev(&());
+ cursor.prev();
continue;
}
}
@@ -1418,7 +1443,7 @@ impl BlockSnapshot {
let wrap_row = WrapRow(wrap_point.row());
let mut cursor = self.transforms.cursor::(&());
- cursor.seek(&wrap_row, Bias::Left, &());
+ cursor.seek(&wrap_row, Bias::Left);
while let Some(transform) = cursor.item() {
if let Some(block) = transform.block.as_ref() {
@@ -1429,7 +1454,7 @@ impl BlockSnapshot {
break;
}
- cursor.next(&());
+ cursor.next();
}
None
@@ -1445,19 +1470,19 @@ impl BlockSnapshot {
}
pub fn longest_row_in_range(&self, range: Range) -> BlockRow {
- let mut cursor = self.transforms.cursor::<(BlockRow, WrapRow)>(&());
- cursor.seek(&range.start, Bias::Right, &());
+ let mut cursor = self.transforms.cursor::>(&());
+ cursor.seek(&range.start, Bias::Right);
let mut longest_row = range.start;
let mut longest_row_chars = 0;
if let Some(transform) = cursor.item() {
if transform.block.is_none() {
- let (output_start, input_start) = cursor.start();
+ let Dimensions(output_start, input_start, _) = cursor.start();
let overshoot = range.start.0 - output_start.0;
let wrap_start_row = input_start.0 + overshoot;
let wrap_end_row = cmp::min(
input_start.0 + (range.end.0 - output_start.0),
- cursor.end(&()).1.0,
+ cursor.end().1.0,
);
let summary = self
.wrap_snapshot
@@ -1465,29 +1490,29 @@ impl BlockSnapshot {
longest_row = BlockRow(range.start.0 + summary.longest_row);
longest_row_chars = summary.longest_row_chars;
}
- cursor.next(&());
+ cursor.next();
}
let cursor_start_row = cursor.start().0;
if range.end > cursor_start_row {
- let summary = cursor.summary::<_, TransformSummary>(&range.end, Bias::Right, &());
+ let summary = cursor.summary::<_, TransformSummary>(&range.end, Bias::Right);
if summary.longest_row_chars > longest_row_chars {
longest_row = BlockRow(cursor_start_row.0 + summary.longest_row);
longest_row_chars = summary.longest_row_chars;
}
- if let Some(transform) = cursor.item() {
- if transform.block.is_none() {
- let (output_start, input_start) = cursor.start();
- let overshoot = range.end.0 - output_start.0;
- let wrap_start_row = input_start.0;
- let wrap_end_row = input_start.0 + overshoot;
- let summary = self
- .wrap_snapshot
- .text_summary_for_range(wrap_start_row..wrap_end_row);
- if summary.longest_row_chars > longest_row_chars {
- longest_row = BlockRow(output_start.0 + summary.longest_row);
- }
+ if let Some(transform) = cursor.item()
+ && transform.block.is_none()
+ {
+ let Dimensions(output_start, input_start, _) = cursor.start();
+ let overshoot = range.end.0 - output_start.0;
+ let wrap_start_row = input_start.0;
+ let wrap_end_row = input_start.0 + overshoot;
+ let summary = self
+ .wrap_snapshot
+ .text_summary_for_range(wrap_start_row..wrap_end_row);
+ if summary.longest_row_chars > longest_row_chars {
+ longest_row = BlockRow(output_start.0 + summary.longest_row);
}
}
}
@@ -1496,10 +1521,10 @@ impl BlockSnapshot {
}
pub(super) fn line_len(&self, row: BlockRow) -> u32 {
- let mut cursor = self.transforms.cursor::<(BlockRow, WrapRow)>(&());
- cursor.seek(&BlockRow(row.0), Bias::Right, &());
+ let mut cursor = self.transforms.cursor::>(&());
+ cursor.seek(&BlockRow(row.0), Bias::Right);
if let Some(transform) = cursor.item() {
- let (output_start, input_start) = cursor.start();
+ let Dimensions(output_start, input_start, _) = cursor.start();
let overshoot = row.0 - output_start.0;
if transform.block.is_some() {
0
@@ -1514,14 +1539,14 @@ impl BlockSnapshot {
}
pub(super) fn is_block_line(&self, row: BlockRow) -> bool {
- let mut cursor = self.transforms.cursor::<(BlockRow, WrapRow)>(&());
- cursor.seek(&row, Bias::Right, &());
- cursor.item().map_or(false, |t| t.block.is_some())
+ let mut cursor = self.transforms.cursor::>(&());
+ cursor.seek(&row, Bias::Right);
+ cursor.item().is_some_and(|t| t.block.is_some())
}
pub(super) fn is_folded_buffer_header(&self, row: BlockRow) -> bool {
- let mut cursor = self.transforms.cursor::<(BlockRow, WrapRow)>(&());
- cursor.seek(&row, Bias::Right, &());
+ let mut cursor = self.transforms.cursor::>(&());
+ cursor.seek(&row, Bias::Right);
let Some(transform) = cursor.item() else {
return false;
};
@@ -1532,41 +1557,40 @@ impl BlockSnapshot {
let wrap_point = self
.wrap_snapshot
.make_wrap_point(Point::new(row.0, 0), Bias::Left);
- let mut cursor = self.transforms.cursor::<(WrapRow, BlockRow)>(&());
- cursor.seek(&WrapRow(wrap_point.row()), Bias::Right, &());
- cursor.item().map_or(false, |transform| {
+ let mut cursor = self.transforms.cursor::>(&());
+ cursor.seek(&WrapRow(wrap_point.row()), Bias::Right);
+ cursor.item().is_some_and(|transform| {
transform
.block
.as_ref()
- .map_or(false, |block| block.is_replacement())
+ .is_some_and(|block| block.is_replacement())
})
}
pub fn clip_point(&self, point: BlockPoint, bias: Bias) -> BlockPoint {
- let mut cursor = self.transforms.cursor::<(BlockRow, WrapRow)>(&());
- cursor.seek(&BlockRow(point.row), Bias::Right, &());
+ let mut cursor = self.transforms.cursor::>(&());
+ cursor.seek(&BlockRow(point.row), Bias::Right);
let max_input_row = WrapRow(self.transforms.summary().input_rows);
let mut search_left =
- (bias == Bias::Left && cursor.start().1.0 > 0) || cursor.end(&()).1 == max_input_row;
+ (bias == Bias::Left && cursor.start().1.0 > 0) || cursor.end().1 == max_input_row;
let mut reversed = false;
loop {
if let Some(transform) = cursor.item() {
- let (output_start_row, input_start_row) = cursor.start();
- let (output_end_row, input_end_row) = cursor.end(&());
+ let Dimensions(output_start_row, input_start_row, _) = cursor.start();
+ let Dimensions(output_end_row, input_end_row, _) = cursor.end();
let output_start = Point::new(output_start_row.0, 0);
let input_start = Point::new(input_start_row.0, 0);
let input_end = Point::new(input_end_row.0, 0);
match transform.block.as_ref() {
Some(block) => {
- if block.is_replacement() {
- if ((bias == Bias::Left || search_left) && output_start <= point.0)
- || (!search_left && output_start >= point.0)
- {
- return BlockPoint(output_start);
- }
+ if block.is_replacement()
+ && (((bias == Bias::Left || search_left) && output_start <= point.0)
+ || (!search_left && output_start >= point.0))
+ {
+ return BlockPoint(output_start);
}
}
None => {
@@ -1588,28 +1612,28 @@ impl BlockSnapshot {
}
if search_left {
- cursor.prev(&());
+ cursor.prev();
} else {
- cursor.next(&());
+ cursor.next();
}
} else if reversed {
return self.max_point();
} else {
reversed = true;
search_left = !search_left;
- cursor.seek(&BlockRow(point.row), Bias::Right, &());
+ cursor.seek(&BlockRow(point.row), Bias::Right);
}
}
}
pub fn to_block_point(&self, wrap_point: WrapPoint) -> BlockPoint {
- let mut cursor = self.transforms.cursor::<(WrapRow, BlockRow)>(&());
- cursor.seek(&WrapRow(wrap_point.row()), Bias::Right, &());
+ let mut cursor = self.transforms.cursor::>(&());
+ cursor.seek(&WrapRow(wrap_point.row()), Bias::Right);
if let Some(transform) = cursor.item() {
if transform.block.is_some() {
BlockPoint::new(cursor.start().1.0, 0)
} else {
- let (input_start_row, output_start_row) = cursor.start();
+ let Dimensions(input_start_row, output_start_row, _) = cursor.start();
let input_start = Point::new(input_start_row.0, 0);
let output_start = Point::new(output_start_row.0, 0);
let input_overshoot = wrap_point.0 - input_start;
@@ -1621,8 +1645,8 @@ impl BlockSnapshot {
}
pub fn to_wrap_point(&self, block_point: BlockPoint, bias: Bias) -> WrapPoint {
- let mut cursor = self.transforms.cursor::<(BlockRow, WrapRow)>(&());
- cursor.seek(&BlockRow(block_point.row), Bias::Right, &());
+ let mut cursor = self.transforms.cursor::>(&());
+ cursor.seek(&BlockRow(block_point.row), Bias::Right);
if let Some(transform) = cursor.item() {
match transform.block.as_ref() {
Some(block) => {
@@ -1634,7 +1658,7 @@ impl BlockSnapshot {
} else if bias == Bias::Left {
WrapPoint::new(cursor.start().1.0, 0)
} else {
- let wrap_row = cursor.end(&()).1.0 - 1;
+ let wrap_row = cursor.end().1.0 - 1;
WrapPoint::new(wrap_row, self.wrap_snapshot.line_len(wrap_row))
}
}
@@ -1654,14 +1678,14 @@ impl BlockChunks<'_> {
/// Go to the next transform
fn advance(&mut self) {
self.input_chunk = Chunk::default();
- self.transforms.next(&());
+ self.transforms.next();
while let Some(transform) = self.transforms.item() {
if transform
.block
.as_ref()
- .map_or(false, |block| block.height() == 0)
+ .is_some_and(|block| block.height() == 0)
{
- self.transforms.next(&());
+ self.transforms.next();
} else {
break;
}
@@ -1670,13 +1694,13 @@ impl BlockChunks<'_> {
if self
.transforms
.item()
- .map_or(false, |transform| transform.block.is_none())
+ .is_some_and(|transform| transform.block.is_none())
{
let start_input_row = self.transforms.start().1.0;
let start_output_row = self.transforms.start().0.0;
if start_output_row < self.max_output_row {
let end_input_row = cmp::min(
- self.transforms.end(&()).1.0,
+ self.transforms.end().1.0,
start_input_row + (self.max_output_row - start_output_row),
);
self.input_chunks.seek(start_input_row..end_input_row);
@@ -1700,7 +1724,7 @@ impl<'a> Iterator for BlockChunks<'a> {
let transform = self.transforms.item()?;
if transform.block.is_some() {
let block_start = self.transforms.start().0.0;
- let mut block_end = self.transforms.end(&()).0.0;
+ let mut block_end = self.transforms.end().0.0;
self.advance();
if self.transforms.item().is_none() {
block_end -= 1;
@@ -1735,7 +1759,7 @@ impl<'a> Iterator for BlockChunks<'a> {
}
}
- let transform_end = self.transforms.end(&()).0.0;
+ let transform_end = self.transforms.end().0.0;
let (prefix_rows, prefix_bytes) =
offset_for_row(self.input_chunk.text, transform_end - self.output_row);
self.output_row += prefix_rows;
@@ -1774,15 +1798,15 @@ impl Iterator for BlockRows<'_> {
self.started = true;
}
- if self.output_row.0 >= self.transforms.end(&()).0.0 {
- self.transforms.next(&());
+ if self.output_row.0 >= self.transforms.end().0.0 {
+ self.transforms.next();
while let Some(transform) = self.transforms.item() {
if transform
.block
.as_ref()
- .map_or(false, |block| block.height() == 0)
+ .is_some_and(|block| block.height() == 0)
{
- self.transforms.next(&());
+ self.transforms.next();
} else {
break;
}
@@ -1792,7 +1816,7 @@ impl Iterator for BlockRows<'_> {
if transform
.block
.as_ref()
- .map_or(true, |block| block.is_replacement())
+ .is_none_or(|block| block.is_replacement())
{
self.input_rows.seek(self.transforms.start().1.0);
}
@@ -1976,7 +2000,6 @@ mod tests {
height: Some(1),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
BlockProperties {
style: BlockStyle::Fixed,
@@ -1984,7 +2007,6 @@ mod tests {
height: Some(2),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
BlockProperties {
style: BlockStyle::Fixed,
@@ -1992,7 +2014,6 @@ mod tests {
height: Some(3),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
]);
@@ -2168,7 +2189,7 @@ mod tests {
}
let multi_buffer_snapshot = multi_buffer.read(cx).snapshot(cx);
- let (_, inlay_snapshot) = InlayMap::new(multi_buffer_snapshot.clone());
+ let (_, inlay_snapshot) = InlayMap::new(multi_buffer_snapshot);
let (_, fold_snapshot) = FoldMap::new(inlay_snapshot);
let (_, tab_snapshot) = TabMap::new(fold_snapshot, 4.try_into().unwrap());
let (_, wraps_snapshot) = WrapMap::new(tab_snapshot, font, font_size, Some(wrap_width), cx);
@@ -2217,7 +2238,6 @@ mod tests {
height: Some(1),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
BlockProperties {
style: BlockStyle::Fixed,
@@ -2225,7 +2245,6 @@ mod tests {
height: Some(2),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
BlockProperties {
style: BlockStyle::Fixed,
@@ -2233,7 +2252,6 @@ mod tests {
height: Some(3),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
]);
@@ -2290,7 +2308,7 @@ mod tests {
new_heights.insert(block_ids[0], 3);
block_map_writer.resize(new_heights);
- let snapshot = block_map.read(wraps_snapshot.clone(), Default::default());
+ let snapshot = block_map.read(wraps_snapshot, Default::default());
// Same height as before, should remain the same
assert_eq!(snapshot.text(), "aaa\n\n\n\n\n\nbbb\nccc\nddd\n\n\n");
}
@@ -2300,8 +2318,6 @@ mod tests {
fn test_blocks_on_wrapped_lines(cx: &mut gpui::TestAppContext) {
cx.update(init_test);
- let _font_id = cx.text_system().font_id(&font("Helvetica")).unwrap();
-
let text = "one two three\nfour five six\nseven eight";
let buffer = cx.update(|cx| MultiBuffer::build_simple(text, cx));
@@ -2322,7 +2338,6 @@ mod tests {
render: Arc::new(|_| div().into_any()),
height: Some(1),
priority: 0,
- render_in_minimap: true,
},
BlockProperties {
style: BlockStyle::Fixed,
@@ -2330,7 +2345,6 @@ mod tests {
render: Arc::new(|_| div().into_any()),
height: Some(1),
priority: 0,
- render_in_minimap: true,
},
]);
@@ -2370,7 +2384,6 @@ mod tests {
height: Some(4),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
}])[0];
let blocks_snapshot = block_map.read(wraps_snapshot, Default::default());
@@ -2380,16 +2393,14 @@ mod tests {
buffer.edit([(Point::new(2, 0)..Point::new(3, 0), "")], None, cx);
buffer.snapshot(cx)
});
- let (inlay_snapshot, inlay_edits) = inlay_map.sync(
- buffer_snapshot.clone(),
- buffer_subscription.consume().into_inner(),
- );
+ let (inlay_snapshot, inlay_edits) =
+ inlay_map.sync(buffer_snapshot, buffer_subscription.consume().into_inner());
let (fold_snapshot, fold_edits) = fold_map.read(inlay_snapshot, inlay_edits);
let (tab_snapshot, tab_edits) = tab_map.sync(fold_snapshot, fold_edits, tab_size);
let (wraps_snapshot, wrap_edits) = wrap_map.update(cx, |wrap_map, cx| {
wrap_map.sync(tab_snapshot, tab_edits, cx)
});
- let blocks_snapshot = block_map.read(wraps_snapshot.clone(), wrap_edits);
+ let blocks_snapshot = block_map.read(wraps_snapshot, wrap_edits);
assert_eq!(blocks_snapshot.text(), "line1\n\n\n\n\nline5");
let buffer_snapshot = buffer.update(cx, |buffer, cx| {
@@ -2424,7 +2435,6 @@ mod tests {
height: Some(1),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
BlockProperties {
style: BlockStyle::Fixed,
@@ -2432,7 +2442,6 @@ mod tests {
height: Some(1),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
BlockProperties {
style: BlockStyle::Fixed,
@@ -2440,7 +2449,6 @@ mod tests {
height: Some(1),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
]);
let blocks_snapshot = block_map.read(wraps_snapshot.clone(), Default::default());
@@ -2455,7 +2463,6 @@ mod tests {
height: Some(1),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
BlockProperties {
style: BlockStyle::Fixed,
@@ -2463,7 +2470,6 @@ mod tests {
height: Some(1),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
BlockProperties {
style: BlockStyle::Fixed,
@@ -2471,7 +2477,6 @@ mod tests {
height: Some(1),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
]);
let blocks_snapshot = block_map.read(wraps_snapshot.clone(), Default::default());
@@ -2480,7 +2485,7 @@ mod tests {
// Removing the replace block shows all the hidden blocks again.
let mut writer = block_map.write(wraps_snapshot.clone(), Default::default());
writer.remove(HashSet::from_iter([replace_block_id]));
- let blocks_snapshot = block_map.read(wraps_snapshot.clone(), Default::default());
+ let blocks_snapshot = block_map.read(wraps_snapshot, Default::default());
assert_eq!(
blocks_snapshot.text(),
"\nline1\n\nline2\n\n\nline 2.1\nline2.2\nline 2.3\nline 2.4\n\nline4\n\nline5"
@@ -2571,7 +2576,6 @@ mod tests {
height: Some(1),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
BlockProperties {
style: BlockStyle::Fixed,
@@ -2579,7 +2583,6 @@ mod tests {
height: Some(1),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
BlockProperties {
style: BlockStyle::Fixed,
@@ -2587,7 +2590,6 @@ mod tests {
height: Some(1),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
]);
let excerpt_blocks_3 = writer.insert(vec![
@@ -2597,7 +2599,6 @@ mod tests {
height: Some(1),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
BlockProperties {
style: BlockStyle::Fixed,
@@ -2605,7 +2606,6 @@ mod tests {
height: Some(1),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
},
]);
@@ -2653,7 +2653,6 @@ mod tests {
height: Some(1),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
}]);
let blocks_snapshot = block_map.read(wrap_snapshot.clone(), Patch::default());
let blocks = blocks_snapshot
@@ -2825,7 +2824,7 @@ mod tests {
buffer.read_with(cx, |buffer, cx| {
writer.fold_buffers([buffer_id_3], buffer, cx);
});
- let blocks_snapshot = block_map.read(wrap_snapshot.clone(), Patch::default());
+ let blocks_snapshot = block_map.read(wrap_snapshot, Patch::default());
let blocks = blocks_snapshot
.blocks_in_range(0..u32::MAX)
.collect::>();
@@ -2878,7 +2877,7 @@ mod tests {
assert_eq!(buffer_ids.len(), 1);
let buffer_id = buffer_ids[0];
- let (_, inlay_snapshot) = InlayMap::new(buffer_snapshot.clone());
+ let (_, inlay_snapshot) = InlayMap::new(buffer_snapshot);
let (_, fold_snapshot) = FoldMap::new(inlay_snapshot);
let (_, tab_snapshot) = TabMap::new(fold_snapshot, 4.try_into().unwrap());
let (_, wrap_snapshot) =
@@ -2892,7 +2891,7 @@ mod tests {
buffer.read_with(cx, |buffer, cx| {
writer.fold_buffers([buffer_id], buffer, cx);
});
- let blocks_snapshot = block_map.read(wrap_snapshot.clone(), Patch::default());
+ let blocks_snapshot = block_map.read(wrap_snapshot, Patch::default());
let blocks = blocks_snapshot
.blocks_in_range(0..u32::MAX)
.collect::>();
@@ -2900,12 +2899,7 @@ mod tests {
1,
blocks
.iter()
- .filter(|(_, block)| {
- match block {
- Block::FoldedBuffer { .. } => true,
- _ => false,
- }
- })
+ .filter(|(_, block)| { matches!(block, Block::FoldedBuffer { .. }) })
.count(),
"Should have one folded block, producing a header of the second buffer"
);
@@ -3011,7 +3005,6 @@ mod tests {
height: Some(height),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
}
})
.collect::>();
@@ -3032,7 +3025,6 @@ mod tests {
style: props.style,
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
}));
for (block_properties, block_id) in block_properties.iter().zip(block_ids) {
@@ -3224,9 +3216,9 @@ mod tests {
// so we special case row 0 to assume a leading '\n'.
//
// Linehood is the birthright of strings.
- let mut input_text_lines = input_text.split('\n').enumerate().peekable();
+ let input_text_lines = input_text.split('\n').enumerate().peekable();
let mut block_row = 0;
- while let Some((wrap_row, input_line)) = input_text_lines.next() {
+ for (wrap_row, input_line) in input_text_lines {
let wrap_row = wrap_row as u32;
let multibuffer_row = wraps_snapshot
.to_point(WrapPoint::new(wrap_row, 0), Bias::Left)
@@ -3257,34 +3249,32 @@ mod tests {
let mut is_in_replace_block = false;
if let Some((BlockPlacement::Replace(replace_range), block)) =
sorted_blocks_iter.peek()
+ && wrap_row >= replace_range.start().0
{
- if wrap_row >= replace_range.start().0 {
- is_in_replace_block = true;
+ is_in_replace_block = true;
- if wrap_row == replace_range.start().0 {
- if matches!(block, Block::FoldedBuffer { .. }) {
- expected_buffer_rows.push(None);
- } else {
- expected_buffer_rows
- .push(input_buffer_rows[multibuffer_row as usize]);
- }
+ if wrap_row == replace_range.start().0 {
+ if matches!(block, Block::FoldedBuffer { .. }) {
+ expected_buffer_rows.push(None);
+ } else {
+ expected_buffer_rows.push(input_buffer_rows[multibuffer_row as usize]);
}
+ }
- if wrap_row == replace_range.end().0 {
- expected_block_positions.push((block_row, block.id()));
- let text = "\n".repeat((block.height() - 1) as usize);
- if block_row > 0 {
- expected_text.push('\n');
- }
- expected_text.push_str(&text);
-
- for _ in 1..block.height() {
- expected_buffer_rows.push(None);
- }
- block_row += block.height();
-
- sorted_blocks_iter.next();
+ if wrap_row == replace_range.end().0 {
+ expected_block_positions.push((block_row, block.id()));
+ let text = "\n".repeat((block.height() - 1) as usize);
+ if block_row > 0 {
+ expected_text.push('\n');
}
+ expected_text.push_str(&text);
+
+ for _ in 1..block.height() {
+ expected_buffer_rows.push(None);
+ }
+ block_row += block.height();
+
+ sorted_blocks_iter.next();
}
}
@@ -3557,7 +3547,6 @@ mod tests {
height: Some(1),
render: Arc::new(|_| div().into_any()),
priority: 0,
- render_in_minimap: true,
}])[0];
let blocks_snapshot = block_map.read(wraps_snapshot.clone(), Default::default());
@@ -3569,7 +3558,7 @@ mod tests {
..buffer_snapshot.anchor_after(Point::new(1, 0))],
false,
);
- let blocks_snapshot = block_map.read(wraps_snapshot.clone(), Default::default());
+ let blocks_snapshot = block_map.read(wraps_snapshot, Default::default());
assert_eq!(blocks_snapshot.text(), "abc\n\ndef\nghi\njkl\nmno");
}
diff --git a/crates/editor/src/display_map/crease_map.rs b/crates/editor/src/display_map/crease_map.rs
index e6fe4270ec..bdac982fa7 100644
--- a/crates/editor/src/display_map/crease_map.rs
+++ b/crates/editor/src/display_map/crease_map.rs
@@ -52,15 +52,15 @@ impl CreaseSnapshot {
) -> Option<&'a Crease> {
let start = snapshot.anchor_before(Point::new(row.0, 0));
let mut cursor = self.creases.cursor::(snapshot);
- cursor.seek(&start, Bias::Left, snapshot);
+ cursor.seek(&start, Bias::Left);
while let Some(item) = cursor.item() {
match Ord::cmp(&item.crease.range().start.to_point(snapshot).row, &row.0) {
- Ordering::Less => cursor.next(snapshot),
+ Ordering::Less => cursor.next(),
Ordering::Equal => {
if item.crease.range().start.is_valid(snapshot) {
return Some(&item.crease);
} else {
- cursor.next(snapshot);
+ cursor.next();
}
}
Ordering::Greater => break,
@@ -76,11 +76,11 @@ impl CreaseSnapshot {
) -> impl 'a + Iterator
- > {
let start = snapshot.anchor_before(Point::new(range.start.0, 0));
let mut cursor = self.creases.cursor::(snapshot);
- cursor.seek(&start, Bias::Left, snapshot);
+ cursor.seek(&start, Bias::Left);
std::iter::from_fn(move || {
while let Some(item) = cursor.item() {
- cursor.next(snapshot);
+ cursor.next();
let crease_range = item.crease.range();
let crease_start = crease_range.start.to_point(snapshot);
let crease_end = crease_range.end.to_point(snapshot);
@@ -102,13 +102,13 @@ impl CreaseSnapshot {
let mut cursor = self.creases.cursor::(snapshot);
let mut results = Vec::new();
- cursor.next(snapshot);
+ cursor.next();
while let Some(item) = cursor.item() {
let crease_range = item.crease.range();
let start_point = crease_range.start.to_point(snapshot);
let end_point = crease_range.end.to_point(snapshot);
results.push((item.id, start_point..end_point));
- cursor.next(snapshot);
+ cursor.next();
}
results
@@ -298,7 +298,7 @@ impl CreaseMap {
let mut cursor = self.snapshot.creases.cursor::(snapshot);
for crease in creases {
let crease_range = crease.range().clone();
- new_creases.append(cursor.slice(&crease_range, Bias::Left, snapshot), snapshot);
+ new_creases.append(cursor.slice(&crease_range, Bias::Left), snapshot);
let id = self.next_id;
self.next_id.0 += 1;
@@ -306,7 +306,7 @@ impl CreaseMap {
new_creases.push(CreaseItem { crease, id }, snapshot);
new_ids.push(id);
}
- new_creases.append(cursor.suffix(snapshot), snapshot);
+ new_creases.append(cursor.suffix(), snapshot);
new_creases
};
new_ids
@@ -332,9 +332,9 @@ impl CreaseMap {
let mut cursor = self.snapshot.creases.cursor::(snapshot);
for (id, range) in &removals {
- new_creases.append(cursor.slice(range, Bias::Left, snapshot), snapshot);
+ new_creases.append(cursor.slice(range, Bias::Left), snapshot);
while let Some(item) = cursor.item() {
- cursor.next(snapshot);
+ cursor.next();
if item.id == *id {
break;
} else {
@@ -343,7 +343,7 @@ impl CreaseMap {
}
}
- new_creases.append(cursor.suffix(snapshot), snapshot);
+ new_creases.append(cursor.suffix(), snapshot);
new_creases
};
diff --git a/crates/editor/src/display_map/custom_highlights.rs b/crates/editor/src/display_map/custom_highlights.rs
index 11356586eb..f3737ea4b7 100644
--- a/crates/editor/src/display_map/custom_highlights.rs
+++ b/crates/editor/src/display_map/custom_highlights.rs
@@ -1,16 +1,15 @@
use collections::BTreeMap;
use gpui::HighlightStyle;
use language::Chunk;
-use multi_buffer::{Anchor, MultiBufferChunks, MultiBufferSnapshot, ToOffset as _};
+use multi_buffer::{MultiBufferChunks, MultiBufferSnapshot, ToOffset as _};
use std::{
- any::TypeId,
cmp,
iter::{self, Peekable},
ops::Range,
- sync::Arc,
vec,
};
-use sum_tree::TreeMap;
+
+use crate::display_map::{HighlightKey, TextHighlights};
pub struct CustomHighlightsChunks<'a> {
buffer_chunks: MultiBufferChunks<'a>,
@@ -19,15 +18,15 @@ pub struct CustomHighlightsChunks<'a> {
multibuffer_snapshot: &'a MultiBufferSnapshot,
highlight_endpoints: Peekable>,
- active_highlights: BTreeMap,
- text_highlights: Option<&'a TreeMap>)>>>,
+ active_highlights: BTreeMap,
+ text_highlights: Option<&'a TextHighlights>,
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
struct HighlightEndpoint {
offset: usize,
is_start: bool,
- tag: TypeId,
+ tag: HighlightKey,
style: HighlightStyle,
}
@@ -35,7 +34,7 @@ impl<'a> CustomHighlightsChunks<'a> {
pub fn new(
range: Range,
language_aware: bool,
- text_highlights: Option<&'a TreeMap>)>>>,
+ text_highlights: Option<&'a TextHighlights>,
multibuffer_snapshot: &'a MultiBufferSnapshot,
) -> Self {
Self {
@@ -66,7 +65,7 @@ impl<'a> CustomHighlightsChunks<'a> {
fn create_highlight_endpoints(
range: &Range,
- text_highlights: Option<&TreeMap>)>>>,
+ text_highlights: Option<&TextHighlights>,
buffer: &MultiBufferSnapshot,
) -> iter::Peekable> {
let mut highlight_endpoints = Vec::new();
@@ -78,7 +77,7 @@ fn create_highlight_endpoints(
let ranges = &text_highlights.1;
let start_ix = match ranges.binary_search_by(|probe| {
- let cmp = probe.end.cmp(&start, &buffer);
+ let cmp = probe.end.cmp(&start, buffer);
if cmp.is_gt() {
cmp::Ordering::Greater
} else {
@@ -89,18 +88,18 @@ fn create_highlight_endpoints(
};
for range in &ranges[start_ix..] {
- if range.start.cmp(&end, &buffer).is_ge() {
+ if range.start.cmp(&end, buffer).is_ge() {
break;
}
highlight_endpoints.push(HighlightEndpoint {
- offset: range.start.to_offset(&buffer),
+ offset: range.start.to_offset(buffer),
is_start: true,
tag,
style,
});
highlight_endpoints.push(HighlightEndpoint {
- offset: range.end.to_offset(&buffer),
+ offset: range.end.to_offset(buffer),
is_start: false,
tag,
style,
diff --git a/crates/editor/src/display_map/fold_map.rs b/crates/editor/src/display_map/fold_map.rs
index e9a611d390..42f46fb749 100644
--- a/crates/editor/src/display_map/fold_map.rs
+++ b/crates/editor/src/display_map/fold_map.rs
@@ -1,3 +1,5 @@
+use crate::{InlayId, display_map::inlay_map::InlayChunk};
+
use super::{
Highlights,
inlay_map::{InlayBufferRows, InlayChunks, InlayEdit, InlayOffset, InlayPoint, InlaySnapshot},
@@ -15,7 +17,7 @@ use std::{
sync::Arc,
usize,
};
-use sum_tree::{Bias, Cursor, FilterCursor, SumTree, Summary, TreeMap};
+use sum_tree::{Bias, Cursor, Dimensions, FilterCursor, SumTree, Summary, TreeMap};
use ui::IntoElement as _;
use util::post_inc;
@@ -96,8 +98,10 @@ impl FoldPoint {
}
pub fn to_inlay_point(self, snapshot: &FoldSnapshot) -> InlayPoint {
- let mut cursor = snapshot.transforms.cursor::<(FoldPoint, InlayPoint)>(&());
- cursor.seek(&self, Bias::Right, &());
+ let mut cursor = snapshot
+ .transforms
+ .cursor::>(&());
+ cursor.seek(&self, Bias::Right);
let overshoot = self.0 - cursor.start().0.0;
InlayPoint(cursor.start().1.0 + overshoot)
}
@@ -105,8 +109,8 @@ impl FoldPoint {
pub fn to_offset(self, snapshot: &FoldSnapshot) -> FoldOffset {
let mut cursor = snapshot
.transforms
- .cursor::<(FoldPoint, TransformSummary)>(&());
- cursor.seek(&self, Bias::Right, &());
+ .cursor::>(&());
+ cursor.seek(&self, Bias::Right);
let overshoot = self.0 - cursor.start().1.output.lines;
let mut offset = cursor.start().1.output.len;
if !overshoot.is_zero() {
@@ -185,10 +189,10 @@ impl FoldMapWriter<'_> {
width: None,
},
);
- new_tree.append(cursor.slice(&fold.range, Bias::Right, buffer), buffer);
+ new_tree.append(cursor.slice(&fold.range, Bias::Right), buffer);
new_tree.push(fold, buffer);
}
- new_tree.append(cursor.suffix(buffer), buffer);
+ new_tree.append(cursor.suffix(), buffer);
new_tree
};
@@ -250,7 +254,7 @@ impl FoldMapWriter<'_> {
fold_ixs_to_delete.push(*folds_cursor.start());
self.0.snapshot.fold_metadata_by_id.remove(&fold.id);
}
- folds_cursor.next(buffer);
+ folds_cursor.next();
}
}
@@ -261,10 +265,10 @@ impl FoldMapWriter<'_> {
let mut cursor = self.0.snapshot.folds.cursor::(buffer);
let mut folds = SumTree::new(buffer);
for fold_ix in fold_ixs_to_delete {
- folds.append(cursor.slice(&fold_ix, Bias::Right, buffer), buffer);
- cursor.next(buffer);
+ folds.append(cursor.slice(&fold_ix, Bias::Right), buffer);
+ cursor.next();
}
- folds.append(cursor.suffix(buffer), buffer);
+ folds.append(cursor.suffix(), buffer);
folds
};
@@ -275,32 +279,35 @@ impl FoldMapWriter<'_> {
pub(crate) fn update_fold_widths(
&mut self,
- new_widths: impl IntoIterator
- ,
+ new_widths: impl IntoIterator
- ,
) -> (FoldSnapshot, Vec) {
let mut edits = Vec::new();
let inlay_snapshot = self.0.snapshot.inlay_snapshot.clone();
let buffer = &inlay_snapshot.buffer;
for (id, new_width) in new_widths {
- if let Some(metadata) = self.0.snapshot.fold_metadata_by_id.get(&id).cloned() {
- if Some(new_width) != metadata.width {
- let buffer_start = metadata.range.start.to_offset(buffer);
- let buffer_end = metadata.range.end.to_offset(buffer);
- let inlay_range = inlay_snapshot.to_inlay_offset(buffer_start)
- ..inlay_snapshot.to_inlay_offset(buffer_end);
- edits.push(InlayEdit {
- old: inlay_range.clone(),
- new: inlay_range.clone(),
- });
+ let ChunkRendererId::Fold(id) = id else {
+ continue;
+ };
+ if let Some(metadata) = self.0.snapshot.fold_metadata_by_id.get(&id).cloned()
+ && Some(new_width) != metadata.width
+ {
+ let buffer_start = metadata.range.start.to_offset(buffer);
+ let buffer_end = metadata.range.end.to_offset(buffer);
+ let inlay_range = inlay_snapshot.to_inlay_offset(buffer_start)
+ ..inlay_snapshot.to_inlay_offset(buffer_end);
+ edits.push(InlayEdit {
+ old: inlay_range.clone(),
+ new: inlay_range.clone(),
+ });
- self.0.snapshot.fold_metadata_by_id.insert(
- id,
- FoldMetadata {
- range: metadata.range,
- width: Some(new_width),
- },
- );
- }
+ self.0.snapshot.fold_metadata_by_id.insert(
+ id,
+ FoldMetadata {
+ range: metadata.range,
+ width: Some(new_width),
+ },
+ );
}
}
@@ -357,7 +364,7 @@ impl FoldMap {
&mut self,
inlay_snapshot: InlaySnapshot,
edits: Vec,
- ) -> (FoldMapWriter, FoldSnapshot, Vec) {
+ ) -> (FoldMapWriter<'_>, FoldSnapshot, Vec) {
let (snapshot, edits) = self.read(inlay_snapshot, edits);
(FoldMapWriter(self), snapshot, edits)
}
@@ -407,28 +414,28 @@ impl FoldMap {
let mut new_transforms = SumTree::::default();
let mut cursor = self.snapshot.transforms.cursor::(&());
- cursor.seek(&InlayOffset(0), Bias::Right, &());
+ cursor.seek(&InlayOffset(0), Bias::Right);
while let Some(mut edit) = inlay_edits_iter.next() {
- if let Some(item) = cursor.item() {
- if !item.is_fold() {
- new_transforms.update_last(
- |transform| {
- if !transform.is_fold() {
- transform.summary.add_summary(&item.summary, &());
- cursor.next(&());
- }
- },
- &(),
- );
- }
+ if let Some(item) = cursor.item()
+ && !item.is_fold()
+ {
+ new_transforms.update_last(
+ |transform| {
+ if !transform.is_fold() {
+ transform.summary.add_summary(&item.summary, &());
+ cursor.next();
+ }
+ },
+ &(),
+ );
}
- new_transforms.append(cursor.slice(&edit.old.start, Bias::Left, &()), &());
+ new_transforms.append(cursor.slice(&edit.old.start, Bias::Left), &());
edit.new.start -= edit.old.start - *cursor.start();
edit.old.start = *cursor.start();
- cursor.seek(&edit.old.end, Bias::Right, &());
- cursor.next(&());
+ cursor.seek(&edit.old.end, Bias::Right);
+ cursor.next();
let mut delta = edit.new_len().0 as isize - edit.old_len().0 as isize;
loop {
@@ -444,8 +451,8 @@ impl FoldMap {
if next_edit.old.end >= edit.old.end {
edit.old.end = next_edit.old.end;
- cursor.seek(&edit.old.end, Bias::Right, &());
- cursor.next(&());
+ cursor.seek(&edit.old.end, Bias::Right);
+ cursor.next();
}
} else {
break;
@@ -462,11 +469,7 @@ impl FoldMap {
.snapshot
.folds
.cursor::(&inlay_snapshot.buffer);
- folds_cursor.seek(
- &FoldRange(anchor..Anchor::max()),
- Bias::Left,
- &inlay_snapshot.buffer,
- );
+ folds_cursor.seek(&FoldRange(anchor..Anchor::max()), Bias::Left);
let mut folds = iter::from_fn({
let inlay_snapshot = &inlay_snapshot;
@@ -480,7 +483,7 @@ impl FoldMap {
..inlay_snapshot.to_inlay_offset(buffer_end),
)
});
- folds_cursor.next(&inlay_snapshot.buffer);
+ folds_cursor.next();
item
}
})
@@ -488,14 +491,14 @@ impl FoldMap {
while folds
.peek()
- .map_or(false, |(_, fold_range)| fold_range.start < edit.new.end)
+ .is_some_and(|(_, fold_range)| fold_range.start < edit.new.end)
{
let (fold, mut fold_range) = folds.next().unwrap();
let sum = new_transforms.summary();
assert!(fold_range.start.0 >= sum.input.len);
- while folds.peek().map_or(false, |(next_fold, next_fold_range)| {
+ while folds.peek().is_some_and(|(next_fold, next_fold_range)| {
next_fold_range.start < fold_range.end
|| (next_fold_range.start == fold_range.end
&& fold.placeholder.merge_adjacent
@@ -527,7 +530,7 @@ impl FoldMap {
placeholder: Some(TransformPlaceholder {
text: ELLIPSIS,
renderer: ChunkRenderer {
- id: fold.id,
+ id: ChunkRendererId::Fold(fold.id),
render: Arc::new(move |cx| {
(fold.placeholder.render)(
fold_id,
@@ -553,7 +556,7 @@ impl FoldMap {
}
}
- new_transforms.append(cursor.suffix(&()), &());
+ new_transforms.append(cursor.suffix(), &());
if new_transforms.is_empty() {
let text_summary = inlay_snapshot.text_summary();
push_isomorphic(&mut new_transforms, text_summary);
@@ -566,35 +569,36 @@ impl FoldMap {
let mut old_transforms = self
.snapshot
.transforms
- .cursor::<(InlayOffset, FoldOffset)>(&());
- let mut new_transforms = new_transforms.cursor::<(InlayOffset, FoldOffset)>(&());
+ .cursor::>(&());
+ let mut new_transforms =
+ new_transforms.cursor::>(&());
for mut edit in inlay_edits {
- old_transforms.seek(&edit.old.start, Bias::Left, &());
- if old_transforms.item().map_or(false, |t| t.is_fold()) {
+ old_transforms.seek(&edit.old.start, Bias::Left);
+ if old_transforms.item().is_some_and(|t| t.is_fold()) {
edit.old.start = old_transforms.start().0;
}
let old_start =
old_transforms.start().1.0 + (edit.old.start - old_transforms.start().0).0;
- old_transforms.seek_forward(&edit.old.end, Bias::Right, &());
- if old_transforms.item().map_or(false, |t| t.is_fold()) {
- old_transforms.next(&());
+ old_transforms.seek_forward(&edit.old.end, Bias::Right);
+ if old_transforms.item().is_some_and(|t| t.is_fold()) {
+ old_transforms.next();
edit.old.end = old_transforms.start().0;
}
let old_end =
old_transforms.start().1.0 + (edit.old.end - old_transforms.start().0).0;
- new_transforms.seek(&edit.new.start, Bias::Left, &());
- if new_transforms.item().map_or(false, |t| t.is_fold()) {
+ new_transforms.seek(&edit.new.start, Bias::Left);
+ if new_transforms.item().is_some_and(|t| t.is_fold()) {
edit.new.start = new_transforms.start().0;
}
let new_start =
new_transforms.start().1.0 + (edit.new.start - new_transforms.start().0).0;
- new_transforms.seek_forward(&edit.new.end, Bias::Right, &());
- if new_transforms.item().map_or(false, |t| t.is_fold()) {
- new_transforms.next(&());
+ new_transforms.seek_forward(&edit.new.end, Bias::Right);
+ if new_transforms.item().is_some_and(|t| t.is_fold()) {
+ new_transforms.next();
edit.new.end = new_transforms.start().0;
}
let new_end =
@@ -650,11 +654,13 @@ impl FoldSnapshot {
pub fn text_summary_for_range(&self, range: Range) -> TextSummary {
let mut summary = TextSummary::default();
- let mut cursor = self.transforms.cursor::<(FoldPoint, InlayPoint)>(&());
- cursor.seek(&range.start, Bias::Right, &());
+ let mut cursor = self
+ .transforms
+ .cursor::>(&());
+ cursor.seek(&range.start, Bias::Right);
if let Some(transform) = cursor.item() {
let start_in_transform = range.start.0 - cursor.start().0.0;
- let end_in_transform = cmp::min(range.end, cursor.end(&()).0).0 - cursor.start().0.0;
+ let end_in_transform = cmp::min(range.end, cursor.end().0).0 - cursor.start().0.0;
if let Some(placeholder) = transform.placeholder.as_ref() {
summary = TextSummary::from(
&placeholder.text
@@ -673,10 +679,10 @@ impl FoldSnapshot {
}
}
- if range.end > cursor.end(&()).0 {
- cursor.next(&());
+ if range.end > cursor.end().0 {
+ cursor.next();
summary += &cursor
- .summary::<_, TransformSummary>(&range.end, Bias::Right, &())
+ .summary::<_, TransformSummary>(&range.end, Bias::Right)
.output;
if let Some(transform) = cursor.item() {
let end_in_transform = range.end.0 - cursor.start().0.0;
@@ -699,20 +705,19 @@ impl FoldSnapshot {
}
pub fn to_fold_point(&self, point: InlayPoint, bias: Bias) -> FoldPoint {
- let mut cursor = self.transforms.cursor::<(InlayPoint, FoldPoint)>(&());
- cursor.seek(&point, Bias::Right, &());
- if cursor.item().map_or(false, |t| t.is_fold()) {
+ let mut cursor = self
+ .transforms
+ .cursor::>(&());
+ cursor.seek(&point, Bias::Right);
+ if cursor.item().is_some_and(|t| t.is_fold()) {
if bias == Bias::Left || point == cursor.start().0 {
cursor.start().1
} else {
- cursor.end(&()).1
+ cursor.end().1
}
} else {
let overshoot = point.0 - cursor.start().0.0;
- FoldPoint(cmp::min(
- cursor.start().1.0 + overshoot,
- cursor.end(&()).1.0,
- ))
+ FoldPoint(cmp::min(cursor.start().1.0 + overshoot, cursor.end().1.0))
}
}
@@ -730,14 +735,16 @@ impl FoldSnapshot {
(line_end - line_start) as u32
}
- pub fn row_infos(&self, start_row: u32) -> FoldRows {
+ pub fn row_infos(&self, start_row: u32) -> FoldRows<'_> {
if start_row > self.transforms.summary().output.lines.row {
panic!("invalid display row {}", start_row);
}
let fold_point = FoldPoint::new(start_row, 0);
- let mut cursor = self.transforms.cursor::<(FoldPoint, InlayPoint)>(&());
- cursor.seek(&fold_point, Bias::Left, &());
+ let mut cursor = self
+ .transforms
+ .cursor::>(&());
+ cursor.seek(&fold_point, Bias::Left);
let overshoot = fold_point.0 - cursor.start().0.0;
let inlay_point = InlayPoint(cursor.start().1.0 + overshoot);
@@ -768,7 +775,7 @@ impl FoldSnapshot {
let mut folds = intersecting_folds(&self.inlay_snapshot, &self.folds, range, false);
iter::from_fn(move || {
let item = folds.item();
- folds.next(&self.inlay_snapshot.buffer);
+ folds.next();
item
})
}
@@ -780,8 +787,8 @@ impl FoldSnapshot {
let buffer_offset = offset.to_offset(&self.inlay_snapshot.buffer);
let inlay_offset = self.inlay_snapshot.to_inlay_offset(buffer_offset);
let mut cursor = self.transforms.cursor::(&());
- cursor.seek(&inlay_offset, Bias::Right, &());
- cursor.item().map_or(false, |t| t.placeholder.is_some())
+ cursor.seek(&inlay_offset, Bias::Right);
+ cursor.item().is_some_and(|t| t.placeholder.is_some())
}
pub fn is_line_folded(&self, buffer_row: MultiBufferRow) -> bool {
@@ -789,7 +796,7 @@ impl FoldSnapshot {
.inlay_snapshot
.to_inlay_point(Point::new(buffer_row.0, 0));
let mut cursor = self.transforms.cursor::(&());
- cursor.seek(&inlay_point, Bias::Right, &());
+ cursor.seek(&inlay_point, Bias::Right);
loop {
match cursor.item() {
Some(transform) => {
@@ -803,11 +810,11 @@ impl FoldSnapshot {
None => return false,
}
- if cursor.end(&()).row() == inlay_point.row() {
- cursor.next(&());
+ if cursor.end().row() == inlay_point.row() {
+ cursor.next();
} else {
inlay_point.0 += Point::new(1, 0);
- cursor.seek(&inlay_point, Bias::Right, &());
+ cursor.seek(&inlay_point, Bias::Right);
}
}
}
@@ -818,19 +825,21 @@ impl FoldSnapshot {
language_aware: bool,
highlights: Highlights<'a>,
) -> FoldChunks<'a> {
- let mut transform_cursor = self.transforms.cursor::<(FoldOffset, InlayOffset)>(&());
- transform_cursor.seek(&range.start, Bias::Right, &());
+ let mut transform_cursor = self
+ .transforms
+ .cursor::>(&());
+ transform_cursor.seek(&range.start, Bias::Right);
let inlay_start = {
let overshoot = range.start.0 - transform_cursor.start().0.0;
transform_cursor.start().1 + InlayOffset(overshoot)
};
- let transform_end = transform_cursor.end(&());
+ let transform_end = transform_cursor.end();
let inlay_end = if transform_cursor
.item()
- .map_or(true, |transform| transform.is_fold())
+ .is_none_or(|transform| transform.is_fold())
{
inlay_start
} else if range.end < transform_end.0 {
@@ -873,15 +882,17 @@ impl FoldSnapshot {
}
pub fn clip_point(&self, point: FoldPoint, bias: Bias) -> FoldPoint {
- let mut cursor = self.transforms.cursor::<(FoldPoint, InlayPoint)>(&());
- cursor.seek(&point, Bias::Right, &());
+ let mut cursor = self
+ .transforms
+ .cursor::>(&());
+ cursor.seek(&point, Bias::Right);
if let Some(transform) = cursor.item() {
let transform_start = cursor.start().0.0;
if transform.placeholder.is_some() {
if point.0 == transform_start || matches!(bias, Bias::Left) {
FoldPoint(transform_start)
} else {
- FoldPoint(cursor.end(&()).0.0)
+ FoldPoint(cursor.end().0.0)
}
} else {
let overshoot = InlayPoint(point.0 - transform_start);
@@ -940,7 +951,7 @@ fn intersecting_folds<'a>(
start_cmp == Ordering::Less && end_cmp == Ordering::Greater
}
});
- cursor.next(buffer);
+ cursor.next();
cursor
}
@@ -1060,7 +1071,7 @@ impl sum_tree::Summary for TransformSummary {
}
#[derive(Copy, Clone, Eq, PartialEq, Debug, Default, Ord, PartialOrd, Hash)]
-pub struct FoldId(usize);
+pub struct FoldId(pub(super) usize);
impl From for ElementId {
fn from(val: FoldId) -> Self {
@@ -1198,7 +1209,7 @@ impl<'a> sum_tree::Dimension<'a, FoldSummary> for usize {
#[derive(Clone)]
pub struct FoldRows<'a> {
- cursor: Cursor<'a, Transform, (FoldPoint, InlayPoint)>,
+ cursor: Cursor<'a, Transform, Dimensions>,
input_rows: InlayBufferRows<'a>,
fold_point: FoldPoint,
}
@@ -1206,7 +1217,7 @@ pub struct FoldRows<'a> {
impl FoldRows<'_> {
pub(crate) fn seek(&mut self, row: u32) {
let fold_point = FoldPoint::new(row, 0);
- self.cursor.seek(&fold_point, Bias::Left, &());
+ self.cursor.seek(&fold_point, Bias::Left);
let overshoot = fold_point.0 - self.cursor.start().0.0;
let inlay_point = InlayPoint(self.cursor.start().1.0 + overshoot);
self.input_rows.seek(inlay_point.row());
@@ -1219,8 +1230,8 @@ impl Iterator for FoldRows<'_> {
fn next(&mut self) -> Option