mirror of
https://github.com/zed-industries/zed.git
synced 2024-09-20 02:47:34 +03:00
Merge pull request #759 from zed-industries/breadcrumb-multibuffer-fix
Update breadcrumbs when multibuffers' excerpts change
This commit is contained in:
commit
ce547010d8
@ -16,6 +16,7 @@ use language::{
|
|||||||
Bias, Buffer, Diagnostic, DiagnosticEntry, DiagnosticSeverity, Point, Selection, SelectionGoal,
|
Bias, Buffer, Diagnostic, DiagnosticEntry, DiagnosticSeverity, Point, Selection, SelectionGoal,
|
||||||
};
|
};
|
||||||
use project::{DiagnosticSummary, Project, ProjectPath};
|
use project::{DiagnosticSummary, Project, ProjectPath};
|
||||||
|
use settings::Settings;
|
||||||
use std::{
|
use std::{
|
||||||
any::{Any, TypeId},
|
any::{Any, TypeId},
|
||||||
cmp::Ordering,
|
cmp::Ordering,
|
||||||
@ -26,7 +27,6 @@ use std::{
|
|||||||
};
|
};
|
||||||
use util::TryFutureExt;
|
use util::TryFutureExt;
|
||||||
use workspace::{ItemHandle as _, ItemNavHistory, Workspace};
|
use workspace::{ItemHandle as _, ItemNavHistory, Workspace};
|
||||||
use settings::Settings;
|
|
||||||
|
|
||||||
action!(Deploy);
|
action!(Deploy);
|
||||||
|
|
||||||
|
@ -788,7 +788,7 @@ impl MultiBuffer {
|
|||||||
old: edit_start..edit_start,
|
old: edit_start..edit_start,
|
||||||
new: edit_start..edit_end,
|
new: edit_start..edit_end,
|
||||||
}]);
|
}]);
|
||||||
|
cx.emit(Event::Edited);
|
||||||
cx.notify();
|
cx.notify();
|
||||||
ids
|
ids
|
||||||
}
|
}
|
||||||
@ -802,10 +802,12 @@ impl MultiBuffer {
|
|||||||
snapshot.trailing_excerpt_update_count += 1;
|
snapshot.trailing_excerpt_update_count += 1;
|
||||||
snapshot.is_dirty = false;
|
snapshot.is_dirty = false;
|
||||||
snapshot.has_conflict = false;
|
snapshot.has_conflict = false;
|
||||||
|
|
||||||
self.subscriptions.publish_mut([Edit {
|
self.subscriptions.publish_mut([Edit {
|
||||||
old: 0..prev_len,
|
old: 0..prev_len,
|
||||||
new: 0..0,
|
new: 0..0,
|
||||||
}]);
|
}]);
|
||||||
|
cx.emit(Event::Edited);
|
||||||
cx.notify();
|
cx.notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -993,6 +995,7 @@ impl MultiBuffer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.subscriptions.publish_mut(edits);
|
self.subscriptions.publish_mut(edits);
|
||||||
|
cx.emit(Event::Edited);
|
||||||
cx.notify();
|
cx.notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2928,7 +2931,7 @@ mod tests {
|
|||||||
use gpui::MutableAppContext;
|
use gpui::MutableAppContext;
|
||||||
use language::{Buffer, Rope};
|
use language::{Buffer, Rope};
|
||||||
use rand::prelude::*;
|
use rand::prelude::*;
|
||||||
use std::env;
|
use std::{env, rc::Rc};
|
||||||
use text::{Point, RandomCharIter};
|
use text::{Point, RandomCharIter};
|
||||||
use util::test::sample_text;
|
use util::test::sample_text;
|
||||||
|
|
||||||
@ -2985,6 +2988,15 @@ mod tests {
|
|||||||
let buffer_2 = cx.add_model(|cx| Buffer::new(0, sample_text(6, 6, 'g'), cx));
|
let buffer_2 = cx.add_model(|cx| Buffer::new(0, sample_text(6, 6, 'g'), cx));
|
||||||
let multibuffer = cx.add_model(|_| MultiBuffer::new(0));
|
let multibuffer = cx.add_model(|_| MultiBuffer::new(0));
|
||||||
|
|
||||||
|
let events = Rc::new(RefCell::new(Vec::<Event>::new()));
|
||||||
|
multibuffer.update(cx, |_, cx| {
|
||||||
|
let events = events.clone();
|
||||||
|
cx.subscribe(&multibuffer, move |_, _, event, _| {
|
||||||
|
events.borrow_mut().push(event.clone())
|
||||||
|
})
|
||||||
|
.detach();
|
||||||
|
});
|
||||||
|
|
||||||
let subscription = multibuffer.update(cx, |multibuffer, cx| {
|
let subscription = multibuffer.update(cx, |multibuffer, cx| {
|
||||||
let subscription = multibuffer.subscribe();
|
let subscription = multibuffer.subscribe();
|
||||||
multibuffer.push_excerpts(buffer_1.clone(), [Point::new(1, 2)..Point::new(2, 5)], cx);
|
multibuffer.push_excerpts(buffer_1.clone(), [Point::new(1, 2)..Point::new(2, 5)], cx);
|
||||||
@ -3009,6 +3021,12 @@ mod tests {
|
|||||||
subscription
|
subscription
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Adding excerpts emits an edited event.
|
||||||
|
assert_eq!(
|
||||||
|
events.borrow().as_slice(),
|
||||||
|
&[Event::Edited, Event::Edited, Event::Edited]
|
||||||
|
);
|
||||||
|
|
||||||
let snapshot = multibuffer.read(cx).snapshot(cx);
|
let snapshot = multibuffer.read(cx).snapshot(cx);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
snapshot.text(),
|
snapshot.text(),
|
||||||
|
@ -1633,93 +1633,84 @@ impl Project {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
let progress = match progress.value {
|
||||||
match progress.value {
|
lsp::ProgressParamsValue::WorkDone(value) => value,
|
||||||
lsp::ProgressParamsValue::WorkDone(progress) => match progress {
|
};
|
||||||
lsp::WorkDoneProgress::Begin(_) => {
|
let language_server_status =
|
||||||
let language_server_status =
|
if let Some(status) = self.language_server_statuses.get_mut(&server_id) {
|
||||||
if let Some(status) = self.language_server_statuses.get_mut(&server_id) {
|
status
|
||||||
status
|
} else {
|
||||||
} else {
|
return;
|
||||||
return;
|
};
|
||||||
};
|
match progress {
|
||||||
|
lsp::WorkDoneProgress::Begin(_) => {
|
||||||
if Some(token.as_str()) == disk_based_diagnostics_progress_token {
|
if Some(token.as_str()) == disk_based_diagnostics_progress_token {
|
||||||
language_server_status.pending_diagnostic_updates += 1;
|
language_server_status.pending_diagnostic_updates += 1;
|
||||||
if language_server_status.pending_diagnostic_updates == 1 {
|
if language_server_status.pending_diagnostic_updates == 1 {
|
||||||
self.disk_based_diagnostics_started(cx);
|
self.disk_based_diagnostics_started(cx);
|
||||||
self.broadcast_language_server_update(
|
|
||||||
server_id,
|
|
||||||
proto::update_language_server::Variant::DiskBasedDiagnosticsUpdating(
|
|
||||||
proto::LspDiskBasedDiagnosticsUpdating {},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
self.on_lsp_work_start(server_id, token.clone(), cx);
|
|
||||||
self.broadcast_language_server_update(
|
self.broadcast_language_server_update(
|
||||||
server_id,
|
server_id,
|
||||||
proto::update_language_server::Variant::WorkStart(
|
proto::update_language_server::Variant::DiskBasedDiagnosticsUpdating(
|
||||||
proto::LspWorkStart { token },
|
proto::LspDiskBasedDiagnosticsUpdating {},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
self.on_lsp_work_start(server_id, token.clone(), cx);
|
||||||
|
self.broadcast_language_server_update(
|
||||||
|
server_id,
|
||||||
|
proto::update_language_server::Variant::WorkStart(proto::LspWorkStart {
|
||||||
|
token,
|
||||||
|
}),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
lsp::WorkDoneProgress::Report(report) => {
|
}
|
||||||
if Some(token.as_str()) != disk_based_diagnostics_progress_token {
|
lsp::WorkDoneProgress::Report(report) => {
|
||||||
self.on_lsp_work_progress(
|
if Some(token.as_str()) != disk_based_diagnostics_progress_token {
|
||||||
server_id,
|
self.on_lsp_work_progress(
|
||||||
token.clone(),
|
server_id,
|
||||||
LanguageServerProgress {
|
token.clone(),
|
||||||
message: report.message.clone(),
|
LanguageServerProgress {
|
||||||
percentage: report.percentage.map(|p| p as usize),
|
message: report.message.clone(),
|
||||||
last_update_at: Instant::now(),
|
percentage: report.percentage.map(|p| p as usize),
|
||||||
},
|
last_update_at: Instant::now(),
|
||||||
cx,
|
},
|
||||||
);
|
cx,
|
||||||
self.broadcast_language_server_update(
|
);
|
||||||
server_id,
|
self.broadcast_language_server_update(
|
||||||
proto::update_language_server::Variant::WorkProgress(
|
server_id,
|
||||||
proto::LspWorkProgress {
|
proto::update_language_server::Variant::WorkProgress(
|
||||||
token,
|
proto::LspWorkProgress {
|
||||||
message: report.message,
|
|
||||||
percentage: report.percentage.map(|p| p as u32),
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lsp::WorkDoneProgress::End(_) => {
|
|
||||||
if Some(token.as_str()) == disk_based_diagnostics_progress_token {
|
|
||||||
let language_server_status = if let Some(status) =
|
|
||||||
self.language_server_statuses.get_mut(&server_id)
|
|
||||||
{
|
|
||||||
status
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
|
|
||||||
language_server_status.pending_diagnostic_updates -= 1;
|
|
||||||
if language_server_status.pending_diagnostic_updates == 0 {
|
|
||||||
self.disk_based_diagnostics_finished(cx);
|
|
||||||
self.broadcast_language_server_update(
|
|
||||||
server_id,
|
|
||||||
proto::update_language_server::Variant::DiskBasedDiagnosticsUpdated(
|
|
||||||
proto::LspDiskBasedDiagnosticsUpdated {},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
self.on_lsp_work_end(server_id, token.clone(), cx);
|
|
||||||
self.broadcast_language_server_update(
|
|
||||||
server_id,
|
|
||||||
proto::update_language_server::Variant::WorkEnd(proto::LspWorkEnd {
|
|
||||||
token,
|
token,
|
||||||
}),
|
message: report.message,
|
||||||
|
percentage: report.percentage.map(|p| p as u32),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lsp::WorkDoneProgress::End(_) => {
|
||||||
|
if Some(token.as_str()) == disk_based_diagnostics_progress_token {
|
||||||
|
language_server_status.pending_diagnostic_updates -= 1;
|
||||||
|
if language_server_status.pending_diagnostic_updates == 0 {
|
||||||
|
self.disk_based_diagnostics_finished(cx);
|
||||||
|
self.broadcast_language_server_update(
|
||||||
|
server_id,
|
||||||
|
proto::update_language_server::Variant::DiskBasedDiagnosticsUpdated(
|
||||||
|
proto::LspDiskBasedDiagnosticsUpdated {},
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
self.on_lsp_work_end(server_id, token.clone(), cx);
|
||||||
|
self.broadcast_language_server_update(
|
||||||
|
server_id,
|
||||||
|
proto::update_language_server::Variant::WorkEnd(proto::LspWorkEnd {
|
||||||
|
token,
|
||||||
|
}),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user