This commit is contained in:
Antonio Scandurra 2021-12-06 14:03:38 +01:00
parent 45d6f5ab04
commit 8354d1520d

View file

@ -19,7 +19,13 @@ pub type FragmentId = Location;
#[derive(Default)] #[derive(Default)]
pub struct FragmentList { pub struct FragmentList {
snapshot: Mutex<Snapshot>, snapshot: Mutex<Snapshot>,
buffers: HashMap<usize, (ModelHandle<Buffer>, text::Subscription, Vec<FragmentId>)>, buffers: HashMap<usize, BufferState>,
}
struct BufferState {
buffer: ModelHandle<Buffer>,
subscription: text::Subscription,
fragments: Vec<FragmentId>,
} }
#[derive(Clone, Default)] #[derive(Clone, Default)]
@ -108,9 +114,13 @@ impl FragmentList {
.entry(props.buffer.id()) .entry(props.buffer.id())
.or_insert_with(|| { .or_insert_with(|| {
let subscription = props.buffer.update(cx, |buffer, _| buffer.subscribe()); let subscription = props.buffer.update(cx, |buffer, _| buffer.subscribe());
(props.buffer.clone(), subscription, Default::default()) BufferState {
buffer: props.buffer.clone(),
subscription,
fragments: Default::default(),
}
}) })
.2 .fragments
.push(id.clone()); .push(id.clone());
id id
@ -120,15 +130,16 @@ impl FragmentList {
let mut snapshot = self.snapshot.lock(); let mut snapshot = self.snapshot.lock();
let mut patches = Vec::new(); let mut patches = Vec::new();
let mut fragments_to_edit = Vec::new(); let mut fragments_to_edit = Vec::new();
for (buffer, subscription, fragment_ids) in self.buffers.values() { for buffer_state in self.buffers.values() {
let patch = subscription.consume(); let patch = buffer_state.subscription.consume();
if !patch.is_empty() { if !patch.is_empty() {
let patch_ix = patches.len(); let patch_ix = patches.len();
patches.push(patch); patches.push(patch);
fragments_to_edit.extend( fragments_to_edit.extend(
fragment_ids buffer_state
.fragments
.iter() .iter()
.map(|fragment_id| (buffer, fragment_id, patch_ix)), .map(|fragment_id| (&buffer_state.buffer, fragment_id, patch_ix)),
) )
} }
} }
@ -440,7 +451,7 @@ mod tests {
); );
} }
#[gpui::test(iterations = 10000)] #[gpui::test(iterations = 100)]
fn test_location(mut rng: StdRng) { fn test_location(mut rng: StdRng) {
let mut lhs = Default::default(); let mut lhs = Default::default();
let mut rhs = Default::default(); let mut rhs = Default::default();