From eebce28b32fa3e3bafae779bed3895ba9fc9f865 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 17 Feb 2023 12:38:04 -0800 Subject: [PATCH] Respect UpdateBufferFile messages on guest buffers without file Co-authored-by: Nathan Sobo --- crates/collab/src/tests/integration_tests.rs | 27 ++++++++++++ crates/language/src/buffer.rs | 45 ++++++++++---------- 2 files changed, 49 insertions(+), 23 deletions(-) diff --git a/crates/collab/src/tests/integration_tests.rs b/crates/collab/src/tests/integration_tests.rs index ff9872f31f..fd67dad2e5 100644 --- a/crates/collab/src/tests/integration_tests.rs +++ b/crates/collab/src/tests/integration_tests.rs @@ -2313,6 +2313,33 @@ async fn test_propagate_saves_and_fs_changes( assert_eq!(buffer.file().unwrap().path().to_str(), Some("file1.js")); assert_eq!(&*buffer.language().unwrap().name(), "JavaScript"); }); + + let new_buffer_a = project_a + .update(cx_a, |p, cx| p.create_buffer("", None, cx)) + .unwrap(); + let new_buffer_id = new_buffer_a.read_with(cx_a, |buffer, _| buffer.remote_id()); + let new_buffer_b = project_b + .update(cx_b, |p, cx| p.open_buffer_by_id(new_buffer_id, cx)) + .await + .unwrap(); + new_buffer_b.read_with(cx_b, |buffer, _| { + assert!(buffer.file().is_none()); + }); + + project_a + .update(cx_a, |project, cx| { + project.save_buffer_as(new_buffer_a, "/a/file3.rs".into(), cx) + }) + .await + .unwrap(); + + deterministic.run_until_parked(); + new_buffer_b.read_with(cx_b, |buffer, _| { + assert_eq!( + buffer.file().unwrap().path().as_ref(), + Path::new("file3.rs") + ); + }); } #[gpui::test(iterations = 10)] diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index f073fc4760..c59ec89155 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -661,36 +661,35 @@ impl Buffer { new_file: Arc, cx: &mut ModelContext, ) -> Task<()> { - let old_file = if let Some(file) = self.file.as_ref() { - file - } else { - return Task::ready(()); - }; let mut file_changed = false; let mut task = Task::ready(()); - if new_file.path() != old_file.path() { - file_changed = true; - } - - if new_file.is_deleted() { - if !old_file.is_deleted() { + if let Some(old_file) = self.file.as_ref() { + if new_file.path() != old_file.path() { file_changed = true; - if !self.is_dirty() { - cx.emit(Event::DirtyChanged); + } + + if new_file.is_deleted() { + if !old_file.is_deleted() { + file_changed = true; + if !self.is_dirty() { + cx.emit(Event::DirtyChanged); + } + } + } else { + let new_mtime = new_file.mtime(); + if new_mtime != old_file.mtime() { + file_changed = true; + + if !self.is_dirty() { + let reload = self.reload(cx).log_err().map(drop); + task = cx.foreground().spawn(reload); + } } } } else { - let new_mtime = new_file.mtime(); - if new_mtime != old_file.mtime() { - file_changed = true; - - if !self.is_dirty() { - let reload = self.reload(cx).log_err().map(drop); - task = cx.foreground().spawn(reload); - } - } - } + file_changed = true; + }; if file_changed { self.file_update_count += 1;