Don't open a multibuffer when code actions's edits are contained in the current editor
Co-Authored-By: Antonio Scandurra <me@as-cii.com> Co-Authored-By: Nathan Sobo <nathan@zed.dev>
This commit is contained in:
parent
5049c1b286
commit
424b35253a
3 changed files with 58 additions and 5 deletions
|
@ -191,7 +191,7 @@ impl ProjectDiagnosticsEditor {
|
||||||
|
|
||||||
for selection in editor.local_selections::<usize>(cx) {
|
for selection in editor.local_selections::<usize>(cx) {
|
||||||
for (buffer, mut range) in
|
for (buffer, mut range) in
|
||||||
excerpts.excerpted_buffers(selection.start..selection.end, cx)
|
excerpts.range_to_buffer_ranges(selection.start..selection.end, cx)
|
||||||
{
|
{
|
||||||
if selection.reversed {
|
if selection.reversed {
|
||||||
mem::swap(&mut range.start, &mut range.end);
|
mem::swap(&mut range.start, &mut range.end);
|
||||||
|
|
|
@ -2114,6 +2114,35 @@ impl Editor {
|
||||||
Some(cx.spawn(|workspace, mut cx| async move {
|
Some(cx.spawn(|workspace, mut cx| async move {
|
||||||
let project_transaction = apply_code_actions.await?;
|
let project_transaction = apply_code_actions.await?;
|
||||||
|
|
||||||
|
// If the code action's edits are all contained within this editor, then
|
||||||
|
// avoid opening a new editor to display them.
|
||||||
|
let mut entries = project_transaction.0.iter();
|
||||||
|
if let Some((buffer, transaction)) = entries.next() {
|
||||||
|
if entries.next().is_none() {
|
||||||
|
let excerpt = editor.read_with(&cx, |editor, cx| {
|
||||||
|
editor
|
||||||
|
.buffer()
|
||||||
|
.read(cx)
|
||||||
|
.excerpt_containing(editor.newest_anchor_selection().head(), cx)
|
||||||
|
});
|
||||||
|
if let Some((excerpted_buffer, excerpt_range)) = excerpt {
|
||||||
|
if excerpted_buffer == *buffer {
|
||||||
|
let snapshot = buffer.read_with(&cx, |buffer, _| buffer.snapshot());
|
||||||
|
let excerpt_range = excerpt_range.to_offset(&snapshot);
|
||||||
|
if snapshot
|
||||||
|
.edited_ranges_for_transaction(transaction)
|
||||||
|
.all(|range| {
|
||||||
|
excerpt_range.start <= range.start
|
||||||
|
&& excerpt_range.end >= range.end
|
||||||
|
})
|
||||||
|
{
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let mut ranges_to_highlight = Vec::new();
|
let mut ranges_to_highlight = Vec::new();
|
||||||
let excerpt_buffer = cx.add_model(|cx| {
|
let excerpt_buffer = cx.add_model(|cx| {
|
||||||
let mut multibuffer = MultiBuffer::new(replica_id).with_title(title);
|
let mut multibuffer = MultiBuffer::new(replica_id).with_title(title);
|
||||||
|
|
|
@ -779,12 +779,35 @@ impl MultiBuffer {
|
||||||
.map_or(Vec::new(), |state| state.excerpts.clone())
|
.map_or(Vec::new(), |state| state.excerpts.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn excerpted_buffers<'a, T: ToOffset>(
|
pub fn excerpt_containing(
|
||||||
|
&self,
|
||||||
|
position: impl ToOffset,
|
||||||
|
cx: &AppContext,
|
||||||
|
) -> Option<(ModelHandle<Buffer>, Range<text::Anchor>)> {
|
||||||
|
let snapshot = self.read(cx);
|
||||||
|
let position = position.to_offset(&snapshot);
|
||||||
|
|
||||||
|
let mut cursor = snapshot.excerpts.cursor::<usize>();
|
||||||
|
cursor.seek(&position, Bias::Right, &());
|
||||||
|
cursor.item().map(|excerpt| {
|
||||||
|
(
|
||||||
|
self.buffers
|
||||||
|
.borrow()
|
||||||
|
.get(&excerpt.buffer_id)
|
||||||
|
.unwrap()
|
||||||
|
.buffer
|
||||||
|
.clone(),
|
||||||
|
excerpt.range.clone(),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn range_to_buffer_ranges<'a, T: ToOffset>(
|
||||||
&'a self,
|
&'a self,
|
||||||
range: Range<T>,
|
range: Range<T>,
|
||||||
cx: &AppContext,
|
cx: &AppContext,
|
||||||
) -> Vec<(ModelHandle<Buffer>, Range<usize>)> {
|
) -> Vec<(ModelHandle<Buffer>, Range<usize>)> {
|
||||||
let snapshot = self.snapshot(cx);
|
let snapshot = self.read(cx);
|
||||||
let start = range.start.to_offset(&snapshot);
|
let start = range.start.to_offset(&snapshot);
|
||||||
let end = range.end.to_offset(&snapshot);
|
let end = range.end.to_offset(&snapshot);
|
||||||
|
|
||||||
|
@ -3538,8 +3561,9 @@ mod tests {
|
||||||
start_ix..end_ix
|
start_ix..end_ix
|
||||||
);
|
);
|
||||||
|
|
||||||
let excerpted_buffer_ranges =
|
let excerpted_buffer_ranges = multibuffer
|
||||||
multibuffer.read(cx).excerpted_buffers(start_ix..end_ix, cx);
|
.read(cx)
|
||||||
|
.range_to_buffer_ranges(start_ix..end_ix, cx);
|
||||||
let excerpted_buffers_text = excerpted_buffer_ranges
|
let excerpted_buffers_text = excerpted_buffer_ranges
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(buffer, buffer_range)| {
|
.map(|(buffer, buffer_range)| {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue