From b687aec9d9f79ae7428fc2c7cc0a48d53bb9652e Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 8 Mar 2023 17:02:12 +0100 Subject: [PATCH] Avoid saving buffer if it's neither dirty nor in conflict However, keep emitting `Saved` events so that the language server is notified and can perform tasks related to saving (e.g., running `cargo check` in the case of rust-analyzer). --- crates/project/src/project.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 2ebea8d07d..f93de8e1d8 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -1434,7 +1434,19 @@ impl Project { let worktree = file.worktree.clone(); let path = file.path.clone(); worktree.update(cx, |worktree, cx| match worktree { - Worktree::Local(worktree) => worktree.save_buffer(buffer, path, false, cx), + Worktree::Local(worktree) => { + if buffer.read(cx).is_dirty() || buffer.read(cx).has_conflict() { + worktree.save_buffer(buffer, path, false, cx) + } else { + buffer.update(cx, |buffer, cx| { + let version = buffer.saved_version().clone(); + let fingerprint = buffer.saved_version_fingerprint(); + let mtime = buffer.saved_mtime(); + buffer.did_save(version.clone(), fingerprint, mtime, cx); + Task::ready(Ok((version, fingerprint, mtime))) + }) + } + } Worktree::Remote(worktree) => worktree.save_buffer(buffer, cx), }) }