diff options
-rw-r--r-- | crates/rust-analyzer/src/document.rs | 16 | ||||
-rw-r--r-- | crates/rust-analyzer/src/global_state.rs | 7 | ||||
-rw-r--r-- | crates/rust-analyzer/src/lib.rs | 1 | ||||
-rw-r--r-- | crates/rust-analyzer/src/main_loop.rs | 9 |
4 files changed, 26 insertions, 7 deletions
diff --git a/crates/rust-analyzer/src/document.rs b/crates/rust-analyzer/src/document.rs new file mode 100644 index 000000000..43219e633 --- /dev/null +++ b/crates/rust-analyzer/src/document.rs | |||
@@ -0,0 +1,16 @@ | |||
1 | //! In-memory document information. | ||
2 | |||
3 | /// Information about a document that the Language Client | ||
4 | // knows about. | ||
5 | // Its lifetime is driven by the textDocument/didOpen and textDocument/didClose | ||
6 | // client notifications. | ||
7 | #[derive(Debug, Clone)] | ||
8 | pub(crate) struct DocumentData { | ||
9 | pub version: Option<i64>, | ||
10 | } | ||
11 | |||
12 | impl DocumentData { | ||
13 | pub fn new(version: i64) -> Self { | ||
14 | DocumentData { version: Some(version) } | ||
15 | } | ||
16 | } | ||
diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs index 80937dbc4..b2d65a6d1 100644 --- a/crates/rust-analyzer/src/global_state.rs +++ b/crates/rust-analyzer/src/global_state.rs | |||
@@ -17,6 +17,7 @@ use rustc_hash::FxHashMap; | |||
17 | use crate::{ | 17 | use crate::{ |
18 | config::Config, | 18 | config::Config, |
19 | diagnostics::{CheckFixes, DiagnosticCollection}, | 19 | diagnostics::{CheckFixes, DiagnosticCollection}, |
20 | document::DocumentData, | ||
20 | from_proto, | 21 | from_proto, |
21 | line_endings::LineEndings, | 22 | line_endings::LineEndings, |
22 | main_loop::Task, | 23 | main_loop::Task, |
@@ -69,7 +70,7 @@ pub(crate) struct GlobalState { | |||
69 | pub(crate) config: Config, | 70 | pub(crate) config: Config, |
70 | pub(crate) analysis_host: AnalysisHost, | 71 | pub(crate) analysis_host: AnalysisHost, |
71 | pub(crate) diagnostics: DiagnosticCollection, | 72 | pub(crate) diagnostics: DiagnosticCollection, |
72 | pub(crate) mem_docs: FxHashMap<VfsPath, Option<i64>>, | 73 | pub(crate) mem_docs: FxHashMap<VfsPath, DocumentData>, |
73 | pub(crate) vfs: Arc<RwLock<(vfs::Vfs, FxHashMap<FileId, LineEndings>)>>, | 74 | pub(crate) vfs: Arc<RwLock<(vfs::Vfs, FxHashMap<FileId, LineEndings>)>>, |
74 | pub(crate) status: Status, | 75 | pub(crate) status: Status, |
75 | pub(crate) source_root_config: SourceRootConfig, | 76 | pub(crate) source_root_config: SourceRootConfig, |
@@ -84,7 +85,7 @@ pub(crate) struct GlobalStateSnapshot { | |||
84 | pub(crate) analysis: Analysis, | 85 | pub(crate) analysis: Analysis, |
85 | pub(crate) check_fixes: CheckFixes, | 86 | pub(crate) check_fixes: CheckFixes, |
86 | pub(crate) latest_requests: Arc<RwLock<LatestRequests>>, | 87 | pub(crate) latest_requests: Arc<RwLock<LatestRequests>>, |
87 | mem_docs: FxHashMap<VfsPath, Option<i64>>, | 88 | mem_docs: FxHashMap<VfsPath, DocumentData>, |
88 | vfs: Arc<RwLock<(vfs::Vfs, FxHashMap<FileId, LineEndings>)>>, | 89 | vfs: Arc<RwLock<(vfs::Vfs, FxHashMap<FileId, LineEndings>)>>, |
89 | pub(crate) workspaces: Arc<Vec<ProjectWorkspace>>, | 90 | pub(crate) workspaces: Arc<Vec<ProjectWorkspace>>, |
90 | } | 91 | } |
@@ -259,7 +260,7 @@ impl GlobalStateSnapshot { | |||
259 | 260 | ||
260 | pub(crate) fn url_file_version(&self, url: &Url) -> Option<i64> { | 261 | pub(crate) fn url_file_version(&self, url: &Url) -> Option<i64> { |
261 | let path = from_proto::vfs_path(&url).ok()?; | 262 | let path = from_proto::vfs_path(&url).ok()?; |
262 | self.mem_docs.get(&path).copied()? | 263 | self.mem_docs.get(&path)?.version |
263 | } | 264 | } |
264 | 265 | ||
265 | pub(crate) fn anchored_path(&self, file_id: FileId, path: &str) -> Url { | 266 | pub(crate) fn anchored_path(&self, file_id: FileId, path: &str) -> Url { |
diff --git a/crates/rust-analyzer/src/lib.rs b/crates/rust-analyzer/src/lib.rs index 369830973..c4284556e 100644 --- a/crates/rust-analyzer/src/lib.rs +++ b/crates/rust-analyzer/src/lib.rs | |||
@@ -33,6 +33,7 @@ mod line_endings; | |||
33 | mod request_metrics; | 33 | mod request_metrics; |
34 | mod lsp_utils; | 34 | mod lsp_utils; |
35 | mod thread_pool; | 35 | mod thread_pool; |
36 | mod document; | ||
36 | pub mod lsp_ext; | 37 | pub mod lsp_ext; |
37 | pub mod config; | 38 | pub mod config; |
38 | 39 | ||
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index e95d4157c..51626fcd5 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs | |||
@@ -15,6 +15,7 @@ use ra_prof::profile; | |||
15 | use crate::{ | 15 | use crate::{ |
16 | config::Config, | 16 | config::Config, |
17 | dispatch::{NotificationDispatcher, RequestDispatcher}, | 17 | dispatch::{NotificationDispatcher, RequestDispatcher}, |
18 | document::DocumentData, | ||
18 | from_proto, | 19 | from_proto, |
19 | global_state::{file_id_to_url, url_to_file_id, GlobalState, Status}, | 20 | global_state::{file_id_to_url, url_to_file_id, GlobalState, Status}, |
20 | handlers, lsp_ext, | 21 | handlers, lsp_ext, |
@@ -311,7 +312,7 @@ impl GlobalState { | |||
311 | let url = file_id_to_url(&self.vfs.read().0, file_id); | 312 | let url = file_id_to_url(&self.vfs.read().0, file_id); |
312 | let diagnostics = self.diagnostics.diagnostics_for(file_id).cloned().collect(); | 313 | let diagnostics = self.diagnostics.diagnostics_for(file_id).cloned().collect(); |
313 | let version = from_proto::vfs_path(&url) | 314 | let version = from_proto::vfs_path(&url) |
314 | .map(|path| self.mem_docs.get(&path).copied().flatten()) | 315 | .map(|path| self.mem_docs.get(&path)?.version) |
315 | .unwrap_or_default(); | 316 | .unwrap_or_default(); |
316 | 317 | ||
317 | self.send_notification::<lsp_types::notification::PublishDiagnostics>( | 318 | self.send_notification::<lsp_types::notification::PublishDiagnostics>( |
@@ -406,7 +407,7 @@ impl GlobalState { | |||
406 | if let Ok(path) = from_proto::vfs_path(¶ms.text_document.uri) { | 407 | if let Ok(path) = from_proto::vfs_path(¶ms.text_document.uri) { |
407 | if this | 408 | if this |
408 | .mem_docs | 409 | .mem_docs |
409 | .insert(path.clone(), Some(params.text_document.version)) | 410 | .insert(path.clone(), DocumentData::new(params.text_document.version)) |
410 | .is_some() | 411 | .is_some() |
411 | { | 412 | { |
412 | log::error!("duplicate DidOpenTextDocument: {}", path) | 413 | log::error!("duplicate DidOpenTextDocument: {}", path) |
@@ -428,7 +429,7 @@ impl GlobalState { | |||
428 | 429 | ||
429 | // The version passed in DidChangeTextDocument is the version after all edits are applied | 430 | // The version passed in DidChangeTextDocument is the version after all edits are applied |
430 | // so we should apply it before the vfs is notified. | 431 | // so we should apply it before the vfs is notified. |
431 | *doc = params.text_document.version; | 432 | doc.version = params.text_document.version; |
432 | 433 | ||
433 | vfs.set_file_contents(path.clone(), Some(text.into_bytes())); | 434 | vfs.set_file_contents(path.clone(), Some(text.into_bytes())); |
434 | } | 435 | } |
@@ -438,7 +439,7 @@ impl GlobalState { | |||
438 | let mut version = None; | 439 | let mut version = None; |
439 | if let Ok(path) = from_proto::vfs_path(¶ms.text_document.uri) { | 440 | if let Ok(path) = from_proto::vfs_path(¶ms.text_document.uri) { |
440 | match this.mem_docs.remove(&path) { | 441 | match this.mem_docs.remove(&path) { |
441 | Some(entry) => version = entry, | 442 | Some(doc) => version = doc.version, |
442 | None => log::error!("orphan DidCloseTextDocument: {}", path), | 443 | None => log::error!("orphan DidCloseTextDocument: {}", path), |
443 | } | 444 | } |
444 | 445 | ||