Merge pull request #2402 from zed-industries/fix-panics

Mikayla Maki created

Fix panic in pane.rs

Change summary

Cargo.lock                    |  1 -
crates/copilot/Cargo.toml     |  1 -
crates/copilot/src/copilot.rs | 15 ++++++++-------
crates/copilot/src/request.rs |  2 +-
crates/workspace/src/pane.rs  | 17 +++++++++++++++++
5 files changed, 26 insertions(+), 10 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -1358,7 +1358,6 @@ dependencies = [
  "smol",
  "theme",
  "util",
- "workspace",
 ]
 
 [[package]]

crates/copilot/Cargo.toml 🔗

@@ -47,4 +47,3 @@ lsp = { path = "../lsp", features = ["test-support"] }
 rpc = { path = "../rpc", features = ["test-support"] }
 settings = { path = "../settings", features = ["test-support"] }
 util = { path = "../util", features = ["test-support"] }
-workspace = { path = "../workspace", features = ["test-support"] }

crates/copilot/src/copilot.rs 🔗

@@ -378,13 +378,6 @@ impl Copilot {
                     cx.clone(),
                 )?;
 
-                let server = server.initialize(Default::default()).await?;
-                let status = server
-                    .request::<request::CheckStatus>(request::CheckStatusParams {
-                        local_checks_only: false,
-                    })
-                    .await?;
-
                 server
                     .on_notification::<LogMessage, _>(|params, _cx| {
                         match params.level {
@@ -405,6 +398,14 @@ impl Copilot {
                     )
                     .detach();
 
+                let server = server.initialize(Default::default()).await?;
+
+                let status = server
+                    .request::<request::CheckStatus>(request::CheckStatusParams {
+                        local_checks_only: false,
+                    })
+                    .await?;
+
                 server
                     .request::<request::SetEditorInfo>(request::SetEditorInfoParams {
                         editor_info: request::EditorInfo {

crates/copilot/src/request.rs 🔗

@@ -143,8 +143,8 @@ pub enum LogMessage {}
 #[derive(Debug, Serialize, Deserialize)]
 #[serde(rename_all = "camelCase")]
 pub struct LogMessageParams {
-    pub message: String,
     pub level: u8,
+    pub message: String,
     pub metadata_str: String,
     pub extra: Vec<String>,
 }

crates/workspace/src/pane.rs 🔗

@@ -787,6 +787,10 @@ impl Pane {
     ) -> Option<Task<Result<()>>> {
         let pane_handle = workspace.active_pane().clone();
         let pane = pane_handle.read(cx);
+
+        if pane.items.is_empty() {
+            return None;
+        }
         let active_item_id = pane.items[pane.active_item_index].id();
 
         let task = Self::close_item_by_id(workspace, pane_handle, active_item_id, cx);
@@ -2136,6 +2140,19 @@ mod tests {
     use gpui::{executor::Deterministic, TestAppContext};
     use project::FakeFs;
 
+    #[gpui::test]
+    async fn test_remove_active_empty(cx: &mut TestAppContext) {
+        Settings::test_async(cx);
+        let fs = FakeFs::new(cx.background());
+
+        let project = Project::test(fs, None, cx).await;
+        let (_, workspace) = cx.add_window(|cx| Workspace::test_new(project.clone(), cx));
+
+        workspace.update(cx, |workspace, cx| {
+            assert!(Pane::close_active_item(workspace, &CloseActiveItem, cx).is_none())
+        });
+    }
+
     #[gpui::test]
     async fn test_add_item_with_new_item(cx: &mut TestAppContext) {
         cx.foreground().forbid_parking();