Use read-only access methods for read-only entity operations (#31479)

Another follow-up to #31254

Release Notes:

- N/A
This commit is contained in:
Joseph T. Lyons 2025-05-26 23:04:31 -04:00 committed by GitHub
parent 4a577fff4a
commit c208532693
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
79 changed files with 319 additions and 306 deletions

View file

@ -553,7 +553,7 @@ impl ContextPickerCompletionProvider {
let url_to_fetch = url_to_fetch.clone();
cx.spawn(async move |cx| {
if let Some(context) = context_store
.update(cx, |context_store, _| {
.read_with(cx, |context_store, _| {
context_store.get_url_context(url_to_fetch.clone())
})
.ok()?

View file

@ -1903,7 +1903,7 @@ impl ContextEditor {
.on_click(cx.listener(|this, _event, _window, cx| {
let client = this
.workspace
.update(cx, |workspace, _| workspace.client().clone())
.read_with(cx, |workspace, _| workspace.client().clone())
.log_err();
if let Some(client) = client {

View file

@ -338,7 +338,7 @@ where
let handle = self
.active_context_editor
.update(cx, |this, _| this.slash_menu_handle.clone())
.read_with(cx, |this, _| this.slash_menu_handle.clone())
.ok();
PopoverMenu::new("model-switcher")
.menu(move |_window, _cx| Some(picker_view.clone()))

View file

@ -19812,7 +19812,7 @@ impl SemanticsProvider for Entity<Project> {
PrepareRenameResponse::InvalidPosition => None,
PrepareRenameResponse::OnlyUnpreparedRenameSupported => {
// Fallback on using TreeSitter info to determine identifier range
buffer.update(cx, |buffer, _| {
buffer.read_with(cx, |buffer, _| {
let snapshot = buffer.snapshot();
let (range, kind) = snapshot.surrounding_word(position);
if kind != Some(CharKind::Word) {

View file

@ -275,7 +275,7 @@ impl Tool for TerminalTool {
let exit_status = terminal
.update(cx, |terminal, cx| terminal.wait_for_completed_task(cx))?
.await;
let (content, content_line_count) = terminal.update(cx, |terminal, _| {
let (content, content_line_count) = terminal.read_with(cx, |terminal, _| {
(terminal.get_content(), terminal.total_lines())
})?;

View file

@ -116,7 +116,7 @@ impl ActiveCall {
envelope: TypedEnvelope<proto::IncomingCall>,
mut cx: AsyncApp,
) -> Result<proto::Ack> {
let user_store = this.update(&mut cx, |this, _| this.user_store.clone())?;
let user_store = this.read_with(&mut cx, |this, _| this.user_store.clone())?;
let call = IncomingCall {
room_id: envelope.payload.room_id,
participants: user_store

View file

@ -387,7 +387,7 @@ impl ChannelChat {
let loaded_messages = messages_from_proto(proto_messages, &user_store, cx).await?;
let first_loaded_message_id = loaded_messages.first().map(|m| m.id);
let loaded_message_ids = this.update(cx, |this, _| {
let loaded_message_ids = this.read_with(cx, |this, _| {
let mut loaded_message_ids: HashSet<u64> = HashSet::default();
for message in loaded_messages.iter() {
if let Some(saved_message_id) = message.id.into() {
@ -457,7 +457,7 @@ impl ChannelChat {
)
.await?;
let pending_messages = this.update(cx, |this, _| {
let pending_messages = this.read_with(cx, |this, _| {
this.pending_messages().cloned().collect::<Vec<_>>()
})?;
@ -531,7 +531,7 @@ impl ChannelChat {
message: TypedEnvelope<proto::ChannelMessageSent>,
mut cx: AsyncApp,
) -> Result<()> {
let user_store = this.update(&mut cx, |this, _| this.user_store.clone())?;
let user_store = this.read_with(&mut cx, |this, _| this.user_store.clone())?;
let message = message.payload.message.context("empty message")?;
let message_id = message.id;
@ -563,7 +563,7 @@ impl ChannelChat {
message: TypedEnvelope<proto::ChannelMessageUpdate>,
mut cx: AsyncApp,
) -> Result<()> {
let user_store = this.update(&mut cx, |this, _| this.user_store.clone())?;
let user_store = this.read_with(&mut cx, |this, _| this.user_store.clone())?;
let message = message.payload.message.context("empty message")?;
let message = ChannelMessage::from_proto(message, &user_store, &mut cx).await?;

View file

@ -333,7 +333,7 @@ impl ChannelStore {
if let Some(request) = request {
let response = request.await?;
let this = this.upgrade().context("channel store dropped")?;
let user_store = this.update(cx, |this, _| this.user_store.clone())?;
let user_store = this.read_with(cx, |this, _| this.user_store.clone())?;
ChannelMessage::from_proto_vec(response.messages, &user_store, cx).await
} else {
Ok(Vec::new())
@ -478,7 +478,7 @@ impl ChannelStore {
hash_map::Entry::Vacant(e) => {
let task = cx
.spawn(async move |this, cx| {
let channel = this.update(cx, |this, _| {
let channel = this.read_with(cx, |this, _| {
this.channel_for_id(channel_id).cloned().ok_or_else(|| {
Arc::new(anyhow!("no channel for id: {channel_id}"))
})
@ -848,7 +848,7 @@ impl ChannelStore {
message: TypedEnvelope<proto::UpdateChannels>,
mut cx: AsyncApp,
) -> Result<()> {
this.update(&mut cx, |this, _| {
this.read_with(&mut cx, |this, _| {
this.update_channels_tx
.unbounded_send(message.payload)
.unwrap();

View file

@ -1850,7 +1850,7 @@ mod tests {
let (done_tx2, done_rx2) = smol::channel::unbounded();
AnyProtoClient::from(client.clone()).add_entity_message_handler(
move |entity: Entity<TestEntity>, _: TypedEnvelope<proto::JoinProject>, mut cx| {
match entity.update(&mut cx, |entity, _| entity.id).unwrap() {
match entity.read_with(&mut cx, |entity, _| entity.id).unwrap() {
1 => done_tx1.try_send(()).unwrap(),
2 => done_tx2.try_send(()).unwrap(),
_ => unreachable!(),

View file

@ -324,7 +324,7 @@ impl UserStore {
message: TypedEnvelope<proto::UpdateContacts>,
mut cx: AsyncApp,
) -> Result<()> {
this.update(&mut cx, |this, _| {
this.read_with(&mut cx, |this, _| {
this.update_contacts_tx
.unbounded_send(UpdateContacts::Update(message.payload))
.unwrap();
@ -660,7 +660,7 @@ impl UserStore {
.await?;
}
this.update(cx, |this, _| {
this.read_with(cx, |this, _| {
user_ids
.iter()
.map(|user_id| {
@ -703,7 +703,7 @@ impl UserStore {
let load_users = self.get_users(vec![user_id], cx);
cx.spawn(async move |this, cx| {
load_users.await?;
this.update(cx, |this, _| {
this.read_with(cx, |this, _| {
this.users
.get(&user_id)
.cloned()

View file

@ -352,7 +352,7 @@ impl MessageEditor {
) -> Option<(Anchor, String, Vec<StringMatchCandidate>)> {
let end_offset = end_anchor.to_offset(buffer.read(cx));
let query = buffer.update(cx, |buffer, _| {
let query = buffer.read_with(cx, |buffer, _| {
let mut query = String::new();
for ch in buffer.reversed_chars_at(end_offset).take(100) {
if ch == '@' {
@ -410,7 +410,7 @@ impl MessageEditor {
let end_offset = end_anchor.to_offset(buffer.read(cx));
let query = buffer.update(cx, |buffer, _| {
let query = buffer.read_with(cx, |buffer, _| {
let mut query = String::new();
for ch in buffer.reversed_chars_at(end_offset).take(100) {
if ch == ':' {

View file

@ -428,7 +428,7 @@ impl CollabPanel {
fn serialize(&mut self, cx: &mut Context<Self>) {
let Some(serialization_key) = self
.workspace
.update(cx, |workspace, _| CollabPanel::serialization_key(workspace))
.read_with(cx, |workspace, _| CollabPanel::serialization_key(workspace))
.ok()
.flatten()
else {

View file

@ -557,7 +557,7 @@ mod tests {
.clone()
});
palette.update(cx, |palette, _| {
palette.read_with(cx, |palette, _| {
assert!(palette.delegate.commands.len() > 5);
let is_sorted =
|actions: &[Command]| actions.windows(2).all(|pair| pair[0].name <= pair[1].name);
@ -566,7 +566,7 @@ mod tests {
cx.simulate_input("bcksp");
palette.update(cx, |palette, _| {
palette.read_with(cx, |palette, _| {
assert_eq!(palette.delegate.matches[0].string, "editor: backspace");
});
@ -595,7 +595,7 @@ mod tests {
.picker
.clone()
});
palette.update(cx, |palette, _| {
palette.read_with(cx, |palette, _| {
assert!(palette.delegate.matches.is_empty())
});
}
@ -630,7 +630,7 @@ mod tests {
});
cx.simulate_input("Editor:: Backspace");
palette.update(cx, |palette, _| {
palette.read_with(cx, |palette, _| {
assert_eq!(palette.delegate.matches[0].string, "editor: backspace");
});
}

View file

@ -232,7 +232,7 @@ impl RegisteredBuffer {
Some(buffer.snapshot.version.clone())
})
.ok()??;
let new_snapshot = buffer.update(cx, |buffer, _| buffer.snapshot()).ok()?;
let new_snapshot = buffer.read_with(cx, |buffer, _| buffer.snapshot()).ok()?;
let content_changes = cx
.background_spawn({

View file

@ -158,7 +158,7 @@ impl PickerDelegate for AttachModalDelegate {
) -> gpui::Task<()> {
cx.spawn(async move |this, cx| {
let Some(processes) = this
.update(cx, |this, _| this.delegate.candidates.clone())
.read_with(cx, |this, _| this.delegate.candidates.clone())
.ok()
else {
return;
@ -309,7 +309,7 @@ impl PickerDelegate for AttachModalDelegate {
#[cfg(any(test, feature = "test-support"))]
pub(crate) fn _process_names(modal: &AttachModal, cx: &mut Context<AttachModal>) -> Vec<String> {
modal.picker.update(cx, |picker, _| {
modal.picker.read_with(cx, |picker, _| {
picker
.delegate
.matches

View file

@ -955,7 +955,7 @@ impl DebugPanel {
cx.spawn_in(window, async move |workspace, cx| {
let serialized_scenario = serialized_scenario?;
let fs =
workspace.update(cx, |workspace, _| workspace.app_state().fs.clone())?;
workspace.read_with(cx, |workspace, _| workspace.app_state().fs.clone())?;
path.push(paths::local_settings_folder_relative_path());
if !fs.is_dir(path.as_path()).await {
@ -1014,7 +1014,7 @@ async fn register_session_inner(
session: Entity<Session>,
cx: &mut AsyncWindowContext,
) -> Result<Entity<DebugSession>> {
let adapter_name = session.update(cx, |session, _| session.adapter())?;
let adapter_name = session.read_with(cx, |session, _| session.adapter())?;
this.update_in(cx, |_, window, cx| {
cx.subscribe_in(
&session,

View file

@ -319,7 +319,7 @@ pub(crate) fn new_debugger_pane(
if let Some(tab) = dragged_item.downcast_ref::<DraggedTab>() {
let is_current_pane = tab.pane == cx.entity();
let Some(can_drag_away) = weak_running
.update(cx, |running_state, _| {
.read_with(cx, |running_state, _| {
let current_panes = running_state.panes.panes();
!current_panes.contains(&&tab.pane)
|| current_panes.len() > 1
@ -952,7 +952,7 @@ impl RunningState {
let running = cx.entity();
let Ok(project) = self
.workspace
.update(cx, |workspace, _| workspace.project().clone())
.read_with(cx, |workspace, _| workspace.project().clone())
else {
return Task::ready(Err(anyhow!("no workspace")));
};

View file

@ -109,7 +109,7 @@ impl BreakpointList {
.update(cx, |this, cx| this.find_or_create_worktree(path, false, cx));
cx.spawn_in(window, async move |this, cx| {
let (worktree, relative_path) = task.await?;
let worktree_id = worktree.update(cx, |this, _| this.id())?;
let worktree_id = worktree.read_with(cx, |this, _| this.id())?;
let item = this
.update_in(cx, |this, window, cx| {
this.workspace.update(cx, |this, cx| {

View file

@ -280,7 +280,7 @@ impl StackFrameList {
})
})??
.await?;
let position = buffer.update(cx, |this, _| {
let position = buffer.read_with(cx, |this, _| {
this.snapshot().anchor_after(PointUtf16::new(row, 0))
})?;
this.update_in(cx, |this, window, cx| {

View file

@ -148,7 +148,7 @@ impl StackTraceView {
let stack_frames = self
.stack_frame_list
.update(cx, |list, _| list.flatten_entries(false));
.read_with(cx, |list, _| list.flatten_entries(false));
let frames_to_open: Vec<_> = stack_frames
.into_iter()
@ -237,7 +237,7 @@ impl StackTraceView {
let stack_frames = self
.stack_frame_list
.update(cx, |session, _| session.flatten_entries(false));
.read_with(cx, |session, _| session.flatten_entries(false));
let active_idx = self
.selected_stack_frame_id

View file

@ -256,7 +256,7 @@ impl DiagnosticBlock {
if let Some(diagnostics_editor) = diagnostics_editor {
if let Some(diagnostic) = diagnostics_editor
.update(cx, |diagnostics, _| {
.read_with(cx, |diagnostics, _| {
diagnostics
.diagnostics
.get(&buffer_id)

View file

@ -39,12 +39,12 @@ pub fn switch_source_header(
else {
return Ok(());
};
let source_file = buffer.update(cx, |buffer, _| {
let source_file = buffer.read_with(cx, |buffer, _| {
buffer.file().map(|file| file.path()).map(|path| path.to_string_lossy().to_string()).unwrap_or_else(|| "Unknown".to_string())
})?;
let switch_source_header = if let Some((client, project_id)) = upstream_client {
let buffer_id = buffer.update(cx, |buffer, _| buffer.remote_id())?;
let buffer_id = buffer.read_with(cx, |buffer, _| buffer.remote_id())?;
let request = proto::LspExtSwitchSourceHeader {
project_id,
buffer_id: buffer_id.to_proto(),

View file

@ -14610,7 +14610,7 @@ impl Editor {
let location = match location_task {
Some(task) => Some({
let target_buffer_handle = task.await.context("open local buffer")?;
let range = target_buffer_handle.update(cx, |target_buffer, _| {
let range = target_buffer_handle.read_with(cx, |target_buffer, _| {
let target_start = target_buffer
.clip_point_utf16(point_from_lsp(lsp_location.range.start), Bias::Left);
let target_end = target_buffer
@ -14799,7 +14799,7 @@ impl Editor {
} else {
if PreviewTabsSettings::get_global(cx).enable_preview_from_code_navigation {
let (preview_item_id, preview_item_idx) =
workspace.active_pane().update(cx, |pane, _| {
workspace.active_pane().read_with(cx, |pane, _| {
(pane.preview_item_id(), pane.preview_item_idx())
});
@ -20115,7 +20115,7 @@ impl SemanticsProvider for Entity<Project> {
PrepareRenameResponse::InvalidPosition => None,
PrepareRenameResponse::OnlyUnpreparedRenameSupported => {
// Fallback on using TreeSitter info to determine identifier range
buffer.update(cx, |buffer, _| {
buffer.read_with(cx, |buffer, _| {
let snapshot = buffer.snapshot();
let (range, kind) = snapshot.surrounding_word(position);
if kind != Some(CharKind::Word) {

View file

@ -2193,7 +2193,7 @@ impl EditorElement {
) {
let mouse_position = window.mouse_position();
let mouse_over_inline_blame = parent_bounds.contains(&mouse_position);
let mouse_over_popover = self.editor.update(cx, |editor, _| {
let mouse_over_popover = self.editor.read_with(cx, |editor, _| {
editor
.inline_blame_popover
.as_ref()
@ -2209,7 +2209,7 @@ impl EditorElement {
}
});
let should_draw = self.editor.update(cx, |editor, _| {
let should_draw = self.editor.read_with(cx, |editor, _| {
editor
.inline_blame_popover
.as_ref()
@ -2243,7 +2243,7 @@ impl EditorElement {
if let Some(mut element) = maybe_element {
let size = element.layout_as_root(AvailableSpace::min_size(), window, cx);
let origin = self.editor.update(cx, |editor, _| {
let origin = self.editor.read_with(cx, |editor, _| {
let target_point = editor
.inline_blame_popover
.as_ref()
@ -4322,7 +4322,7 @@ impl EditorElement {
..Default::default()
};
window.with_text_style(Some(text_style), |window| {
let mut element = self.editor.update(cx, |editor, _| {
let mut element = self.editor.read_with(cx, |editor, _| {
let mouse_context_menu = editor.mouse_context_menu.as_ref()?;
let context_menu = mouse_context_menu.context_menu.clone();

View file

@ -786,7 +786,7 @@ mod tests {
})
.await
.unwrap();
let buffer_id = buffer.update(cx, |buffer, _| buffer.remote_id());
let buffer_id = buffer.read_with(cx, |buffer, _| buffer.remote_id());
let git_blame = cx.new(|cx| GitBlame::new(buffer.clone(), project, false, true, cx));
@ -896,7 +896,7 @@ mod tests {
})
.await
.unwrap();
let buffer_id = buffer.update(cx, |buffer, _| buffer.remote_id());
let buffer_id = buffer.read_with(cx, |buffer, _| buffer.remote_id());
let git_blame = cx.new(|cx| GitBlame::new(buffer.clone(), project, false, true, cx));

View file

@ -539,7 +539,7 @@ pub fn show_link_definition(
let result = match &trigger_point {
TriggerPoint::Text(_) => {
if let Some((url_range, url)) = find_url(&buffer, buffer_position, cx.clone()) {
this.update(cx, |_, _| {
this.read_with(cx, |_, _| {
let range = maybe!({
let start =
snapshot.anchor_in_excerpt(excerpt_id, url_range.start)?;
@ -665,7 +665,7 @@ pub(crate) fn find_url(
) -> Option<(Range<text::Anchor>, String)> {
const LIMIT: usize = 2048;
let Ok(snapshot) = buffer.update(&mut cx, |buffer, _| buffer.snapshot()) else {
let Ok(snapshot) = buffer.read_with(&mut cx, |buffer, _| buffer.snapshot()) else {
return None;
};
@ -727,7 +727,7 @@ pub(crate) fn find_url_from_range(
) -> Option<String> {
const LIMIT: usize = 2048;
let Ok(snapshot) = buffer.update(&mut cx, |buffer, _| buffer.snapshot()) else {
let Ok(snapshot) = buffer.read_with(&mut cx, |buffer, _| buffer.snapshot()) else {
return None;
};
@ -786,7 +786,7 @@ pub(crate) async fn find_file(
cx: &mut AsyncWindowContext,
) -> Option<(Range<text::Anchor>, ResolvedPath)> {
let project = project?;
let snapshot = buffer.update(cx, |buffer, _| buffer.snapshot()).ok()?;
let snapshot = buffer.read_with(cx, |buffer, _| buffer.snapshot()).ok()?;
let scope = snapshot.language_scope_at(position);
let (range, candidate_file_path) = surrounding_filename(snapshot, position)?;

View file

@ -165,7 +165,7 @@ pub fn hover_at_inlay(
this.hover_state.diagnostic_popover = None;
})?;
let language_registry = project.update(cx, |p, _| p.languages().clone())?;
let language_registry = project.read_with(cx, |p, _| p.languages().clone())?;
let blocks = vec![inlay_hover.tooltip];
let parsed_content = parse_blocks(&blocks, &language_registry, None, cx).await;

View file

@ -639,7 +639,7 @@ impl InlayHintCache {
if let Some(resolved_hint_task) = resolved_hint_task {
let mut resolved_hint =
resolved_hint_task.await.context("hint resolve task")?;
editor.update(cx, |editor, _| {
editor.read_with(cx, |editor, _| {
if let Some(excerpt_hints) =
editor.inlay_hint_cache.hints.get(&excerpt_id)
{
@ -933,7 +933,7 @@ fn fetch_and_update_hints(
cx: &mut Context<Editor>,
) -> Task<anyhow::Result<()>> {
cx.spawn(async move |editor, cx|{
let buffer_snapshot = excerpt_buffer.update(cx, |buffer, _| buffer.snapshot())?;
let buffer_snapshot = excerpt_buffer.read_with(cx, |buffer, _| buffer.snapshot())?;
let (lsp_request_limiter, multi_buffer_snapshot) =
editor.update(cx, |editor, cx| {
let multi_buffer_snapshot =
@ -1009,7 +1009,7 @@ fn fetch_and_update_hints(
.ok()
.flatten();
let cached_excerpt_hints = editor.update(cx, |editor, _| {
let cached_excerpt_hints = editor.read_with(cx, |editor, _| {
editor
.inlay_hint_cache
.hints
@ -2521,7 +2521,7 @@ pub mod tests {
"Single buffer should produce a single excerpt with visible range"
);
let (_, (excerpt_buffer, _, excerpt_visible_range)) = ranges.into_iter().next().unwrap();
excerpt_buffer.update(cx, |buffer, _| {
excerpt_buffer.read_with(cx, |buffer, _| {
let snapshot = buffer.snapshot();
let start = buffer
.anchor_before(excerpt_visible_range.start)

View file

@ -841,7 +841,7 @@ impl Item for Editor {
// so that language servers or other downstream listeners of save events get notified.
let (dirty_buffers, clean_buffers) = buffers.into_iter().partition(|buffer| {
buffer
.update(cx, |buffer, _| buffer.is_dirty() || buffer.has_conflict())
.read_with(cx, |buffer, _| buffer.is_dirty() || buffer.has_conflict())
.unwrap_or(false)
});
@ -1089,7 +1089,7 @@ impl SerializableItem for Editor {
let project = project.clone();
async move |cx| {
let language_registry =
project.update(cx, |project, _| project.languages().clone())?;
project.read_with(cx, |project, _| project.languages().clone())?;
let language = if let Some(language_name) = language {
// We don't fail here, because we'd rather not set the language if the name changed
@ -2032,7 +2032,7 @@ mod tests {
{
let project = Project::test(fs.clone(), [path!("/file.rs").as_ref()], cx).await;
// Add Rust to the language, so that we can restore the language of the buffer
project.update(cx, |project, _| project.languages().add(rust_language()));
project.read_with(cx, |project, _| project.languages().add(rust_language()));
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));

View file

@ -81,7 +81,7 @@ async fn lsp_task_context(
cx: &mut AsyncApp,
) -> Option<TaskContext> {
let worktree_store = project
.update(cx, |project, _| project.worktree_store())
.read_with(cx, |project, _| project.worktree_store())
.ok()?;
let worktree_abs_path = cx

View file

@ -73,7 +73,7 @@ pub fn go_to_parent_module(
};
let location_links = if let Some((client, project_id)) = upstream_client {
let buffer_id = buffer.update(cx, |buffer, _| buffer.remote_id())?;
let buffer_id = buffer.read_with(cx, |buffer, _| buffer.remote_id())?;
let request = proto::LspExtGoToParentModule {
project_id,
@ -95,7 +95,7 @@ pub fn go_to_parent_module(
.collect::<anyhow::Result<_>>()
.context("go to parent module via collab")?
} else {
let buffer_snapshot = buffer.update(cx, |buffer, _| buffer.snapshot())?;
let buffer_snapshot = buffer.read_with(cx, |buffer, _| buffer.snapshot())?;
let position = trigger_anchor.text_anchor.to_point_utf16(&buffer_snapshot);
project
.update(cx, |project, cx| {
@ -173,7 +173,7 @@ pub fn expand_macro_recursively(
expansion: response.expansion,
}
} else {
let buffer_snapshot = buffer.update(cx, |buffer, _| buffer.snapshot())?;
let buffer_snapshot = buffer.read_with(cx, |buffer, _| buffer.snapshot())?;
let position = trigger_anchor.text_anchor.to_point_utf16(&buffer_snapshot);
project
.update(cx, |project, cx| {
@ -249,7 +249,7 @@ pub fn open_docs(editor: &mut Editor, _: &OpenDocs, window: &mut Window, cx: &mu
};
let docs_urls = if let Some((client, project_id)) = upstream_client {
let buffer_id = buffer.update(cx, |buffer, _| buffer.remote_id())?;
let buffer_id = buffer.read_with(cx, |buffer, _| buffer.remote_id())?;
let request = proto::LspExtOpenDocs {
project_id,
buffer_id: buffer_id.to_proto(),
@ -264,7 +264,7 @@ pub fn open_docs(editor: &mut Editor, _: &OpenDocs, window: &mut Window, cx: &mu
local: response.local,
}
} else {
let buffer_snapshot = buffer.update(cx, |buffer, _| buffer.snapshot())?;
let buffer_snapshot = buffer.read_with(cx, |buffer, _| buffer.snapshot())?;
let position = trigger_anchor.text_anchor.to_point_utf16(&buffer_snapshot);
project
.update(cx, |project, cx| {

View file

@ -644,7 +644,7 @@ pub fn wait_for_lang_server(
let (mut tx, mut rx) = mpsc::channel(1);
let lsp_store = project
.update(cx, |project, _| project.lsp_store())
.read_with(cx, |project, _| project.lsp_store())
.unwrap();
let has_lang_server = buffer

View file

@ -447,9 +447,11 @@ impl ExtensionsPage {
let extension_store = ExtensionStore::global(cx);
let dev_extensions = extension_store.update(cx, |store, _| {
store.dev_extensions().cloned().collect::<Vec<_>>()
});
let dev_extensions = extension_store
.read(cx)
.dev_extensions()
.cloned()
.collect::<Vec<_>>();
let remote_extensions = extension_store.update(cx, |store, cx| {
store.fetch_extensions(search.as_deref(), provides_filter.as_ref(), cx)

View file

@ -1036,7 +1036,7 @@ impl FileFinderDelegate {
) -> Task<()> {
cx.spawn_in(window, async move |picker, cx| {
let Some(project) = picker
.update(cx, |picker, _| picker.delegate.project.clone())
.read_with(cx, |picker, _| picker.delegate.project.clone())
.log_err()
else {
return;

View file

@ -360,7 +360,7 @@ impl PickerDelegate for BranchListDelegate {
}
let current_branch = self.repo.as_ref().map(|repo| {
repo.update(cx, |repo, _| {
repo.read_with(cx, |repo, _| {
repo.branch.as_ref().map(|branch| branch.ref_name.clone())
})
});

View file

@ -4851,7 +4851,7 @@ mod tests {
cx.executor().run_until_parked();
let app_state = workspace.update(cx, |workspace, _| workspace.app_state().clone());
let app_state = workspace.read_with(cx, |workspace, _| workspace.app_state().clone());
let panel = cx.new_window_entity(|window, cx| {
GitPanel::new(workspace.clone(), project.clone(), app_state, window, cx)
});
@ -4862,7 +4862,7 @@ mod tests {
cx.executor().advance_clock(2 * UPDATE_DEBOUNCE);
handle.await;
let entries = panel.update(cx, |panel, _| panel.entries.clone());
let entries = panel.read_with(cx, |panel, _| panel.entries.clone());
pretty_assertions::assert_eq!(
entries,
[
@ -4937,7 +4937,7 @@ mod tests {
});
cx.executor().advance_clock(2 * UPDATE_DEBOUNCE);
handle.await;
let entries = panel.update(cx, |panel, _| panel.entries.clone());
let entries = panel.read_with(cx, |panel, _| panel.entries.clone());
pretty_assertions::assert_eq!(
entries,
[

View file

@ -144,7 +144,7 @@ impl PickerDelegate for PickerPromptDelegate {
cx: &mut Context<Picker<Self>>,
) -> Task<()> {
cx.spawn_in(window, async move |picker, cx| {
let candidates = picker.update(cx, |picker, _| {
let candidates = picker.read_with(cx, |picker, _| {
picker
.delegate
.all_options

View file

@ -1394,7 +1394,7 @@ mod tests {
);
cx.run_until_parked();
let editor = diff.update(cx, |diff, _| diff.editor.clone());
let editor = diff.read_with(cx, |diff, _| diff.editor.clone());
assert_state_with_diff(
&editor,
cx,
@ -1526,7 +1526,7 @@ mod tests {
);
cx.run_until_parked();
let diff_editor = diff.update(cx, |diff, _| diff.editor.clone());
let diff_editor = diff.read_with(cx, |diff, _| diff.editor.clone());
assert_state_with_diff(
&diff_editor,
@ -1642,7 +1642,7 @@ mod tests {
workspace.active_item_as::<ProjectDiff>(cx).unwrap()
});
cx.focus(&item);
let editor = item.update(cx, |item, _| item.editor.clone());
let editor = item.read_with(cx, |item, _| item.editor.clone());
let mut cx = EditorTestContext::for_editor_in(editor, cx).await;
@ -1756,7 +1756,7 @@ mod tests {
workspace.active_item_as::<ProjectDiff>(cx).unwrap()
});
cx.focus(&item);
let editor = item.update(cx, |item, _| item.editor.clone());
let editor = item.read_with(cx, |item, _| item.editor.clone());
let mut cx = EditorTestContext::for_editor_in(editor, cx).await;

View file

@ -200,7 +200,7 @@ mod tests {
.unindent();
let buffer = cx.new(|cx| language::Buffer::local(text, cx).with_language(language, cx));
let outline = buffer.update(cx, |buffer, _| buffer.snapshot().outline(None).unwrap());
let outline = buffer.read_with(cx, |buffer, _| buffer.snapshot().outline(None).unwrap());
assert_eq!(
outline
.items

View file

@ -596,7 +596,7 @@ mod tests {
.unindent();
let buffer = cx.new(|cx| language::Buffer::local(text, cx).with_language(language, cx));
let outline = buffer.update(cx, |buffer, _| buffer.snapshot().outline(None).unwrap());
let outline = buffer.read_with(cx, |buffer, _| buffer.snapshot().outline(None).unwrap());
assert_eq!(
outline
.items

View file

@ -1575,7 +1575,7 @@ impl MultiBuffer {
context_line_count: u32,
cx: &mut Context<Self>,
) -> (Vec<Range<Anchor>>, bool) {
let buffer_snapshot = buffer.update(cx, |buffer, _| buffer.snapshot());
let buffer_snapshot = buffer.read(cx).snapshot();
let excerpt_ranges = build_excerpt_ranges(ranges, context_line_count, &buffer_snapshot);
let (new, counts) = Self::merge_excerpt_ranges(&excerpt_ranges);

View file

@ -532,7 +532,7 @@ mod tests {
outline_view: &Entity<Picker<OutlineViewDelegate>>,
cx: &mut VisualTestContext,
) -> Vec<String> {
outline_view.update(cx, |outline_view, _| {
outline_view.read_with(cx, |outline_view, _| {
let items = &outline_view.delegate.outline.items;
outline_view
.delegate

View file

@ -865,7 +865,7 @@ impl OutlinePanel {
fn serialize(&mut self, cx: &mut Context<Self>) {
let Some(serialization_key) = self
.workspace
.update(cx, |workspace, _| {
.read_with(cx, |workspace, _| {
OutlinePanel::serialization_key(workspace)
})
.ok()
@ -5642,7 +5642,7 @@ mod tests {
.advance_clock(UPDATE_DEBOUNCE + Duration::from_millis(100));
cx.run_until_parked();
let active_editor = outline_panel.update(cx, |outline_panel, _| {
let active_editor = outline_panel.read_with(cx, |outline_panel, _| {
outline_panel
.active_editor()
.expect("should have an active editor open")
@ -5737,7 +5737,7 @@ mod tests {
cx.executor()
.advance_clock(UPDATE_DEBOUNCE + Duration::from_millis(100));
cx.run_until_parked();
let new_active_editor = outline_panel.update(cx, |outline_panel, _| {
let new_active_editor = outline_panel.read_with(cx, |outline_panel, _| {
outline_panel
.active_editor()
.expect("should have an active editor open")

View file

@ -1340,7 +1340,7 @@ impl BufferStore {
mut cx: AsyncApp,
) -> Result<proto::BufferSaved> {
let buffer_id = BufferId::new(envelope.payload.buffer_id)?;
let (buffer, project_id) = this.update(&mut cx, |this, _| {
let (buffer, project_id) = this.read_with(&mut cx, |this, _| {
anyhow::Ok((
this.get_existing(buffer_id)?,
this.downstream_client
@ -1354,7 +1354,7 @@ impl BufferStore {
buffer.wait_for_version(deserialize_version(&envelope.payload.version))
})?
.await?;
let buffer_id = buffer.update(&mut cx, |buffer, _| buffer.remote_id())?;
let buffer_id = buffer.read_with(&mut cx, |buffer, _| buffer.remote_id())?;
if let Some(new_path) = envelope.payload.new_path {
let new_path = ProjectPath::from_proto(new_path);
@ -1367,7 +1367,7 @@ impl BufferStore {
.await?;
}
buffer.update(&mut cx, |buffer, _| proto::BufferSaved {
buffer.read_with(&mut cx, |buffer, _| proto::BufferSaved {
project_id,
buffer_id: buffer_id.into(),
version: serialize_version(buffer.saved_version()),
@ -1524,7 +1524,7 @@ impl BufferStore {
};
cx.spawn(async move |this, cx| {
let Some(buffer) = this.update(cx, |this, _| this.get(buffer_id))? else {
let Some(buffer) = this.read_with(cx, |this, _| this.get(buffer_id))? else {
return anyhow::Ok(());
};

View file

@ -267,7 +267,7 @@ impl BreakpointStore {
message: TypedEnvelope<proto::ToggleBreakpoint>,
mut cx: AsyncApp,
) -> Result<proto::Ack> {
let breakpoints = this.update(&mut cx, |this, _| this.breakpoint_store())?;
let breakpoints = this.read_with(&mut cx, |this, _| this.breakpoint_store())?;
let path = this
.update(&mut cx, |this, cx| {
this.project_path_for_absolute_path(message.payload.path.as_ref(), cx)
@ -803,7 +803,7 @@ impl BreakpointStore {
log::error!("Todo: Serialized breakpoints which do not have buffer (yet)");
continue;
};
let snapshot = buffer.update(cx, |buffer, _| buffer.snapshot())?;
let snapshot = buffer.read_with(cx, |buffer, _| buffer.snapshot())?;
let mut breakpoints_for_file =
this.update(cx, |_, cx| BreakpointsInFile::new(buffer, cx))?;

View file

@ -232,7 +232,7 @@ impl DapStore {
cx.spawn(async move |_, cx| {
let response = request.await?;
let binary = DebugAdapterBinary::from_proto(response)?;
let mut ssh_command = ssh_client.update(cx, |ssh, _| {
let mut ssh_command = ssh_client.read_with(cx, |ssh, _| {
anyhow::Ok(SshCommand {
arguments: ssh.ssh_args().context("SSH arguments not found")?,
})
@ -609,7 +609,7 @@ impl DapStore {
});
}
VariableLookupKind::Expression => {
let Ok(eval_task) = session.update(cx, |session, _| {
let Ok(eval_task) = session.read_with(cx, |session, _| {
session.mode.request_dap(EvaluateCommand {
expression: inline_value_location.variable_name.clone(),
frame_id: Some(stack_frame_id),
@ -752,7 +752,7 @@ impl DapStore {
let this = this.clone();
async move |cx| {
while let Some(message) = rx.next().await {
this.update(cx, |this, _| {
this.read_with(cx, |this, _| {
if let Some((downstream, project_id)) = this.downstream_client.clone() {
downstream
.send(proto::LogToDebugConsole {

View file

@ -407,7 +407,7 @@ impl LocalMode {
let configuration_sequence = cx.spawn({
async move |cx| {
let breakpoint_store =
dap_store.update(cx, |dap_store, _| dap_store.breakpoint_store().clone())?;
dap_store.read_with(cx, |dap_store, _| dap_store.breakpoint_store().clone())?;
initialized_rx.await?;
let errors_by_path = cx
.update(|cx| this.send_source_breakpoints(false, &breakpoint_store, cx))?

View file

@ -2179,7 +2179,7 @@ impl GitStore {
id: RepositoryId,
cx: &mut AsyncApp,
) -> Result<Entity<Repository>> {
this.update(cx, |this, _| {
this.read_with(cx, |this, _| {
this.repositories
.get(&id)
.context("missing repository handle")
@ -4022,7 +4022,7 @@ impl Repository {
bail!("not a local repository")
};
let (snapshot, events) = this
.update(&mut cx, |this, _| {
.read_with(&mut cx, |this, _| {
compute_snapshot(
this.id,
this.work_directory_abs_path.clone(),

View file

@ -504,7 +504,8 @@ mod tests {
events_tx.send(event.clone()).ok();
})
});
let conflicts_snapshot = conflict_set.update(cx, |conflict_set, _| conflict_set.snapshot());
let conflicts_snapshot =
conflict_set.read_with(cx, |conflict_set, _| conflict_set.snapshot());
assert!(conflicts_snapshot.conflicts.is_empty());
buffer.update(cx, |buffer, cx| {
@ -543,7 +544,7 @@ mod tests {
assert_eq!(update.old_range, 0..0);
assert_eq!(update.new_range, 0..1);
let conflict = conflict_set.update(cx, |conflict_set, _| {
let conflict = conflict_set.read_with(cx, |conflict_set, _| {
conflict_set.snapshot().conflicts[0].clone()
});
cx.update(|cx| {

View file

@ -313,7 +313,7 @@ impl LspCommand for PrepareRename {
_: LanguageServerId,
mut cx: AsyncApp,
) -> Result<PrepareRenameResponse> {
buffer.update(&mut cx, |buffer, _| match message {
buffer.read_with(&mut cx, |buffer, _| match message {
Some(lsp::PrepareRenameResponse::Range(range))
| Some(lsp::PrepareRenameResponse::RangeWithPlaceholder { range, .. }) => {
let Range { start, end } = range_from_lsp(range);
@ -365,7 +365,7 @@ impl LspCommand for PrepareRename {
.await?;
Ok(Self {
position: buffer.update(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
position: buffer.read_with(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
})
}
@ -513,7 +513,7 @@ impl LspCommand for PerformRename {
})?
.await?;
Ok(Self {
position: buffer.update(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
position: buffer.read_with(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
new_name: message.new_name,
push_to_history: false,
})
@ -625,7 +625,7 @@ impl LspCommand for GetDefinition {
})?
.await?;
Ok(Self {
position: buffer.update(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
position: buffer.read_with(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
})
}
@ -724,7 +724,7 @@ impl LspCommand for GetDeclaration {
})?
.await?;
Ok(Self {
position: buffer.update(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
position: buffer.read_with(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
})
}
@ -816,7 +816,7 @@ impl LspCommand for GetImplementation {
})?
.await?;
Ok(Self {
position: buffer.update(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
position: buffer.read_with(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
})
}
@ -915,7 +915,7 @@ impl LspCommand for GetTypeDefinition {
})?
.await?;
Ok(Self {
position: buffer.update(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
position: buffer.read_with(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
})
}
@ -1296,7 +1296,7 @@ impl LspCommand for GetReferences {
target_buffer_handle
.clone()
.update(&mut cx, |target_buffer, _| {
.read_with(&mut cx, |target_buffer, _| {
let target_start = target_buffer
.clip_point_utf16(point_from_lsp(lsp_location.range.start), Bias::Left);
let target_end = target_buffer
@ -1340,7 +1340,7 @@ impl LspCommand for GetReferences {
})?
.await?;
Ok(Self {
position: buffer.update(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
position: buffer.read_with(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
})
}
@ -1449,7 +1449,7 @@ impl LspCommand for GetDocumentHighlights {
_: LanguageServerId,
mut cx: AsyncApp,
) -> Result<Vec<DocumentHighlight>> {
buffer.update(&mut cx, |buffer, _| {
buffer.read_with(&mut cx, |buffer, _| {
let mut lsp_highlights = lsp_highlights.unwrap_or_default();
lsp_highlights.sort_unstable_by_key(|h| (h.range.start, Reverse(h.range.end)));
lsp_highlights
@ -1497,7 +1497,7 @@ impl LspCommand for GetDocumentHighlights {
})?
.await?;
Ok(Self {
position: buffer.update(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
position: buffer.read_with(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
})
}
@ -1822,7 +1822,7 @@ impl LspCommand for GetSignatureHelp {
})?
.await
.with_context(|| format!("waiting for version for buffer {}", buffer.entity_id()))?;
let buffer_snapshot = buffer.update(&mut cx, |buffer, _| buffer.snapshot())?;
let buffer_snapshot = buffer.read_with(&mut cx, |buffer, _| buffer.snapshot())?;
Ok(Self {
position: payload
.position
@ -1906,7 +1906,7 @@ impl LspCommand for GetHover {
return Ok(None);
};
let (language, range) = buffer.update(&mut cx, |buffer, _| {
let (language, range) = buffer.read_with(&mut cx, |buffer, _| {
(
buffer.language().cloned(),
hover.range.map(|range| {
@ -1992,7 +1992,7 @@ impl LspCommand for GetHover {
})?
.await?;
Ok(Self {
position: buffer.update(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
position: buffer.read_with(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
})
}
@ -2066,7 +2066,7 @@ impl LspCommand for GetHover {
return Ok(None);
}
let language = buffer.update(&mut cx, |buffer, _| buffer.language().cloned())?;
let language = buffer.read_with(&mut cx, |buffer, _| buffer.language().cloned())?;
let range = if let (Some(start), Some(end)) = (message.start, message.end) {
language::proto::deserialize_anchor(start)
.and_then(|start| language::proto::deserialize_anchor(end).map(|end| start..end))
@ -2141,7 +2141,7 @@ impl LspCommand for GetCompletions {
};
let language_server_adapter = lsp_store
.update(&mut cx, |lsp_store, _| {
.read_with(&mut cx, |lsp_store, _| {
lsp_store.language_server_adapter_for_id(server_id)
})?
.with_context(|| format!("no language server with id {server_id}"))?;
@ -2317,7 +2317,7 @@ impl LspCommand for GetCompletions {
.position
.and_then(language::proto::deserialize_anchor)
.map(|p| {
buffer.update(&mut cx, |buffer, _| {
buffer.read_with(&mut cx, |buffer, _| {
buffer.clip_point_utf16(Unclipped(p.to_point_utf16(buffer)), Bias::Left)
})
})
@ -2773,7 +2773,7 @@ impl LspCommand for OnTypeFormatting {
})?;
Ok(Self {
position: buffer.update(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
position: buffer.read_with(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
trigger: message.trigger.clone(),
options,
push_to_history: false,
@ -2826,7 +2826,7 @@ impl InlayHints {
_ => None,
});
let position = buffer_handle.update(cx, |buffer, _| {
let position = buffer_handle.read_with(cx, |buffer, _| {
let position = buffer.clip_point_utf16(point_from_lsp(lsp_hint.position), Bias::Left);
if kind == Some(InlayHintKind::Parameter) {
buffer.anchor_before(position)
@ -3387,7 +3387,7 @@ impl LspCommand for GetCodeLens {
server_id: LanguageServerId,
mut cx: AsyncApp,
) -> anyhow::Result<Vec<CodeAction>> {
let snapshot = buffer.update(&mut cx, |buffer, _| buffer.snapshot())?;
let snapshot = buffer.read_with(&mut cx, |buffer, _| buffer.snapshot())?;
let language_server = cx.update(|cx| {
lsp_store
.read(cx)

View file

@ -535,8 +535,8 @@ impl LocalLspStore {
let this = this.clone();
let mut cx = cx.clone();
async move {
let Some(server) =
this.update(&mut cx, |this, _| this.language_server_for_id(server_id))?
let Some(server) = this
.read_with(&mut cx, |this, _| this.language_server_for_id(server_id))?
else {
return Ok(None);
};
@ -600,7 +600,7 @@ impl LocalLspStore {
}
}
"textDocument/rangeFormatting" => {
this.update(&mut cx, |this, _| {
this.read_with(&mut cx, |this, _| {
if let Some(server) = this.language_server_for_id(server_id)
{
let options = reg
@ -626,7 +626,7 @@ impl LocalLspStore {
})??;
}
"textDocument/onTypeFormatting" => {
this.update(&mut cx, |this, _| {
this.read_with(&mut cx, |this, _| {
if let Some(server) = this.language_server_for_id(server_id)
{
let options = reg
@ -651,7 +651,7 @@ impl LocalLspStore {
})??;
}
"textDocument/formatting" => {
this.update(&mut cx, |this, _| {
this.read_with(&mut cx, |this, _| {
if let Some(server) = this.language_server_for_id(server_id)
{
let options = reg
@ -680,7 +680,7 @@ impl LocalLspStore {
// Ignore payload since we notify clients of setting changes unconditionally, relying on them pulling the latest settings.
}
"textDocument/rename" => {
this.update(&mut cx, |this, _| {
this.read_with(&mut cx, |this, _| {
if let Some(server) = this.language_server_for_id(server_id)
{
let options = reg
@ -734,7 +734,7 @@ impl LocalLspStore {
// Ignore payload since we notify clients of setting changes unconditionally, relying on them pulling the latest settings.
}
"textDocument/rename" => {
this.update(&mut cx, |this, _| {
this.read_with(&mut cx, |this, _| {
if let Some(server) = this.language_server_for_id(server_id)
{
server.update_capabilities(|capabilities| {
@ -744,7 +744,7 @@ impl LocalLspStore {
})?;
}
"textDocument/rangeFormatting" => {
this.update(&mut cx, |this, _| {
this.read_with(&mut cx, |this, _| {
if let Some(server) = this.language_server_for_id(server_id)
{
server.update_capabilities(|capabilities| {
@ -755,7 +755,7 @@ impl LocalLspStore {
})?;
}
"textDocument/onTypeFormatting" => {
this.update(&mut cx, |this, _| {
this.read_with(&mut cx, |this, _| {
if let Some(server) = this.language_server_for_id(server_id)
{
server.update_capabilities(|capabilities| {
@ -766,7 +766,7 @@ impl LocalLspStore {
})?;
}
"textDocument/formatting" => {
this.update(&mut cx, |this, _| {
this.read_with(&mut cx, |this, _| {
if let Some(server) = this.language_server_for_id(server_id)
{
server.update_capabilities(|capabilities| {
@ -1954,7 +1954,7 @@ impl LocalLspStore {
} else if matches!(range_formatting_provider, Some(p) if *p != OneOf::Left(false)) {
let _timer = zlog::time!(logger => "format-range");
let buffer_start = lsp::Position::new(0, 0);
let buffer_end = buffer.update(cx, |b, _| point_to_lsp(b.max_point_utf16()))?;
let buffer_end = buffer.read_with(cx, |b, _| point_to_lsp(b.max_point_utf16()))?;
language_server
.request::<lsp::request::RangeFormatting>(lsp::DocumentRangeFormattingParams {
text_document: text_document.clone(),
@ -2029,7 +2029,7 @@ impl LocalLspStore {
let stdin = child.stdin.as_mut().context("failed to acquire stdin")?;
let text = buffer
.handle
.update(cx, |buffer, _| buffer.as_rope().clone())?;
.read_with(cx, |buffer, _| buffer.as_rope().clone())?;
for chunk in text.chunks() {
stdin.write_all(chunk.as_bytes()).await?;
}
@ -3038,7 +3038,7 @@ impl LocalLspStore {
) -> Result<lsp::ApplyWorkspaceEditResponse> {
let this = this.upgrade().context("project project closed")?;
let language_server = this
.update(cx, |this, _| this.language_server_for_id(server_id))?
.read_with(cx, |this, _| this.language_server_for_id(server_id))?
.context("language server not found")?;
let transaction = Self::deserialize_workspace_edit(
this.clone(),
@ -3851,9 +3851,9 @@ impl LspStore {
}
fn on_buffer_added(&mut self, buffer: &Entity<Buffer>, cx: &mut Context<Self>) -> Result<()> {
buffer.update(cx, |buffer, _| {
buffer.set_language_registry(self.languages.clone())
});
buffer
.read(cx)
.set_language_registry(self.languages.clone());
cx.subscribe(buffer, |this, buffer, event, cx| {
this.on_buffer_event(buffer, event, cx);
@ -4691,7 +4691,9 @@ impl LspStore {
kind: kind.as_str().to_owned(),
buffer_ids: buffers
.iter()
.map(|buffer| buffer.update(cx, |buffer, _| buffer.remote_id().into()))
.map(|buffer| {
buffer.read_with(cx, |buffer, _| buffer.remote_id().into())
})
.collect::<Result<_>>()?,
})
.await
@ -6760,7 +6762,7 @@ impl LspStore {
})
})?
.await?;
if worktree.update(cx, |worktree, _| worktree.is_local())? {
if worktree.read_with(cx, |worktree, _| worktree.is_local())? {
lsp_store
.update(cx, |lsp_store, cx| {
lsp_store.register_local_language_server(
@ -6772,7 +6774,7 @@ impl LspStore {
})
.ok();
}
let worktree_root = worktree.update(cx, |worktree, _| worktree.abs_path())?;
let worktree_root = worktree.read_with(cx, |worktree, _| worktree.abs_path())?;
let relative_path = if let Some(known_path) = known_relative_path {
known_path
} else {
@ -6781,7 +6783,7 @@ impl LspStore {
(worktree, relative_path)
};
let project_path = ProjectPath {
worktree_id: worktree.update(cx, |worktree, _| worktree.id())?,
worktree_id: worktree.read_with(cx, |worktree, _| worktree.id())?,
path: relative_path,
};
lsp_store
@ -6897,7 +6899,7 @@ impl LspStore {
envelope: TypedEnvelope<proto::MultiLspQuery>,
mut cx: AsyncApp,
) -> Result<proto::MultiLspQueryResponse> {
let response_from_ssh = this.update(&mut cx, |this, _| {
let response_from_ssh = this.read_with(&mut cx, |this, _| {
let (upstream_client, project_id) = this.upstream_client()?;
let mut payload = envelope.payload.clone();
payload.project_id = project_id;
@ -6919,7 +6921,7 @@ impl LspStore {
buffer.wait_for_version(version.clone())
})?
.await?;
let buffer_version = buffer.update(&mut cx, |buffer, _| buffer.version())?;
let buffer_version = buffer.read_with(&mut cx, |buffer, _| buffer.version())?;
match envelope
.payload
.strategy
@ -7188,7 +7190,7 @@ impl LspStore {
})?
.context("worktree not found")?;
let (old_abs_path, new_abs_path) = {
let root_path = worktree.update(&mut cx, |this, _| this.abs_path())?;
let root_path = worktree.read_with(&mut cx, |this, _| this.abs_path())?;
let new_path = PathBuf::from_proto(envelope.payload.new_path.clone());
(root_path.join(&old_path), root_path.join(&new_path))
};
@ -7203,7 +7205,7 @@ impl LspStore {
)
.await;
let response = Worktree::handle_rename_entry(worktree, envelope.payload, cx.clone()).await;
this.update(&mut cx, |this, _| {
this.read_with(&mut cx, |this, _| {
this.did_rename_entry(worktree_id, &old_abs_path, &new_abs_path, is_dir);
})
.ok();
@ -7386,7 +7388,7 @@ impl LspStore {
mut cx: AsyncApp,
) -> Result<proto::Ack> {
let server_id = LanguageServerId(envelope.payload.language_server_id as usize);
lsp_store.update(&mut cx, |lsp_store, _| {
lsp_store.read_with(&mut cx, |lsp_store, _| {
if let Some(server) = lsp_store.language_server_for_id(server_id) {
server
.notify::<lsp_store::lsp_ext_command::LspExtCancelFlycheck>(&())
@ -7438,7 +7440,7 @@ impl LspStore {
mut cx: AsyncApp,
) -> Result<proto::Ack> {
let server_id = LanguageServerId(envelope.payload.language_server_id as usize);
lsp_store.update(&mut cx, |lsp_store, _| {
lsp_store.read_with(&mut cx, |lsp_store, _| {
if let Some(server) = lsp_store.language_server_for_id(server_id) {
server
.notify::<lsp_store::lsp_ext_command::LspExtClearFlycheck>(&())
@ -8097,7 +8099,7 @@ impl LspStore {
let peer_id = envelope.original_sender_id().unwrap_or_default();
let symbol = envelope.payload.symbol.context("invalid symbol")?;
let symbol = Self::deserialize_symbol(symbol)?;
let symbol = this.update(&mut cx, |this, _| {
let symbol = this.read_with(&mut cx, |this, _| {
let signature = this.symbol_signature(&symbol.path);
anyhow::ensure!(signature == symbol.signature, "invalid symbol signature");
Ok(symbol)
@ -8392,7 +8394,7 @@ impl LspStore {
trigger: trigger as i32,
buffer_ids: buffers
.iter()
.map(|buffer| buffer.update(cx, |buffer, _| buffer.remote_id().into()))
.map(|buffer| buffer.read_with(cx, |buffer, _| buffer.remote_id().into()))
.collect::<Result<_>>()?,
})
.await

View file

@ -117,7 +117,7 @@ impl LspCommand for ExpandMacro {
.and_then(deserialize_anchor)
.context("invalid position")?;
Ok(Self {
position: buffer.update(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
position: buffer.read_with(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
})
}
@ -247,7 +247,7 @@ impl LspCommand for OpenDocs {
.and_then(deserialize_anchor)
.context("invalid position")?;
Ok(Self {
position: buffer.update(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
position: buffer.read_with(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
})
}
@ -452,7 +452,7 @@ impl LspCommand for GoToParentModule {
.and_then(deserialize_anchor)
.context("bad request with bad position")?;
Ok(Self {
position: buffer.update(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
position: buffer.read_with(&mut cx, |buffer, _| position.to_point_utf16(buffer))?,
})
}

View file

@ -109,7 +109,7 @@ pub fn cancel_flycheck(
else {
return Ok(());
};
let buffer_id = buffer.update(cx, |buffer, _| buffer.remote_id().to_proto())?;
let buffer_id = buffer.read_with(cx, |buffer, _| buffer.remote_id().to_proto())?;
if let Some((client, project_id)) = upstream_client {
let request = proto::LspExtCancelFlycheck {
@ -123,7 +123,7 @@ pub fn cancel_flycheck(
.context("lsp ext cancel flycheck proto request")?;
} else {
lsp_store
.update(cx, |lsp_store, _| {
.read_with(cx, |lsp_store, _| {
if let Some(server) = lsp_store.language_server_for_id(rust_analyzer_server) {
server.notify::<lsp_store::lsp_ext_command::LspExtCancelFlycheck>(&())?;
}
@ -160,7 +160,7 @@ pub fn run_flycheck(
else {
return Ok(());
};
let buffer_id = buffer.update(cx, |buffer, _| buffer.remote_id().to_proto())?;
let buffer_id = buffer.read_with(cx, |buffer, _| buffer.remote_id().to_proto())?;
if let Some((client, project_id)) = upstream_client {
let request = proto::LspExtRunFlycheck {
@ -175,7 +175,7 @@ pub fn run_flycheck(
.context("lsp ext run flycheck proto request")?;
} else {
lsp_store
.update(cx, |lsp_store, _| {
.read_with(cx, |lsp_store, _| {
if let Some(server) = lsp_store.language_server_for_id(rust_analyzer_server) {
server.notify::<lsp_store::lsp_ext_command::LspExtRunFlycheck>(
&lsp_store::lsp_ext_command::RunFlycheckParams {
@ -216,7 +216,7 @@ pub fn clear_flycheck(
else {
return Ok(());
};
let buffer_id = buffer.update(cx, |buffer, _| buffer.remote_id().to_proto())?;
let buffer_id = buffer.read_with(cx, |buffer, _| buffer.remote_id().to_proto())?;
if let Some((client, project_id)) = upstream_client {
let request = proto::LspExtClearFlycheck {
@ -230,7 +230,7 @@ pub fn clear_flycheck(
.context("lsp ext clear flycheck proto request")?;
} else {
lsp_store
.update(cx, |lsp_store, _| {
.read_with(cx, |lsp_store, _| {
if let Some(server) = lsp_store.language_server_for_id(rust_analyzer_server) {
server.notify::<lsp_store::lsp_ext_command::LspExtClearFlycheck>(&())?;
}

View file

@ -133,7 +133,7 @@ impl ManifestTree {
};
let key = TriePath::from(&*path);
worktree_roots.update(cx, |this, _| {
worktree_roots.read_with(cx, |this, _| {
this.roots.walk(&key, &mut |path, labels| {
for (label, presence) in labels {
if let Some((marked_path, current_presence)) = roots.get_mut(label) {

View file

@ -279,7 +279,7 @@ impl PrettierStore {
) -> PrettierTask {
cx.spawn(async move |prettier_store, cx| {
log::info!("Starting prettier at path {prettier_dir:?}");
let new_server_id = prettier_store.update(cx, |prettier_store, _| {
let new_server_id = prettier_store.read_with(cx, |prettier_store, _| {
prettier_store.languages.next_language_server_id()
})?;
@ -306,7 +306,7 @@ impl PrettierStore {
cx: &mut Context<PrettierStore>,
) -> Task<anyhow::Result<PrettierTask>> {
cx.spawn(async move |prettier_store, cx| {
let installation_task = prettier_store.update(cx, |prettier_store, _| {
let installation_task = prettier_store.read_with(cx, |prettier_store, _| {
match &prettier_store.default_prettier.prettier {
PrettierInstallation::NotInstalled {
installation_task, ..
@ -407,7 +407,7 @@ impl PrettierStore {
.read(cx)
.worktree_for_id(id, cx)
})
.map(|worktree| worktree.update(cx, |worktree, _| worktree.abs_path()));
.map(|worktree| worktree.read(cx).abs_path());
let name = match worktree_path {
Some(worktree_path) => {
if prettier_dir == worktree_path.as_ref() {

View file

@ -1540,7 +1540,7 @@ impl Project {
.unwrap()
.await
.unwrap();
tree.update(cx, |tree, _| tree.as_local().unwrap().scan_complete())
tree.read_with(cx, |tree, _| tree.as_local().unwrap().scan_complete())
.unwrap()
.await;
}
@ -1579,7 +1579,7 @@ impl Project {
.await
.unwrap();
tree.update(cx, |tree, _| tree.as_local().unwrap().scan_complete())
tree.read_with(cx, |tree, _| tree.as_local().unwrap().scan_complete())
.await;
}
project
@ -1945,7 +1945,7 @@ impl Project {
let lsp_store = self.lsp_store().downgrade();
cx.spawn(async move |_, cx| {
let (old_abs_path, new_abs_path) = {
let root_path = worktree.update(cx, |this, _| this.abs_path())?;
let root_path = worktree.read_with(cx, |this, _| this.abs_path())?;
let new_abs_path = if is_root_entry {
root_path.parent().unwrap().join(&new_path)
} else {
@ -1970,7 +1970,7 @@ impl Project {
.await?;
lsp_store
.update(cx, |this, _| {
.read_with(cx, |this, _| {
this.did_rename_entry(worktree_id, &old_abs_path, &new_abs_path, is_dir);
})
.ok();
@ -2550,7 +2550,7 @@ impl Project {
cx: &mut AsyncApp,
) -> Result<()> {
for (buffer_id, operations) in operations_by_buffer_id.drain() {
let request = this.update(cx, |this, _| {
let request = this.read_with(cx, |this, _| {
let project_id = this.remote_id()?;
Some(this.client.request(proto::UpdateBuffer {
buffer_id: buffer_id.into(),
@ -2572,7 +2572,7 @@ impl Project {
let mut changes = rx.ready_chunks(MAX_BATCH_SIZE);
while let Some(changes) = changes.next().await {
let is_local = this.update(cx, |this, _| this.is_local())?;
let is_local = this.read_with(cx, |this, _| this.is_local())?;
for change in changes {
match change {
@ -2614,7 +2614,7 @@ impl Project {
)
.await?;
this.update(cx, |this, _| {
this.read_with(cx, |this, _| {
if let Some(project_id) = this.remote_id() {
this.client
.send(proto::UpdateLanguageServer {
@ -4007,7 +4007,7 @@ impl Project {
cx: &mut AsyncApp,
) -> Option<ResolvedPath> {
worktree
.update(cx, |worktree, _| {
.read_with(cx, |worktree, _| {
let root_entry_path = &worktree.root_entry()?.path;
let resolved = resolve_path(root_entry_path, path);
let stripped = resolved.strip_prefix(root_entry_path).unwrap_or(&resolved);

View file

@ -902,7 +902,7 @@ impl SettingsObserver {
let user_tasks_content = cx.background_executor().block(user_tasks_file_rx.next());
let weak_entry = cx.weak_entity();
cx.spawn(async move |settings_observer, cx| {
let Ok(task_store) = settings_observer.update(cx, |settings_observer, _| {
let Ok(task_store) = settings_observer.read_with(cx, |settings_observer, _| {
settings_observer.task_store.clone()
}) else {
return;

View file

@ -70,7 +70,7 @@ impl TaskStore {
.payload
.location
.context("no location given for task context handling")?;
let (buffer_store, is_remote) = store.update(&mut cx, |store, _| {
let (buffer_store, is_remote) = store.read_with(&mut cx, |store, _| {
Ok(match store {
TaskStore::Functional(state) => (
state.buffer_store.clone(),

View file

@ -367,7 +367,7 @@ impl WorktreeStore {
let handle_id = worktree.entity_id();
cx.subscribe(worktree, |_, worktree, event, cx| {
let worktree_id = worktree.update(cx, |worktree, _| worktree.id());
let worktree_id = worktree.read(cx).id();
match event {
worktree::Event::UpdatedEntries(changes) => {
cx.emit(WorktreeStoreEvent::WorktreeUpdatedEntries(

View file

@ -93,7 +93,7 @@ impl YarnPathStore {
let zip_file: Arc<Path> = Arc::from(zip_file);
cx.spawn(async move |this, cx| {
let dir = this
.update(cx, |this, _| {
.read_with(cx, |this, _| {
this.temp_dirs
.get(&zip_file)
.map(|temp| temp.path().to_owned())

View file

@ -694,7 +694,7 @@ impl ProjectPanel {
fn serialize(&mut self, cx: &mut Context<Self>) {
let Some(serialization_key) = self
.workspace
.update(cx, |workspace, _| {
.read_with(cx, |workspace, _| {
ProjectPanel::serialization_key(workspace)
})
.ok()
@ -3457,7 +3457,7 @@ impl ProjectPanel {
.read(cx)
.repo_snapshots(cx);
let worktree = self.project.read(cx).worktree_for_id(worktree_id, cx)?;
worktree.update(cx, |tree, _| {
worktree.read_with(cx, |tree, _| {
utils::ReversibleIterable::new(
GitTraversal::new(&repo_snapshots, tree.entries(true, 0usize)),
reverse_search,
@ -3492,16 +3492,17 @@ impl ProjectPanel {
let worktree = self
.project
.read(cx)
.worktree_for_id(start.worktree_id, cx)?;
.worktree_for_id(start.worktree_id, cx)?
.read(cx);
let search = worktree.update(cx, |tree, _| {
let entry = tree.entry_for_id(start.entry_id)?;
let root_entry = tree.root_entry()?;
let tree_id = tree.id();
let search = {
let entry = worktree.entry_for_id(start.entry_id)?;
let root_entry = worktree.root_entry()?;
let tree_id = worktree.id();
let mut first_iter = GitTraversal::new(
&repo_snapshots,
tree.traverse_from_path(true, true, true, entry.path.as_ref()),
worktree.traverse_from_path(true, true, true, entry.path.as_ref()),
);
if reverse_search {
@ -3515,7 +3516,8 @@ impl ProjectPanel {
.find(|ele| predicate(*ele, tree_id))
.map(|ele| ele.to_owned());
let second_iter = GitTraversal::new(&repo_snapshots, tree.entries(true, 0usize));
let second_iter =
GitTraversal::new(&repo_snapshots, worktree.entries(true, 0usize));
let second = if reverse_search {
second_iter
@ -3536,7 +3538,7 @@ impl ProjectPanel {
} else {
Some((first, second))
}
});
};
if let Some((first, second)) = search {
let first = first.map(|entry| SelectedEntry {

View file

@ -381,7 +381,7 @@ mod tests {
});
cx.run_until_parked();
symbols.update(cx, |symbols, _| {
symbols.read_with(cx, |symbols, _| {
assert_eq!(symbols.delegate.matches.len(), 0);
});
@ -392,7 +392,7 @@ mod tests {
});
cx.run_until_parked();
symbols.update(cx, |symbols, _| {
symbols.read_with(cx, |symbols, _| {
let delegate = &symbols.delegate;
assert_eq!(delegate.matches.len(), 2);
assert_eq!(delegate.matches[0].string, "ton");
@ -406,7 +406,7 @@ mod tests {
});
cx.run_until_parked();
symbols.update(cx, |symbols, _| {
symbols.read_with(cx, |symbols, _| {
assert_eq!(symbols.delegate.matches.len(), 0);
});
}

View file

@ -176,7 +176,7 @@ impl ProjectPicker {
};
let app_state = workspace
.update(cx, |workspace, _| workspace.app_state().clone())
.read_with(cx, |workspace, _| workspace.app_state().clone())
.ok()?;
cx.update(|_, cx| {
@ -856,7 +856,7 @@ impl RemoteServerProjects {
move |this: &mut Self, window: &mut Window, cx: &mut Context<Self>| {
let Some(app_state) = this
.workspace
.update(cx, |workspace, _| workspace.app_state().clone())
.read_with(cx, |workspace, _| workspace.app_state().clone())
.log_err()
else {
return;
@ -940,7 +940,7 @@ impl RemoteServerProjects {
) {
let Some(fs) = self
.workspace
.update(cx, |workspace, _| workspace.app_state().fs.clone())
.read_with(cx, |workspace, _| workspace.app_state().fs.clone())
.log_err()
else {
return;

View file

@ -901,7 +901,7 @@ impl SshRemoteClient {
mut connection_activity_rx: mpsc::Receiver<()>,
cx: &mut AsyncApp,
) -> Task<Result<()>> {
let Ok(client) = this.update(cx, |this, _| this.client.clone()) else {
let Ok(client) = this.read_with(cx, |this, _| this.client.clone()) else {
return Task::ready(Err(anyhow!("SshRemoteClient lost")));
};

View file

@ -383,7 +383,7 @@ impl HeadlessProject {
};
let worktree = this
.update(&mut cx.clone(), |this, _| {
.read_with(&mut cx.clone(), |this, _| {
Worktree::local(
Arc::from(canonicalized.as_path()),
message.payload.visible,
@ -394,11 +394,12 @@ impl HeadlessProject {
})?
.await?;
let response = this.update(&mut cx, |_, cx| {
worktree.update(cx, |worktree, _| proto::AddWorktreeResponse {
let response = this.read_with(&mut cx, |_, cx| {
let worktree = worktree.read(cx);
proto::AddWorktreeResponse {
worktree_id: worktree.id().to_proto(),
canonicalized_path: canonicalized.to_proto(),
})
}
})?;
// We spawn this asynchronously, so that we can send the response back
@ -572,7 +573,7 @@ impl HeadlessProject {
let buffer_store = this.read_with(&cx, |this, _| this.buffer_store.clone())?;
while let Ok(buffer) = results.recv().await {
let buffer_id = buffer.update(&mut cx, |this, _| this.remote_id())?;
let buffer_id = buffer.read_with(&mut cx, |this, _| this.remote_id())?;
response.buffer_ids.push(buffer_id.to_proto());
buffer_store
.update(&mut cx, |buffer_store, cx| {

View file

@ -696,9 +696,9 @@ impl BufferSearchBar {
.read(cx)
.as_singleton()
.expect("query editor should be backed by a singleton buffer");
query_buffer.update(cx, |query_buffer, _| {
query_buffer.set_language_registry(languages.clone());
});
query_buffer
.read(cx)
.set_language_registry(languages.clone());
cx.spawn(async move |buffer_search_bar, cx| {
let regex_language = languages
@ -1692,7 +1692,7 @@ mod tests {
[DisplayPoint::new(DisplayRow(0), 41)..DisplayPoint::new(DisplayRow(0), 43)]
);
});
search_bar.update(cx, |search_bar, _| {
search_bar.read_with(cx, |search_bar, _| {
assert_eq!(search_bar.active_match_index, Some(0));
});
@ -1703,7 +1703,7 @@ mod tests {
[DisplayPoint::new(DisplayRow(3), 11)..DisplayPoint::new(DisplayRow(3), 13)]
);
});
search_bar.update(cx, |search_bar, _| {
search_bar.read_with(cx, |search_bar, _| {
assert_eq!(search_bar.active_match_index, Some(1));
});
@ -1714,7 +1714,7 @@ mod tests {
[DisplayPoint::new(DisplayRow(3), 56)..DisplayPoint::new(DisplayRow(3), 58)]
);
});
search_bar.update(cx, |search_bar, _| {
search_bar.read_with(cx, |search_bar, _| {
assert_eq!(search_bar.active_match_index, Some(2));
});
@ -1725,7 +1725,7 @@ mod tests {
[DisplayPoint::new(DisplayRow(0), 41)..DisplayPoint::new(DisplayRow(0), 43)]
);
});
search_bar.update(cx, |search_bar, _| {
search_bar.read_with(cx, |search_bar, _| {
assert_eq!(search_bar.active_match_index, Some(0));
});
@ -1736,7 +1736,7 @@ mod tests {
[DisplayPoint::new(DisplayRow(3), 56)..DisplayPoint::new(DisplayRow(3), 58)]
);
});
search_bar.update(cx, |search_bar, _| {
search_bar.read_with(cx, |search_bar, _| {
assert_eq!(search_bar.active_match_index, Some(2));
});
@ -1747,7 +1747,7 @@ mod tests {
[DisplayPoint::new(DisplayRow(3), 11)..DisplayPoint::new(DisplayRow(3), 13)]
);
});
search_bar.update(cx, |search_bar, _| {
search_bar.read_with(cx, |search_bar, _| {
assert_eq!(search_bar.active_match_index, Some(1));
});
@ -1758,7 +1758,7 @@ mod tests {
[DisplayPoint::new(DisplayRow(0), 41)..DisplayPoint::new(DisplayRow(0), 43)]
);
});
search_bar.update(cx, |search_bar, _| {
search_bar.read_with(cx, |search_bar, _| {
assert_eq!(search_bar.active_match_index, Some(0));
});
@ -1779,7 +1779,7 @@ mod tests {
[DisplayPoint::new(DisplayRow(0), 41)..DisplayPoint::new(DisplayRow(0), 43)]
);
});
search_bar.update(cx, |search_bar, _| {
search_bar.read_with(cx, |search_bar, _| {
assert_eq!(search_bar.active_match_index, Some(0));
});
@ -1800,7 +1800,7 @@ mod tests {
[DisplayPoint::new(DisplayRow(3), 11)..DisplayPoint::new(DisplayRow(3), 13)]
);
});
search_bar.update(cx, |search_bar, _| {
search_bar.read_with(cx, |search_bar, _| {
assert_eq!(search_bar.active_match_index, Some(1));
});
@ -1821,7 +1821,7 @@ mod tests {
[DisplayPoint::new(DisplayRow(3), 56)..DisplayPoint::new(DisplayRow(3), 58)]
);
});
search_bar.update(cx, |search_bar, _| {
search_bar.read_with(cx, |search_bar, _| {
assert_eq!(search_bar.active_match_index, Some(2));
});
@ -1842,7 +1842,7 @@ mod tests {
[DisplayPoint::new(DisplayRow(0), 41)..DisplayPoint::new(DisplayRow(0), 43)]
);
});
search_bar.update(cx, |search_bar, _| {
search_bar.read_with(cx, |search_bar, _| {
assert_eq!(search_bar.active_match_index, Some(0));
});
@ -1863,7 +1863,7 @@ mod tests {
[DisplayPoint::new(DisplayRow(3), 56)..DisplayPoint::new(DisplayRow(3), 58)]
);
});
search_bar.update(cx, |search_bar, _| {
search_bar.read_with(cx, |search_bar, _| {
assert_eq!(search_bar.active_match_index, Some(2));
});
}

View file

@ -4019,7 +4019,7 @@ pub mod tests {
window
.update(cx, |workspace, window, cx| {
assert_eq!(workspace.active_pane(), &first_pane);
first_pane.update(cx, |this, _| {
first_pane.read_with(cx, |this, _| {
assert_eq!(this.active_item_index(), 1);
assert_eq!(this.items_len(), 2);
});
@ -4203,7 +4203,7 @@ pub mod tests {
});
cx.run_until_parked();
let project_search_view = pane
.update(&mut cx, |pane, _| {
.read_with(&mut cx, |pane, _| {
pane.active_item()
.and_then(|item| item.downcast::<ProjectSearchView>())
})

View file

@ -69,7 +69,7 @@ async fn process_updates(
entries: Vec<PathBuf>,
mut cx: AsyncApp,
) -> Result<()> {
let fs = this.update(&mut cx, |this, _| this.fs.clone())?;
let fs = this.read_with(&mut cx, |this, _| this.fs.clone())?;
for entry_path in entries {
if !entry_path
.extension()
@ -120,7 +120,7 @@ async fn initial_scan(
path: Arc<Path>,
mut cx: AsyncApp,
) -> Result<()> {
let fs = this.update(&mut cx, |this, _| this.fs.clone())?;
let fs = this.read_with(&mut cx, |this, _| this.fs.clone())?;
let entries = fs.read_dir(&path).await;
if let Ok(entries) = entries {
let entries = entries
@ -183,7 +183,7 @@ impl SnippetProvider {
let path: Arc<Path> = Arc::from(path);
self.watch_tasks.push(cx.spawn(async move |this, cx| {
let fs = this.update(cx, |this, _| this.fs.clone())?;
let fs = this.read_with(cx, |this, _| this.fs.clone())?;
let watched_path = path.clone();
let watcher = fs.watch(&watched_path, Duration::from_secs(1));
initial_scan(this.clone(), path, cx.clone()).await?;

View file

@ -1176,7 +1176,7 @@ mod tests {
scheduled_task_label: &str,
cx: &mut VisualTestContext,
) {
let scheduled_task = tasks_picker.update(cx, |tasks_picker, _| {
let scheduled_task = tasks_picker.read_with(cx, |tasks_picker, _| {
tasks_picker
.delegate
.candidates
@ -1220,14 +1220,14 @@ mod tests {
spawn_tasks: &Entity<Picker<TasksModalDelegate>>,
cx: &mut VisualTestContext,
) -> String {
spawn_tasks.update(cx, |spawn_tasks, cx| spawn_tasks.query(cx))
spawn_tasks.read_with(cx, |spawn_tasks, cx| spawn_tasks.query(cx))
}
fn task_names(
spawn_tasks: &Entity<Picker<TasksModalDelegate>>,
cx: &mut VisualTestContext,
) -> Vec<String> {
spawn_tasks.update(cx, |spawn_tasks, _| {
spawn_tasks.read_with(cx, |spawn_tasks, _| {
spawn_tasks
.delegate
.matches

View file

@ -300,9 +300,12 @@ pub fn task_contexts(
.unwrap_or_default();
let latest_selection = active_editor.as_ref().map(|active_editor| {
active_editor.update(cx, |editor, _| {
editor.selections.newest_anchor().head().text_anchor
})
active_editor
.read(cx)
.selections
.newest_anchor()
.head()
.text_anchor
});
let mut worktree_abs_paths = workspace
@ -412,7 +415,7 @@ mod tests {
)
.await;
let project = Project::test(fs, [path!("/dir").as_ref()], cx).await;
let worktree_store = project.update(cx, |project, _| project.worktree_store().clone());
let worktree_store = project.read_with(cx, |project, _| project.worktree_store().clone());
let rust_language = Arc::new(
Language::new(
LanguageConfig::default(),

View file

@ -702,7 +702,7 @@ impl TerminalPanel {
terminal_panel.pending_terminals_to_add += 1;
terminal_panel.active_pane.clone()
})?;
let project = workspace.update(cx, |workspace, _| workspace.project().clone())?;
let project = workspace.read_with(cx, |workspace, _| workspace.project().clone())?;
let window_handle = cx.window_handle();
let terminal = project
.update(cx, |project, cx| {
@ -754,7 +754,7 @@ impl TerminalPanel {
let width = self.width;
let Some(serialization_key) = self
.workspace
.update(cx, |workspace, _| {
.read_with(cx, |workspace, _| {
TerminalPanel::serialization_key(workspace)
})
.ok()
@ -972,7 +972,7 @@ pub fn new_terminal_pane(
if let Some(tab) = dragged_item.downcast_ref::<DraggedTab>() {
let is_current_pane = tab.pane == cx.entity();
let Some(can_drag_away) = split_closure_terminal_panel
.update(cx, |terminal_panel, _| {
.read_with(cx, |terminal_panel, _| {
let current_panes = terminal_panel.center.panes();
!current_panes.contains(&&tab.pane)
|| current_panes.len() > 1

View file

@ -389,11 +389,9 @@ impl TerminalView {
fn rerun_task(&mut self, _: &RerunTask, window: &mut Window, cx: &mut Context<Self>) {
let task = self
.terminal
.update(cx, |terminal, _| {
terminal
.task()
.map(|task| terminal_rerun_override(&task.id))
})
.read(cx)
.task()
.map(|task| terminal_rerun_override(&task.id))
.unwrap_or_default();
window.dispatch_action(Box::new(task), cx);
}

View file

@ -56,16 +56,16 @@ impl ActiveToolchain {
fn spawn_tracker_task(window: &mut Window, cx: &mut Context<Self>) -> Task<Option<()>> {
cx.spawn_in(window, async move |this, cx| {
let active_file = this
.update(cx, |this, _| {
.read_with(cx, |this, _| {
this.active_buffer
.as_ref()
.map(|(_, buffer, _)| buffer.clone())
})
.ok()
.flatten()?;
let workspace = this.update(cx, |this, _| this.workspace.clone()).ok()?;
let workspace = this.read_with(cx, |this, _| this.workspace.clone()).ok()?;
let language_name = active_file
.update(cx, |this, _| Some(this.language()?.name()))
.read_with(cx, |this, _| Some(this.language()?.name()))
.ok()
.flatten()?;
let term = workspace
@ -136,7 +136,7 @@ impl ActiveToolchain {
) -> Task<Option<Toolchain>> {
cx.spawn(async move |cx| {
let workspace_id = workspace
.update(cx, |this, _| this.database_id())
.read_with(cx, |this, _| this.database_id())
.ok()
.flatten()?;
let selected_toolchain = workspace
@ -156,7 +156,7 @@ impl ActiveToolchain {
Some(toolchain)
} else {
let project = workspace
.update(cx, |this, _| this.project().clone())
.read_with(cx, |this, _| this.project().clone())
.ok()?;
let toolchains = cx
.update(|_, cx| {

View file

@ -164,13 +164,13 @@ impl ToolchainSelectorDelegate {
let project = project.clone();
async move |this, cx| {
let term = project
.update(cx, |this, _| {
.read_with(cx, |this, _| {
Project::toolchain_term(this.languages().clone(), language_name.clone())
})
.ok()?
.await?;
let relative_path = this
.update(cx, |this, _| this.delegate.relative_path.clone())
.read_with(cx, |this, _| this.delegate.relative_path.clone())
.ok()?;
let placeholder_text = format!(
"Select a {} for `{}`…",
@ -257,7 +257,7 @@ impl PickerDelegate for ToolchainSelectorDelegate {
let toolchain = self.candidates.toolchains[string_match.candidate_id].clone();
if let Some(workspace_id) = self
.workspace
.update(cx, |this, _| this.database_id())
.read_with(cx, |this, _| this.database_id())
.ok()
.flatten()
{

View file

@ -1762,7 +1762,7 @@ impl Pane {
return Ok(true);
}
let Some(item_ix) = pane
.update(cx, |pane, _| pane.index_for_item(item))
.read_with(cx, |pane, _| pane.index_for_item(item))
.ok()
.flatten()
else {
@ -2017,7 +2017,8 @@ impl Pane {
let pane = cx.entity().clone();
window.defer(cx, move |window, cx| {
let Ok(status_bar) = workspace.update(cx, |workspace, _| workspace.status_bar.clone())
let Ok(status_bar) =
workspace.read_with(cx, |workspace, _| workspace.status_bar.clone())
else {
return;
};
@ -3760,7 +3761,7 @@ mod tests {
let project = Project::test(fs, None, cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
pane.update_in(cx, |pane, window, cx| {
assert!(
@ -3785,7 +3786,7 @@ mod tests {
let project = Project::test(fs, None, cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
for i in 0..7 {
add_labeled_item(&pane, format!("{}", i).as_str(), false, cx);
@ -3834,7 +3835,7 @@ mod tests {
let project = Project::test(fs, None, cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
// 1. Add with a destination index
// a. Add before the active item
@ -3917,7 +3918,7 @@ mod tests {
let project = Project::test(fs, None, cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
// 1. Add with a destination index
// 1a. Add before the active item
@ -3993,7 +3994,7 @@ mod tests {
let project = Project::test(fs, None, cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
// singleton view
pane.update_in(cx, |pane, window, cx| {
@ -4098,7 +4099,7 @@ mod tests {
let project = Project::test(fs, None, cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
add_labeled_item(&pane, "A", false, cx);
add_labeled_item(&pane, "B", false, cx);
@ -4191,7 +4192,7 @@ mod tests {
let project = Project::test(fs, None, cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
add_labeled_item(&pane, "A", false, cx);
add_labeled_item(&pane, "B", false, cx);
@ -4284,7 +4285,7 @@ mod tests {
let project = Project::test(fs, None, cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
add_labeled_item(&pane, "A", false, cx);
add_labeled_item(&pane, "B", false, cx);
@ -4377,7 +4378,7 @@ mod tests {
let project = Project::test(fs, None, cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
set_labeled_items(&pane, ["A", "B", "C*", "D", "E"], cx);
@ -4405,7 +4406,7 @@ mod tests {
let project = Project::test(fs, None, cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
add_labeled_item(&pane, "A", true, cx);
add_labeled_item(&pane, "B", false, cx);
@ -4437,7 +4438,7 @@ mod tests {
let project = Project::test(fs, None, cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
set_labeled_items(&pane, ["A", "B", "C*", "D", "E"], cx);
@ -4464,7 +4465,7 @@ mod tests {
let project = Project::test(fs, None, cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
set_labeled_items(&pane, ["A", "B", "C*", "D", "E"], cx);
@ -4491,7 +4492,7 @@ mod tests {
let project = Project::test(fs, None, cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
let item_a = add_labeled_item(&pane, "A", false, cx);
add_labeled_item(&pane, "B", false, cx);
@ -4596,7 +4597,7 @@ mod tests {
let project = Project::test(fs, None, cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
let a = cx.update(|_, cx| TestProjectItem::new_dirty(1, "A.txt", cx));
let b = cx.update(|_, cx| TestProjectItem::new_dirty(1, "B.txt", cx));
@ -4640,7 +4641,7 @@ mod tests {
let project = Project::test(fs, None, cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
let item_a = add_labeled_item(&pane, "A", false, cx);
add_labeled_item(&pane, "B", false, cx);
@ -4674,7 +4675,7 @@ mod tests {
cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx));
// Non-pinned tabs in same pane
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
add_labeled_item(&pane, "A", false, cx);
add_labeled_item(&pane, "B", false, cx);
add_labeled_item(&pane, "C", false, cx);
@ -4705,7 +4706,7 @@ mod tests {
cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx));
// No non-pinned tabs in same pane, non-pinned tabs in another pane
let pane1 = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane1 = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
let pane2 = workspace.update_in(cx, |workspace, window, cx| {
workspace.split_pane(pane1.clone(), SplitDirection::Right, window, cx)
});

View file

@ -410,7 +410,10 @@ impl SerializedPaneGroup {
.await
.log_err()?;
if pane.update(cx, |pane, _| pane.items_len() != 0).log_err()? {
if pane
.read_with(cx, |pane, _| pane.items_len() != 0)
.log_err()?
{
let pane = pane.upgrade()?;
Some((
Member::Pane(pane.clone()),

View file

@ -2519,7 +2519,7 @@ impl Workspace {
});
cx.spawn(async move |cx| {
let (worktree, path) = entry.await?;
let worktree_id = worktree.update(cx, |t, _| t.id())?;
let worktree_id = worktree.read_with(cx, |t, _| t.id())?;
Ok((
worktree,
ProjectPath {
@ -5147,7 +5147,7 @@ impl Workspace {
cx: &mut Context<Workspace>,
) -> Task<Result<Vec<Option<Box<dyn ItemHandle>>>>> {
cx.spawn_in(window, async move |workspace, cx| {
let project = workspace.update(cx, |workspace, _| workspace.project().clone())?;
let project = workspace.read_with(cx, |workspace, _| workspace.project().clone())?;
let mut center_group = None;
let mut center_items = None;
@ -6836,7 +6836,7 @@ pub fn create_and_open_local_file(
default_content: impl 'static + Send + FnOnce() -> Rope,
) -> Task<Result<Box<dyn ItemHandle>>> {
cx.spawn_in(window, async move |workspace, cx| {
let fs = workspace.update(cx, |workspace, _| workspace.app_state().fs.clone())?;
let fs = workspace.read_with(cx, |workspace, _| workspace.app_state().fs.clone())?;
if !fs.is_file(path).await {
fs.create_file(path, Default::default()).await?;
fs.save(path, &default_content(), Default::default())
@ -7647,7 +7647,7 @@ mod tests {
workspace.update_in(cx, |workspace, window, cx| {
workspace.add_item_to_active_pane(Box::new(item1.clone()), None, true, window, cx);
});
item1.update(cx, |item, _| assert_eq!(item.tab_detail.get(), Some(0)));
item1.read_with(cx, |item, _| assert_eq!(item.tab_detail.get(), Some(0)));
// Adding an item that creates ambiguity increases the level of detail on
// both tabs.
@ -7659,8 +7659,8 @@ mod tests {
workspace.update_in(cx, |workspace, window, cx| {
workspace.add_item_to_active_pane(Box::new(item2.clone()), None, true, window, cx);
});
item1.update(cx, |item, _| assert_eq!(item.tab_detail.get(), Some(1)));
item2.update(cx, |item, _| assert_eq!(item.tab_detail.get(), Some(1)));
item1.read_with(cx, |item, _| assert_eq!(item.tab_detail.get(), Some(1)));
item2.read_with(cx, |item, _| assert_eq!(item.tab_detail.get(), Some(1)));
// Adding an item that creates ambiguity increases the level of detail only
// on the ambiguous tabs. In this case, the ambiguity can't be resolved so
@ -7673,9 +7673,9 @@ mod tests {
workspace.update_in(cx, |workspace, window, cx| {
workspace.add_item_to_active_pane(Box::new(item3.clone()), None, true, window, cx);
});
item1.update(cx, |item, _| assert_eq!(item.tab_detail.get(), Some(1)));
item2.update(cx, |item, _| assert_eq!(item.tab_detail.get(), Some(3)));
item3.update(cx, |item, _| assert_eq!(item.tab_detail.get(), Some(3)));
item1.read_with(cx, |item, _| assert_eq!(item.tab_detail.get(), Some(1)));
item2.read_with(cx, |item, _| assert_eq!(item.tab_detail.get(), Some(3)));
item3.read_with(cx, |item, _| assert_eq!(item.tab_detail.get(), Some(3)));
}
#[gpui::test]
@ -7702,7 +7702,7 @@ mod tests {
let project = Project::test(fs, ["root1".as_ref()], cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project.clone(), window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
let worktree_id = project.update(cx, |project, cx| {
project.worktrees(cx).next().unwrap().read(cx).id()
});
@ -8099,7 +8099,7 @@ mod tests {
cx.executor().run_until_parked();
close.await.unwrap();
right_pane.update(cx, |pane, _| {
right_pane.read_with(cx, |pane, _| {
assert_eq!(pane.items_len(), 0);
});
}
@ -8112,7 +8112,7 @@ mod tests {
let project = Project::test(fs, [], cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
let item = cx.new(|cx| {
TestItem::new(cx).with_project_items(&[TestProjectItem::new(1, "1.txt", cx)])
@ -8134,12 +8134,12 @@ mod tests {
// Deactivating the window saves the file.
cx.deactivate_window();
item.update(cx, |item, _| assert_eq!(item.save_count, 1));
item.read_with(cx, |item, _| assert_eq!(item.save_count, 1));
// Re-activating the window doesn't save the file.
cx.update(|window, _| window.activate_window());
cx.executor().run_until_parked();
item.update(cx, |item, _| assert_eq!(item.save_count, 1));
item.read_with(cx, |item, _| assert_eq!(item.save_count, 1));
// Autosave on focus change.
item.update_in(cx, |item, window, cx| {
@ -8155,7 +8155,7 @@ mod tests {
// Blurring the item saves the file.
item.update_in(cx, |_, window, _| window.blur());
cx.executor().run_until_parked();
item.update(cx, |item, _| assert_eq!(item.save_count, 2));
item.read_with(cx, |item, _| assert_eq!(item.save_count, 2));
// Deactivating the window still saves the file.
item.update_in(cx, |item, window, cx| {
@ -8178,11 +8178,11 @@ mod tests {
// Delay hasn't fully expired, so the file is still dirty and unsaved.
cx.executor().advance_clock(Duration::from_millis(250));
item.update(cx, |item, _| assert_eq!(item.save_count, 3));
item.read_with(cx, |item, _| assert_eq!(item.save_count, 3));
// After delay expires, the file is saved.
cx.executor().advance_clock(Duration::from_millis(250));
item.update(cx, |item, _| assert_eq!(item.save_count, 4));
item.read_with(cx, |item, _| assert_eq!(item.save_count, 4));
// Autosave on focus change, ensuring closing the tab counts as such.
item.update(cx, |item, cx| {
@ -8203,7 +8203,7 @@ mod tests {
.await
.unwrap();
assert!(!cx.has_pending_prompt());
item.update(cx, |item, _| assert_eq!(item.save_count, 5));
item.read_with(cx, |item, _| assert_eq!(item.save_count, 5));
// Add the item again, ensuring autosave is prevented if the underlying file has been deleted.
workspace.update_in(cx, |workspace, window, cx| {
@ -8217,7 +8217,7 @@ mod tests {
window.blur();
});
cx.run_until_parked();
item.update(cx, |item, _| assert_eq!(item.save_count, 5));
item.read_with(cx, |item, _| assert_eq!(item.save_count, 5));
// Ensure autosave is prevented for deleted files also when closing the buffer.
let _close_items = pane.update_in(cx, |pane, window, cx| {
@ -8225,7 +8225,7 @@ mod tests {
});
cx.run_until_parked();
assert!(cx.has_pending_prompt());
item.update(cx, |item, _| assert_eq!(item.save_count, 5));
item.read_with(cx, |item, _| assert_eq!(item.save_count, 5));
}
#[gpui::test]
@ -8241,8 +8241,8 @@ mod tests {
let item = cx.new(|cx| {
TestItem::new(cx).with_project_items(&[TestProjectItem::new(1, "1.txt", cx)])
});
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let toolbar = pane.update(cx, |pane, _| pane.toolbar().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
let toolbar = pane.read_with(cx, |pane, _| pane.toolbar().clone());
let toolbar_notify_count = Rc::new(RefCell::new(0));
workspace.update_in(cx, |workspace, window, cx| {
@ -8254,7 +8254,7 @@ mod tests {
.detach();
});
pane.update(cx, |pane, _| {
pane.read_with(cx, |pane, _| {
assert!(!pane.can_navigate_backward());
assert!(!pane.can_navigate_forward());
});
@ -8266,7 +8266,7 @@ mod tests {
// Toolbar must be notified to re-render the navigation buttons
assert_eq!(*toolbar_notify_count.borrow(), 1);
pane.update(cx, |pane, _| {
pane.read_with(cx, |pane, _| {
assert!(pane.can_navigate_backward());
assert!(!pane.can_navigate_forward());
});
@ -8279,7 +8279,7 @@ mod tests {
.unwrap();
assert_eq!(*toolbar_notify_count.borrow(), 2);
pane.update(cx, |pane, _| {
pane.read_with(cx, |pane, _| {
assert!(!pane.can_navigate_backward());
assert!(pane.can_navigate_forward());
});
@ -8305,7 +8305,7 @@ mod tests {
panel
});
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
pane.update_in(cx, |pane, window, cx| {
let item = cx.new(TestItem::new);
pane.add_item(Box::new(item), true, true, None, window, cx);
@ -8871,7 +8871,7 @@ mod tests {
// Emitting a ZoomIn event shows the panel as zoomed.
panel_1.update(cx, |_, cx| cx.emit(PanelEvent::ZoomIn));
workspace.update(cx, |workspace, _| {
workspace.read_with(cx, |workspace, _| {
assert_eq!(workspace.zoomed, Some(panel_1.to_any().downgrade()));
assert_eq!(workspace.zoomed_position, Some(DockPosition::Left));
});
@ -8880,7 +8880,7 @@ mod tests {
panel_1.update_in(cx, |panel, window, cx| {
panel.set_position(DockPosition::Right, window, cx)
});
workspace.update(cx, |workspace, _| {
workspace.read_with(cx, |workspace, _| {
assert_eq!(workspace.zoomed, Some(panel_1.to_any().downgrade()));
assert_eq!(workspace.zoomed_position, Some(DockPosition::Right));
@ -8907,7 +8907,7 @@ mod tests {
// If focus is transferred to another view that's not a panel or another pane, we still show
// the panel as zoomed.
focus_other_view(cx);
workspace.update(cx, |workspace, _| {
workspace.read_with(cx, |workspace, _| {
assert_eq!(workspace.zoomed, Some(panel_1.to_any().downgrade()));
assert_eq!(workspace.zoomed_position, Some(DockPosition::Right));
});
@ -8916,7 +8916,7 @@ mod tests {
workspace.update_in(cx, |_workspace, window, cx| {
cx.focus_self(window);
});
workspace.update(cx, |workspace, _| {
workspace.read_with(cx, |workspace, _| {
assert_eq!(workspace.zoomed, None);
assert_eq!(workspace.zoomed_position, None);
});
@ -8924,21 +8924,21 @@ mod tests {
// If focus is transferred again to another view that's not a panel or a pane, we won't
// show the panel as zoomed because it wasn't zoomed before.
focus_other_view(cx);
workspace.update(cx, |workspace, _| {
workspace.read_with(cx, |workspace, _| {
assert_eq!(workspace.zoomed, None);
assert_eq!(workspace.zoomed_position, None);
});
// When the panel is activated, it is zoomed again.
cx.dispatch_action(ToggleRightDock);
workspace.update(cx, |workspace, _| {
workspace.read_with(cx, |workspace, _| {
assert_eq!(workspace.zoomed, Some(panel_1.to_any().downgrade()));
assert_eq!(workspace.zoomed_position, Some(DockPosition::Right));
});
// Emitting a ZoomOut event unzooms the panel.
panel_1.update(cx, |_, cx| cx.emit(PanelEvent::ZoomOut));
workspace.update(cx, |workspace, _| {
workspace.read_with(cx, |workspace, _| {
assert_eq!(workspace.zoomed, None);
assert_eq!(workspace.zoomed_position, None);
});
@ -8961,7 +8961,7 @@ mod tests {
let project = Project::test(fs, [], cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
let dirty_regular_buffer = cx.new(|cx| {
TestItem::new(cx)
@ -9109,7 +9109,7 @@ mod tests {
let project = Project::test(fs, [], cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
let dirty_regular_buffer = cx.new(|cx| {
TestItem::new(cx)
@ -9199,7 +9199,7 @@ mod tests {
let project = Project::test(fs, [], cx).await;
let (workspace, cx) =
cx.add_window_view(|window, cx| Workspace::test_new(project, window, cx));
let pane = workspace.update(cx, |workspace, _| workspace.active_pane().clone());
let pane = workspace.read_with(cx, |workspace, _| workspace.active_pane().clone());
let dirty_regular_buffer = cx.new(|cx| {
TestItem::new(cx)

View file

@ -880,7 +880,7 @@ impl Worktree {
.await
.map(CreatedEntry::Included),
None => {
let abs_path = this.update(cx, |worktree, _| {
let abs_path = this.read_with(cx, |worktree, _| {
worktree
.absolutize(&path)
.with_context(|| format!("absolutizing {path:?}"))
@ -2027,7 +2027,7 @@ impl LocalWorktree {
cx.spawn(async move |this, cx| {
refresh.recv().await;
log::trace!("refreshed entry {path:?} in {:?}", t0.elapsed());
let new_entry = this.update(cx, |this, _| {
let new_entry = this.read_with(cx, |this, _| {
this.entry_for_path(path)
.cloned()
.context("reading path after update")
@ -2274,7 +2274,7 @@ impl RemoteWorktree {
.await
.map(CreatedEntry::Included),
None => {
let abs_path = this.update(cx, |worktree, _| {
let abs_path = this.read_with(cx, |worktree, _| {
worktree
.absolutize(&new_path)
.with_context(|| format!("absolutizing {new_path:?}"))
@ -5082,7 +5082,7 @@ impl WorktreeModelHandle for Entity<Worktree> {
let file_name = "fs-event-sentinel";
let tree = self.clone();
let (fs, root_path) = self.update(cx, |tree, _| {
let (fs, root_path) = self.read_with(cx, |tree, _| {
let tree = tree.as_local().unwrap();
(tree.fs.clone(), tree.abs_path().clone())
});
@ -5094,7 +5094,7 @@ impl WorktreeModelHandle for Entity<Worktree> {
let mut events = cx.events(&tree);
while events.next().await.is_some() {
if tree.update(cx, |tree, _| tree.entry_for_path(file_name).is_some()) {
if tree.read_with(cx, |tree, _| tree.entry_for_path(file_name).is_some()) {
break;
}
}
@ -5103,7 +5103,7 @@ impl WorktreeModelHandle for Entity<Worktree> {
.await
.unwrap();
while events.next().await.is_some() {
if tree.update(cx, |tree, _| tree.entry_for_path(file_name).is_none()) {
if tree.read_with(cx, |tree, _| tree.entry_for_path(file_name).is_none()) {
break;
}
}
@ -5128,7 +5128,7 @@ impl WorktreeModelHandle for Entity<Worktree> {
let file_name = "fs-event-sentinel";
let tree = self.clone();
let (fs, root_path, mut git_dir_scan_id) = self.update(cx, |tree, _| {
let (fs, root_path, mut git_dir_scan_id) = self.read_with(cx, |tree, _| {
let tree = tree.as_local().unwrap();
let local_repo_entry = tree
.git_repositories

View file

@ -1535,10 +1535,10 @@ fn open_local_file(
cx.spawn_in(window, async move |workspace, cx| {
// Check if the file actually exists on disk (even if it's excluded from worktree)
let file_exists = {
let full_path =
worktree.update(cx, |tree, _| tree.abs_path().join(settings_relative_path))?;
let full_path = worktree
.read_with(cx, |tree, _| tree.abs_path().join(settings_relative_path))?;
let fs = project.update(cx, |project, _| project.fs().clone())?;
let fs = project.read_with(cx, |project, _| project.fs().clone())?;
let file_exists = fs
.metadata(&full_path)
.await
@ -1550,7 +1550,7 @@ fn open_local_file(
if !file_exists {
if let Some(dir_path) = settings_relative_path.parent() {
if worktree.update(cx, |tree, _| tree.entry_for_path(dir_path).is_none())? {
if worktree.read_with(cx, |tree, _| tree.entry_for_path(dir_path).is_none())? {
project
.update(cx, |project, cx| {
project.create_entry((tree_id, dir_path), true, cx)
@ -1560,7 +1560,7 @@ fn open_local_file(
}
}
if worktree.update(cx, |tree, _| {
if worktree.read_with(cx, |tree, _| {
tree.entry_for_path(settings_relative_path).is_none()
})? {
project