Don't return channels that were released in `ChannelList::get_channel`

Antonio Scandurra created

Change summary

zed/src/channel.rs | 29 ++++++++++-------------------
1 file changed, 10 insertions(+), 19 deletions(-)

Detailed changes

zed/src/channel.rs 🔗

@@ -10,7 +10,7 @@ use gpui::{
 };
 use postage::prelude::Stream;
 use std::{
-    collections::{hash_map, HashMap, HashSet},
+    collections::{HashMap, HashSet},
     ops::Range,
     sync::Arc,
 };
@@ -139,25 +139,16 @@ impl ChannelList {
         id: u64,
         cx: &mut MutableAppContext,
     ) -> Option<ModelHandle<Channel>> {
-        match self.channels.entry(id) {
-            hash_map::Entry::Occupied(entry) => entry.get().upgrade(cx),
-            hash_map::Entry::Vacant(entry) => {
-                if let Some(details) = self
-                    .available_channels
-                    .as_ref()
-                    .and_then(|channels| channels.iter().find(|details| details.id == id))
-                {
-                    let user_store = self.user_store.clone();
-                    let rpc = self.rpc.clone();
-                    let channel =
-                        cx.add_model(|cx| Channel::new(details.clone(), user_store, rpc, cx));
-                    entry.insert(channel.downgrade());
-                    Some(channel)
-                } else {
-                    None
-                }
-            }
+        if let Some(channel) = self.channels.get(&id).and_then(|c| c.upgrade(cx)) {
+            return Some(channel);
         }
+
+        let channels = self.available_channels.as_ref()?;
+        let details = channels.iter().find(|details| details.id == id)?.clone();
+        let channel =
+            cx.add_model(|cx| Channel::new(details, self.user_store.clone(), self.rpc.clone(), cx));
+        self.channels.insert(id, channel.downgrade());
+        Some(channel)
     }
 }