Remove `UpgradeModelHandle` trait

Antonio Scandurra and Nathan Sobo created

Co-Authored-By: Nathan Sobo <nathan@zed.dev>

Change summary

crates/gpui/src/app.rs        | 174 +++++++++++-------------------------
crates/gpui/src/app/window.rs |  24 ----
crates/project/src/project.rs |   6 
3 files changed, 60 insertions(+), 144 deletions(-)

Detailed changes

crates/gpui/src/app.rs 🔗

@@ -142,23 +142,6 @@ pub trait UpdateModel {
     ) -> O;
 }
 
-pub trait UpgradeModelHandle {
-    fn upgrade_model_handle<T: Entity>(
-        &self,
-        handle: &WeakModelHandle<T>,
-    ) -> Option<ModelHandle<T>>;
-
-    fn model_handle_is_upgradable<T: Entity>(&self, handle: &WeakModelHandle<T>) -> bool;
-
-    fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle>;
-}
-
-// pub trait UpgradeViewHandle {
-//     fn upgrade_view_handle<T: View>(&self, handle: &WeakViewHandle<T>) -> Option<ViewHandle<T>>;
-
-//     fn upgrade_any_view_handle(&self, handle: &AnyWeakViewHandle) -> Option<AnyViewHandle>;
-// }
-
 pub trait ReadViewWith {
     fn read_view_with<V, T>(
         &self,
@@ -431,23 +414,6 @@ impl UpdateModel for AsyncAppContext {
     }
 }
 
-impl UpgradeModelHandle for AsyncAppContext {
-    fn upgrade_model_handle<T: Entity>(
-        &self,
-        handle: &WeakModelHandle<T>,
-    ) -> Option<ModelHandle<T>> {
-        self.0.borrow().upgrade_model_handle(handle)
-    }
-
-    fn model_handle_is_upgradable<T: Entity>(&self, handle: &WeakModelHandle<T>) -> bool {
-        self.0.borrow().model_handle_is_upgradable(handle)
-    }
-
-    fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle> {
-        self.0.borrow().upgrade_any_model_handle(handle)
-    }
-}
-
 impl ReadModelWith for AsyncAppContext {
     fn read_model_with<E: Entity, T>(
         &self,
@@ -1297,6 +1263,33 @@ impl AppContext {
         }
     }
 
+    fn upgrade_model_handle<T: Entity>(
+        &self,
+        handle: &WeakModelHandle<T>,
+    ) -> Option<ModelHandle<T>> {
+        if self.ref_counts.lock().is_entity_alive(handle.model_id) {
+            Some(ModelHandle::new(handle.model_id, &self.ref_counts))
+        } else {
+            None
+        }
+    }
+
+    fn model_handle_is_upgradable<T: Entity>(&self, handle: &WeakModelHandle<T>) -> bool {
+        self.ref_counts.lock().is_entity_alive(handle.model_id)
+    }
+
+    fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle> {
+        if self.ref_counts.lock().is_entity_alive(handle.model_id) {
+            Some(AnyModelHandle::new(
+                handle.model_id,
+                handle.model_type,
+                self.ref_counts.clone(),
+            ))
+        } else {
+            None
+        }
+    }
+
     pub fn add_window<V, F>(
         &mut self,
         window_options: WindowOptions,
@@ -2154,35 +2147,6 @@ impl UpdateModel for AppContext {
     }
 }
 
-impl UpgradeModelHandle for AppContext {
-    fn upgrade_model_handle<T: Entity>(
-        &self,
-        handle: &WeakModelHandle<T>,
-    ) -> Option<ModelHandle<T>> {
-        if self.ref_counts.lock().is_entity_alive(handle.model_id) {
-            Some(ModelHandle::new(handle.model_id, &self.ref_counts))
-        } else {
-            None
-        }
-    }
-
-    fn model_handle_is_upgradable<T: Entity>(&self, handle: &WeakModelHandle<T>) -> bool {
-        self.ref_counts.lock().is_entity_alive(handle.model_id)
-    }
-
-    fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle> {
-        if self.ref_counts.lock().is_entity_alive(handle.model_id) {
-            Some(AnyModelHandle::new(
-                handle.model_id,
-                handle.model_type,
-                self.ref_counts.clone(),
-            ))
-        } else {
-            None
-        }
-    }
-}
-
 #[derive(Debug)]
 pub enum ParentId {
     View(usize),
@@ -2868,6 +2832,16 @@ impl<M> AsMut<AppContext> for ModelContext<'_, M> {
     }
 }
 
+impl<M> BorrowAppContext for ModelContext<'_, M> {
+    fn read_with<T, F: FnOnce(&AppContext) -> T>(&self, f: F) -> T {
+        self.app.read_with(f)
+    }
+
+    fn update<T, F: FnOnce(&mut AppContext) -> T>(&mut self, f: F) -> T {
+        self.app.update(f)
+    }
+}
+
 impl<M> UpdateModel for ModelContext<'_, M> {
     fn update_model<T: Entity, V>(
         &mut self,
@@ -2878,23 +2852,6 @@ impl<M> UpdateModel for ModelContext<'_, M> {
     }
 }
 
-impl<M> UpgradeModelHandle for ModelContext<'_, M> {
-    fn upgrade_model_handle<T: Entity>(
-        &self,
-        handle: &WeakModelHandle<T>,
-    ) -> Option<ModelHandle<T>> {
-        self.app.upgrade_model_handle(handle)
-    }
-
-    fn model_handle_is_upgradable<T: Entity>(&self, handle: &WeakModelHandle<T>) -> bool {
-        self.app.model_handle_is_upgradable(handle)
-    }
-
-    fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle> {
-        self.app.upgrade_any_model_handle(handle)
-    }
-}
-
 impl<M> Deref for ModelContext<'_, M> {
     type Target = AppContext;
 
@@ -3450,23 +3407,6 @@ impl<V> BorrowAppContext for ViewContext<'_, '_, V> {
     }
 }
 
-impl<V> UpgradeModelHandle for ViewContext<'_, '_, V> {
-    fn upgrade_model_handle<T: Entity>(
-        &self,
-        handle: &WeakModelHandle<T>,
-    ) -> Option<ModelHandle<T>> {
-        self.window_context.upgrade_model_handle(handle)
-    }
-
-    fn model_handle_is_upgradable<T: Entity>(&self, handle: &WeakModelHandle<T>) -> bool {
-        self.window_context.model_handle_is_upgradable(handle)
-    }
-
-    fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle> {
-        self.window_context.upgrade_any_model_handle(handle)
-    }
-}
-
 impl<V: View> UpdateModel for ViewContext<'_, '_, V> {
     fn update_model<T: Entity, O>(
         &mut self,
@@ -3524,6 +3464,16 @@ impl<V: View> DerefMut for EventContext<'_, '_, '_, V> {
     }
 }
 
+impl<V: View> BorrowAppContext for EventContext<'_, '_, '_, V> {
+    fn read_with<T, F: FnOnce(&AppContext) -> T>(&self, f: F) -> T {
+        self.view_context.read_with(f)
+    }
+
+    fn update<T, F: FnOnce(&mut AppContext) -> T>(&mut self, f: F) -> T {
+        self.view_context.update(f)
+    }
+}
+
 impl<V: View> UpdateModel for EventContext<'_, '_, '_, V> {
     fn update_model<T: Entity, O>(
         &mut self,
@@ -3549,23 +3499,6 @@ impl<V: View> UpdateView for EventContext<'_, '_, '_, V> {
     }
 }
 
-impl<V: View> UpgradeModelHandle for EventContext<'_, '_, '_, V> {
-    fn upgrade_model_handle<T: Entity>(
-        &self,
-        handle: &WeakModelHandle<T>,
-    ) -> Option<ModelHandle<T>> {
-        self.view_context.upgrade_model_handle(handle)
-    }
-
-    fn model_handle_is_upgradable<T: Entity>(&self, handle: &WeakModelHandle<T>) -> bool {
-        self.view_context.model_handle_is_upgradable(handle)
-    }
-
-    fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle> {
-        self.view_context.upgrade_any_model_handle(handle)
-    }
-}
-
 pub(crate) enum Reference<'a, T> {
     Immutable(&'a T),
     Mutable(&'a mut T),
@@ -3808,12 +3741,12 @@ impl<T: Entity> WeakModelHandle<T> {
         self.model_id
     }
 
-    pub fn is_upgradable(&self, cx: &impl UpgradeModelHandle) -> bool {
-        cx.model_handle_is_upgradable(self)
+    pub fn is_upgradable(&self, cx: &impl BorrowAppContext) -> bool {
+        cx.read_with(|cx| cx.model_handle_is_upgradable(self))
     }
 
-    pub fn upgrade(&self, cx: &impl UpgradeModelHandle) -> Option<ModelHandle<T>> {
-        cx.upgrade_model_handle(self)
+    pub fn upgrade(&self, cx: &impl BorrowAppContext) -> Option<ModelHandle<T>> {
+        cx.read_with(|cx| cx.upgrade_model_handle(self))
     }
 }
 
@@ -4189,9 +4122,10 @@ pub struct AnyWeakModelHandle {
 }
 
 impl AnyWeakModelHandle {
-    pub fn upgrade(&self, cx: &impl UpgradeModelHandle) -> Option<AnyModelHandle> {
-        cx.upgrade_any_model_handle(self)
+    pub fn upgrade(&self, cx: &impl BorrowAppContext) -> Option<AnyModelHandle> {
+        cx.read_with(|cx| cx.upgrade_any_model_handle(self))
     }
+
     pub fn model_type(&self) -> TypeId {
         self.model_type
     }

crates/gpui/src/app/window.rs 🔗

@@ -13,10 +13,9 @@ use crate::{
     },
     text_layout::TextLayoutCache,
     util::post_inc,
-    Action, AnyModelHandle, AnyView, AnyViewHandle, AnyWeakModelHandle, AppContext,
-    BorrowAppContext, Effect, Element, Entity, Handle, ModelContext, ModelHandle, MouseRegion,
-    MouseRegionId, ParentId, SceneBuilder, Subscription, UpdateModel, UpdateView,
-    UpgradeModelHandle, View, ViewContext, ViewHandle, WeakModelHandle, WindowInvalidation,
+    Action, AnyView, AnyViewHandle, AppContext, BorrowAppContext, Effect, Element, Entity, Handle,
+    ModelContext, ModelHandle, MouseRegion, MouseRegionId, ParentId, SceneBuilder, Subscription,
+    UpdateModel, UpdateView, View, ViewContext, ViewHandle, WindowInvalidation,
 };
 use anyhow::{anyhow, bail, Result};
 use collections::{HashMap, HashSet};
@@ -176,23 +175,6 @@ impl UpdateView for WindowContext<'_> {
     }
 }
 
-impl UpgradeModelHandle for WindowContext<'_> {
-    fn upgrade_model_handle<T: Entity>(
-        &self,
-        handle: &WeakModelHandle<T>,
-    ) -> Option<ModelHandle<T>> {
-        self.app_context.upgrade_model_handle(handle)
-    }
-
-    fn model_handle_is_upgradable<T: Entity>(&self, handle: &WeakModelHandle<T>) -> bool {
-        self.app_context.model_handle_is_upgradable(handle)
-    }
-
-    fn upgrade_any_model_handle(&self, handle: &AnyWeakModelHandle) -> Option<AnyModelHandle> {
-        self.app_context.upgrade_any_model_handle(handle)
-    }
-}
-
 impl<'a> WindowContext<'a> {
     pub fn mutable(
         app_context: &'a mut AppContext,

crates/project/src/project.rs 🔗

@@ -19,8 +19,8 @@ use futures::{
     AsyncWriteExt, Future, FutureExt, StreamExt, TryFutureExt,
 };
 use gpui::{
-    AnyModelHandle, AppContext, AsyncAppContext, Entity, ModelContext, ModelHandle, Task,
-    UpgradeModelHandle, WeakModelHandle,
+    AnyModelHandle, AppContext, AsyncAppContext, BorrowAppContext, Entity, ModelContext,
+    ModelHandle, Task, WeakModelHandle,
 };
 use language::{
     point_to_lsp,
@@ -6356,7 +6356,7 @@ impl WorktreeHandle {
 }
 
 impl OpenBuffer {
-    pub fn upgrade(&self, cx: &impl UpgradeModelHandle) -> Option<ModelHandle<Buffer>> {
+    pub fn upgrade(&self, cx: &impl BorrowAppContext) -> Option<ModelHandle<Buffer>> {
         match self {
             OpenBuffer::Strong(handle) => Some(handle.clone()),
             OpenBuffer::Weak(handle) => handle.upgrade(cx),