Compare commits

...

1 Commits

Author SHA1 Message Date
Cole Miller
f145614283 wip
Co-authored-by: Remco Smits <djsmits12@gmail.com>
Co-authored-by: Anthony Eid <hello@anthonyeid.me>
Co-authored-by: Piotr Osiewicz <peterosiewicz@gmail.com>
2025-06-04 12:05:31 -04:00

View File

@@ -31,7 +31,9 @@ use std::{
any::type_name, any::type_name,
borrow::Cow, borrow::Cow,
cell::{Cell, Ref, RefCell}, cell::{Cell, Ref, RefCell},
cmp, fmt, cmp,
f32::consts::E,
fmt,
future::Future, future::Future,
io, io,
iter::{self, FromIterator}, iter::{self, FromIterator},
@@ -43,7 +45,7 @@ use std::{
sync::Arc, sync::Arc,
time::{Duration, Instant}, time::{Duration, Instant},
}; };
use sum_tree::{Bias, Cursor, SumTree, TreeMap}; use sum_tree::{Bias, Cursor, Dimension, SumTree, TreeMap};
use text::{ use text::{
BufferId, Edit, LineIndent, TextSummary, BufferId, Edit, LineIndent, TextSummary,
locator::Locator, locator::Locator,
@@ -281,6 +283,8 @@ impl DiffState {
} }
} }
// extend
/// The contents of a [`MultiBuffer`] at a single point in time. /// The contents of a [`MultiBuffer`] at a single point in time.
#[derive(Clone, Default)] #[derive(Clone, Default)]
pub struct MultiBufferSnapshot { pub struct MultiBufferSnapshot {
@@ -461,10 +465,15 @@ pub struct ExcerptSummary {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct DiffTransformSummary { pub struct DiffTransformSummary {
/// Carries summary of all the BufferContent transforms
input: TextSummary, input: TextSummary,
/// Carries summary of all the BufferContent transforms plus all the DeletedHunk transforms
output: TextSummary, output: TextSummary,
/// Secret third thing
original: TextSummary,
} }
// position in a buffer -> position in the buffer in terms of last git state
#[derive(Clone)] #[derive(Clone)]
pub struct MultiBufferRows<'a> { pub struct MultiBufferRows<'a> {
point: Point, point: Point,
@@ -506,10 +515,45 @@ pub struct ReversedMultiBufferBytes<'a> {
chunk: &'a [u8], chunk: &'a [u8],
} }
#[derive(Clone)]
struct DiffDimension<D> {
output: OutputDimension<D>,
input: ExcerptDimension<D>,
}
impl<'a, D: TextDimension> sum_tree::Dimension<'a, DiffTransformSummary> for DiffDimension<D> {
fn zero(_: &()) -> Self {
Self {
output: OutputDimension::zero(&()),
input: <ExcerptDimension<D> as Dimension<'_, DiffTransformSummary>>::zero(&()),
}
}
fn add_summary(&mut self, summary: &'a DiffTransformSummary, cx: &()) {
self.output.add_summary(summary, cx);
self.input.add_summary(summary, cx);
}
}
// FIXME
// impl<'a, D: TextDimension> sum_tree::Dimension<'a, ExcerptSummary> for DiffDimension<D> {
// fn zero(cx: &()) -> Self {
// Self {
// output: OutputDimension::zero(cx),
// input: <ExcerptDimension<D> as Dimension<'_, ExcerptSummary>>::zero(&()),
// }
// }
// fn add_summary(&mut self, summary: &'a ExcerptSummary, cx: &()) {
// self.output.add_summary(summary, cx);
// self.input.add_summary(summary, cx);
// }
// }
#[derive(Clone)] #[derive(Clone)]
struct MultiBufferCursor<'a, D: TextDimension> { struct MultiBufferCursor<'a, D: TextDimension> {
excerpts: Cursor<'a, Excerpt, ExcerptDimension<D>>, excerpts: Cursor<'a, Excerpt, ExcerptDimension<D>>,
diff_transforms: Cursor<'a, DiffTransform, (OutputDimension<D>, ExcerptDimension<D>)>, diff_transforms: Cursor<'a, DiffTransform, DiffDimension<D>>,
diffs: &'a TreeMap<BufferId, BufferDiffSnapshot>, diffs: &'a TreeMap<BufferId, BufferDiffSnapshot>,
cached_region: Option<MultiBufferRegion<'a, D>>, cached_region: Option<MultiBufferRegion<'a, D>>,
} }
@@ -6362,6 +6406,16 @@ impl MultiBufferSnapshot {
prev_transform = Some(item); prev_transform = Some(item);
} }
} }
/// translates an anchor in this multibuffer into a corresponding anchor in the diff base buffer
/// for unchanged regions and deleted regions, this is exact (as they exist in the diff base)
/// for added regions, this snaps the position to the start of the addition
pub fn foo(&self, row: MultiBufferRow) -> BufferRow {
// construct a cursor
// seek the cursor to MultiBufferPoint(row, 0)
// read off the `OriginalDimension<Point>` from the cursor
todo!()
}
} }
impl<'a, D> MultiBufferCursor<'a, D> impl<'a, D> MultiBufferCursor<'a, D>
@@ -7131,13 +7185,22 @@ impl sum_tree::Item for DiffTransform {
fn summary(&self, _: &<Self::Summary as sum_tree::Summary>::Context) -> Self::Summary { fn summary(&self, _: &<Self::Summary as sum_tree::Summary>::Context) -> Self::Summary {
match self { match self {
DiffTransform::BufferContent { summary, .. } => DiffTransformSummary { DiffTransform::BufferContent {
summary,
inserted_hunk_info,
} => DiffTransformSummary {
input: *summary, input: *summary,
output: *summary, output: *summary,
original: if inserted_hunk_info.is_some() {
TextSummary::default()
} else {
*summary
},
}, },
DiffTransform::DeletedHunk { summary, .. } => DiffTransformSummary { DiffTransform::DeletedHunk { summary, .. } => DiffTransformSummary {
input: TextSummary::default(), input: TextSummary::default(),
output: *summary, output: *summary,
original: *summary,
}, },
} }
} }
@@ -7156,6 +7219,7 @@ impl sum_tree::Summary for DiffTransformSummary {
DiffTransformSummary { DiffTransformSummary {
input: TextSummary::default(), input: TextSummary::default(),
output: TextSummary::default(), output: TextSummary::default(),
original: TextSummary::default(),
} }
} }
@@ -7268,6 +7332,9 @@ struct ExcerptDimension<T>(T);
#[derive(Clone, PartialOrd, Ord, Eq, PartialEq, Debug)] #[derive(Clone, PartialOrd, Ord, Eq, PartialEq, Debug)]
struct OutputDimension<T>(T); struct OutputDimension<T>(T);
#[derive(Clone, PartialOrd, Ord, Eq, PartialEq, Debug)]
struct OriginalDimension<T>(T);
impl<'a> sum_tree::Dimension<'a, DiffTransformSummary> for ExcerptOffset { impl<'a> sum_tree::Dimension<'a, DiffTransformSummary> for ExcerptOffset {
fn zero(_: &()) -> Self { fn zero(_: &()) -> Self {
ExcerptOffset::new(0) ExcerptOffset::new(0)
@@ -7329,6 +7396,20 @@ impl<'a, D: TextDimension> sum_tree::Dimension<'a, DiffTransformSummary> for Out
} }
} }
impl<'a, D: TextDimension> sum_tree::Dimension<'a, DiffTransformSummary> for OriginalDimension<D> {
fn zero(_: &<DiffTransformSummary as sum_tree::Summary>::Context) -> Self {
OriginalDimension(D::default())
}
fn add_summary(
&mut self,
summary: &'a DiffTransformSummary,
cx: &<DiffTransformSummary as sum_tree::Summary>::Context,
) {
self.0.add_assign(&D::from_text_summary(&summary.original))
}
}
impl<'a> sum_tree::Dimension<'a, DiffTransformSummary> for TextSummary { impl<'a> sum_tree::Dimension<'a, DiffTransformSummary> for TextSummary {
fn zero(_: &()) -> Self { fn zero(_: &()) -> Self {
TextSummary::default() TextSummary::default()