From 48da2d4c16a05bf0559c864d2b3f1b832d1fec85 Mon Sep 17 00:00:00 2001 From: kjeremy Date: Fri, 24 Jul 2020 09:01:48 -0400 Subject: Add DocumentData to represent in-memory document with LSP info --- crates/rust-analyzer/src/document.rs | 16 ++++++++++++++++ crates/rust-analyzer/src/global_state.rs | 7 ++++--- crates/rust-analyzer/src/lib.rs | 1 + crates/rust-analyzer/src/main_loop.rs | 9 +++++---- 4 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 crates/rust-analyzer/src/document.rs 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 @@ +//! In-memory document information. + +/// Information about a document that the Language Client +// knows about. +// Its lifetime is driven by the textDocument/didOpen and textDocument/didClose +// client notifications. +#[derive(Debug, Clone)] +pub(crate) struct DocumentData { + pub version: Option, +} + +impl DocumentData { + pub fn new(version: i64) -> Self { + DocumentData { version: Some(version) } + } +} 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; use crate::{ config::Config, diagnostics::{CheckFixes, DiagnosticCollection}, + document::DocumentData, from_proto, line_endings::LineEndings, main_loop::Task, @@ -69,7 +70,7 @@ pub(crate) struct GlobalState { pub(crate) config: Config, pub(crate) analysis_host: AnalysisHost, pub(crate) diagnostics: DiagnosticCollection, - pub(crate) mem_docs: FxHashMap>, + pub(crate) mem_docs: FxHashMap, pub(crate) vfs: Arc)>>, pub(crate) status: Status, pub(crate) source_root_config: SourceRootConfig, @@ -84,7 +85,7 @@ pub(crate) struct GlobalStateSnapshot { pub(crate) analysis: Analysis, pub(crate) check_fixes: CheckFixes, pub(crate) latest_requests: Arc>, - mem_docs: FxHashMap>, + mem_docs: FxHashMap, vfs: Arc)>>, pub(crate) workspaces: Arc>, } @@ -259,7 +260,7 @@ impl GlobalStateSnapshot { pub(crate) fn url_file_version(&self, url: &Url) -> Option { let path = from_proto::vfs_path(&url).ok()?; - self.mem_docs.get(&path).copied()? + self.mem_docs.get(&path)?.version } 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; mod request_metrics; mod lsp_utils; mod thread_pool; +mod document; pub mod lsp_ext; pub mod config; 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; use crate::{ config::Config, dispatch::{NotificationDispatcher, RequestDispatcher}, + document::DocumentData, from_proto, global_state::{file_id_to_url, url_to_file_id, GlobalState, Status}, handlers, lsp_ext, @@ -311,7 +312,7 @@ impl GlobalState { let url = file_id_to_url(&self.vfs.read().0, file_id); let diagnostics = self.diagnostics.diagnostics_for(file_id).cloned().collect(); let version = from_proto::vfs_path(&url) - .map(|path| self.mem_docs.get(&path).copied().flatten()) + .map(|path| self.mem_docs.get(&path)?.version) .unwrap_or_default(); self.send_notification::( @@ -406,7 +407,7 @@ impl GlobalState { if let Ok(path) = from_proto::vfs_path(¶ms.text_document.uri) { if this .mem_docs - .insert(path.clone(), Some(params.text_document.version)) + .insert(path.clone(), DocumentData::new(params.text_document.version)) .is_some() { log::error!("duplicate DidOpenTextDocument: {}", path) @@ -428,7 +429,7 @@ impl GlobalState { // The version passed in DidChangeTextDocument is the version after all edits are applied // so we should apply it before the vfs is notified. - *doc = params.text_document.version; + doc.version = params.text_document.version; vfs.set_file_contents(path.clone(), Some(text.into_bytes())); } @@ -438,7 +439,7 @@ impl GlobalState { let mut version = None; if let Ok(path) = from_proto::vfs_path(¶ms.text_document.uri) { match this.mem_docs.remove(&path) { - Some(entry) => version = entry, + Some(doc) => version = doc.version, None => log::error!("orphan DidCloseTextDocument: {}", path), } -- cgit v1.2.3