From 6857989f6f5c399857cddd54598eb2c8cb427e26 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Wed, 9 Dec 2020 17:29:34 +0100 Subject: [PATCH] Fix "no value set for FileTextQuery(FileId(..))" --- crates/rust-analyzer/src/cli/load_cargo.rs | 2 +- crates/rust-analyzer/src/main_loop.rs | 16 +++++++++++++--- crates/vfs/src/lib.rs | 9 +++++---- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/crates/rust-analyzer/src/cli/load_cargo.rs b/crates/rust-analyzer/src/cli/load_cargo.rs index d51f4a93ad..e5ab6c73bb 100644 --- a/crates/rust-analyzer/src/cli/load_cargo.rs +++ b/crates/rust-analyzer/src/cli/load_cargo.rs @@ -73,7 +73,7 @@ fn load( } vfs::loader::Message::Loaded { files } => { for (path, contents) in files { - vfs.set_file_contents(path.into(), contents) + vfs.set_file_contents(path.into(), contents); } } } diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index 95be2ebd39..d7f8374af7 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs @@ -255,7 +255,7 @@ impl GlobalState { for (path, contents) in files { let path = VfsPath::from(path); if !self.mem_docs.contains_key(&path) { - vfs.set_file_contents(path, contents) + vfs.set_file_contents(path, contents); } } } @@ -503,11 +503,21 @@ impl GlobalState { { log::error!("duplicate DidOpenTextDocument: {}", path) } - this.vfs + let changed = this + .vfs .write() .0 .set_file_contents(path, Some(params.text_document.text.into_bytes())); - this.maybe_update_diagnostics(); + + // If the VFS contents are unchanged, update diagnostics, since `handle_event` + // won't see any changes. This avoids missing diagnostics when opening a file. + // + // If the file *was* changed, `handle_event` will already recompute and send + // diagnostics. We can't do it here, since the *current* file contents might be + // unset in salsa, since the VFS change hasn't been applied to the database yet. + if !changed { + this.maybe_update_diagnostics(); + } } Ok(()) })? diff --git a/crates/vfs/src/lib.rs b/crates/vfs/src/lib.rs index cdf6f1fd02..a2c6a34000 100644 --- a/crates/vfs/src/lib.rs +++ b/crates/vfs/src/lib.rs @@ -99,18 +99,19 @@ impl Vfs { (file_id, path) }) } - pub fn set_file_contents(&mut self, path: VfsPath, contents: Option>) { + pub fn set_file_contents(&mut self, path: VfsPath, contents: Option>) -> bool { let file_id = self.alloc_file_id(path); let change_kind = match (&self.get(file_id), &contents) { - (None, None) => return, + (None, None) => return false, (None, Some(_)) => ChangeKind::Create, (Some(_), None) => ChangeKind::Delete, - (Some(old), Some(new)) if old == new => return, + (Some(old), Some(new)) if old == new => return false, (Some(_), Some(_)) => ChangeKind::Modify, }; *self.get_mut(file_id) = contents; - self.changes.push(ChangedFile { file_id, change_kind }) + self.changes.push(ChangedFile { file_id, change_kind }); + true } pub fn has_changes(&self) -> bool { !self.changes.is_empty()