diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 575631b517..a63b8581d6 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -1903,6 +1903,30 @@ impl Editor { editor.update_lsp_data(false, Some(*buffer_id), window, cx); } } + project::Event::UnsavedBufferEdit(buffer) => { + let Some(workspace) = editor.workspace() else { + return; + }; + workspace.update(cx, |workspace, cx| { + Self::new_in_workspace_from_buffer( + workspace, + buffer.clone(), + window, + cx, + ).detach_and_prompt_err( + "Failed to open buffer", + window, + cx, + |e, _, _| match e.error_code() { + ErrorCode::RemoteUpgradeRequired => Some(format!( + "The remote instance of Zed does not support this yet. It must be upgraded to {}", + e.error_tag("required").unwrap_or("the latest version") + )), + _ => None, + }, + ); + }); + } _ => {} }, )); @@ -2584,6 +2608,23 @@ impl Editor { }) } + fn new_in_workspace_from_buffer( + workspace: &mut Workspace, + buffer: Entity, + window: &mut Window, + cx: &mut Context, + ) -> Task>> { + let project = workspace.project().clone(); + cx.spawn_in(window, async move |workspace, cx| { + workspace.update_in(cx, |workspace, window, cx| { + let editor = + cx.new(|cx| Editor::for_buffer(buffer, Some(project.clone()), window, cx)); + workspace.add_item_to_active_pane(Box::new(editor.clone()), None, true, window, cx); + editor + }) + }) + } + fn new_file_vertical( workspace: &mut Workspace, _: &workspace::NewFileSplitVertical, diff --git a/crates/project/src/lsp_store.rs b/crates/project/src/lsp_store.rs index 12505a6a03..e6ed9926c0 100644 --- a/crates/project/src/lsp_store.rs +++ b/crates/project/src/lsp_store.rs @@ -3555,6 +3555,7 @@ pub enum LspStoreEvent { edits: Vec<(lsp::Range, Snippet)>, most_recent_edit: clock::Lamport, }, + UnsavedBufferEdit(Entity), } #[derive(Clone, Debug, Serialize)] @@ -9210,15 +9211,24 @@ impl LspStore { .log_err() .flatten()?; - LocalLspStore::deserialize_workspace_edit( - this.upgrade()?, - edit, - false, - language_server.clone(), - cx, - ) - .await - .ok(); + if let Some(transaction) = + LocalLspStore::deserialize_workspace_edit( + this.upgrade()?, + edit, + false, + language_server.clone(), + cx, + ) + .await + .ok() + { + for (buffer, _) in transaction.0 { + this.update(cx, |_, cx| { + cx.emit(LspStoreEvent::UnsavedBufferEdit(buffer)); + }) + .ok(); + } + } Some(()) } }); diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index f07ee13866..2ed00cb172 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -326,6 +326,7 @@ pub enum Event { RefreshCodeLens, RevealInProjectPanel(ProjectEntryId), SnippetEdit(BufferId, Vec<(lsp::Range, Snippet)>), + UnsavedBufferEdit(Entity), ExpandedAllForEntry(WorktreeId, ProjectEntryId), AgentLocationChanged, } @@ -2985,6 +2986,9 @@ impl Project { cx.emit(Event::SnippetEdit(*buffer_id, edits.clone())) } } + LspStoreEvent::UnsavedBufferEdit(buffer) => { + cx.emit(Event::UnsavedBufferEdit(buffer.clone())); + } } }