Don't insert a newline after the last excerpt of a MultiBuffer

Co-Authored-By: Nathan Sobo <nathan@zed.dev>
This commit is contained in:
Antonio Scandurra 2021-12-15 16:39:09 +01:00
parent ae0fa75abe
commit 7bbaa1d930
2 changed files with 23 additions and 13 deletions

View file

@ -1273,12 +1273,12 @@ mod tests {
let subscription = buffer.subscribe(); let subscription = buffer.subscribe();
let edit_count = rng.gen_range(1..=5); let edit_count = rng.gen_range(1..=5);
buffer.randomly_edit(&mut rng, edit_count, cx); buffer.randomly_edit(&mut rng, edit_count, cx);
buffer_snapshot = buffer.snapshot(cx);
let edits = subscription.consume().into_inner(); let edits = subscription.consume().into_inner();
log::info!("editing {:?}", edits); log::info!("editing {:?}", edits);
buffer_edits.extend(edits); buffer_edits.extend(edits);
}), }),
}; };
buffer_snapshot = buffer.read(cx).snapshot(cx);
let (snapshot, edits) = map.read(buffer_snapshot.clone(), buffer_edits); let (snapshot, edits) = map.read(buffer_snapshot.clone(), buffer_edits);
snapshot_edits.push((snapshot.clone(), edits)); snapshot_edits.push((snapshot.clone(), edits));

View file

@ -592,10 +592,18 @@ impl MultiBuffer {
let last_diagnostics_update_count = buffer_snapshot.diagnostics_update_count(); let last_diagnostics_update_count = buffer_snapshot.diagnostics_update_count();
let mut snapshot = self.snapshot.borrow_mut(); let mut snapshot = self.snapshot.borrow_mut();
let prev_id = snapshot.excerpts.last().map(|e| &e.id); let mut prev_id = None;
let id = ExcerptId::between(prev_id.unwrap_or(&ExcerptId::min()), &ExcerptId::max());
let edit_start = snapshot.excerpts.summary().text.bytes; let edit_start = snapshot.excerpts.summary().text.bytes;
snapshot.excerpts.update_last(
|excerpt| {
excerpt.has_trailing_newline = true;
excerpt.text_summary += TextSummary::from("\n");
prev_id = Some(excerpt.id.clone());
},
&(),
);
let id = ExcerptId::between(&prev_id.unwrap_or(ExcerptId::min()), &ExcerptId::max());
let excerpt = Excerpt::new( let excerpt = Excerpt::new(
id.clone(), id.clone(),
buffer.id(), buffer.id(),
@ -603,12 +611,8 @@ impl MultiBuffer {
range, range,
props.header_height, props.header_height,
props.render_header, props.render_header,
!self.singleton, false,
); );
let edit = Edit {
old: edit_start..edit_start,
new: edit_start..edit_start + excerpt.text_summary.bytes,
};
snapshot.excerpts.push(excerpt, &()); snapshot.excerpts.push(excerpt, &());
self.buffers self.buffers
.entry(props.buffer.id()) .entry(props.buffer.id())
@ -621,8 +625,10 @@ impl MultiBuffer {
}) })
.excerpts .excerpts
.push(id.clone()); .push(id.clone());
self.subscriptions.publish_mut([Edit {
self.subscriptions.publish_mut([edit]); old: edit_start..edit_start,
new: edit_start..snapshot.excerpts.summary().text.bytes,
}]);
cx.notify(); cx.notify();
@ -738,7 +744,7 @@ impl MultiBuffer {
old_excerpt.range.clone(), old_excerpt.range.clone(),
old_excerpt.header_height, old_excerpt.header_height,
old_excerpt.render_header.clone(), old_excerpt.render_header.clone(),
!self.singleton, old_excerpt.has_trailing_newline,
); );
} else { } else {
new_excerpt = old_excerpt.clone(); new_excerpt = old_excerpt.clone();
@ -2245,6 +2251,10 @@ mod tests {
expected_text.extend(buffer.text_for_range(buffer_range.clone())); expected_text.extend(buffer.text_for_range(buffer_range.clone()));
expected_text.push('\n'); expected_text.push('\n');
} }
// Remove final trailing newline.
if !expected_excerpts.is_empty() {
expected_text.pop();
}
assert_eq!(snapshot.text(), expected_text); assert_eq!(snapshot.text(), expected_text);
@ -2421,7 +2431,7 @@ mod tests {
let edits = subscription.consume().into_inner(); let edits = subscription.consume().into_inner();
log::info!( log::info!(
"applying edits since old text: {:?}: {:?}", "applying subscription edits to old text: {:?}: {:?}",
old_snapshot.text(), old_snapshot.text(),
edits, edits,
); );